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

Artifact d66970749a9d5a5b04950c9a26d6d0ea1320f91b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 28 53 29 2d 3e 7a 53 65 6c  2-2,"",(S)->zSel
02e0: 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20 20 20 20  Name,(S)),\.    
02f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0300: 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66  tf X.#else.# def
0310: 69 6e 65 20 53 45 4c 45 43 54 54 52 41 43 45 28  ine SELECTTRACE(
0320: 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64 69 66 0a  K,P,S,X).#endif.
0330: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0340: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0350: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0370: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0380: 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  ** how to proces
0390: 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  s the DISTINCT k
03a0: 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c  eyword, to simpl
03b0: 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61 74  ify passing that
03c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
03d0: 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49  into the selectI
03e0: 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69  nnerLoop() routi
03f0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
0400: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0410: 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73  x DistinctCtx;.s
0420: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0430: 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b  x {.  u8 isTnct;
0440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0450: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0460: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0470: 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79   */.  u8 eTnctTy
0480: 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  pe;   /* One of 
0490: 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  the WHERE_DISTIN
04a0: 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a  CT_* operators *
04b0: 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b  /.  int tabTnct;
04c0: 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c      /* Ephemeral
04d0: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
04e0: 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
04f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ing */.  int add
0500: 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72  rTnct;   /* Addr
0510: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
0520: 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66  hemeral opcode f
0530: 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b  or tabTnct */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0550: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0560: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0570: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0580: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0590: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
05a0: 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
05b0: 61 75 73 65 20 6f 66 20 71 75 65 72 79 20 69 73  ause of query is
05c0: 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f   being coded..*/
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 53 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b  SortCtx SortCtx;
05f0: 0a 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20  .struct SortCtx 
0600: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
0610: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
0620: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
0630: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a  OUP BY clause) *
0640: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20  /.  int nOBSat; 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0660: 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
0670: 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
0680: 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  by indices */.  
0690: 69 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20  int iECursor;   
06a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
06b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73  number for the s
06c0: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  orter */.  int r
06d0: 65 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20  egReturn;       
06e0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
06f0: 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75  ding block-outpu
0700: 74 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  t return address
0710: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42   */.  int labelB
0720: 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  kOut;       /* S
0730: 74 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74  tart label for t
0740: 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  he block-output 
0750: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
0760: 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
0770: 78 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  x;    /* Address
0780: 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65   of the OP_Sorte
0790: 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e  rOpen or OP_Open
07a0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75  Ephemeral */.  u
07b0: 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20  8 sortFlags;    
07c0: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
07d0: 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20  more SORTFLAG_* 
07e0: 62 69 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  bits */.};.#defi
07f0: 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  ne SORTFLAG_UseS
0800: 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a  orter  0x01   /*
0810: 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20   Use SorterOpen 
0820: 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45  instead of OpenE
0830: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a  phemeral */../*.
0840: 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68  ** Delete all th
0850: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53  e content of a S
0860: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e  elect structure.
0870: 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Deallocate the
0880: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
0890: 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72  self only if bFr
08a0: 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ee is true..*/.s
08b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
08c0: 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Select(sqlite3 *
08d0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
08e0: 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69  nt bFree){.  whi
08f0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c  le( p ){.    Sel
0900: 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
0910: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c  >pPrior;.    sql
0920: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
0930: 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  te(db, p->pEList
0940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  );.    sqlite3Sr
0950: 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
0960: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71  p->pSrc);.    sq
0970: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0980: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  db, p->pWhere);.
0990: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
09a0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
09b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
09c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
09d0: 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  e(db, p->pHaving
09e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
09f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0a00: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
0a10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a20: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
0a30: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
0a40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0a50: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
0a60: 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
0a70: 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  e(db, p->pWith);
0a80: 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
0a90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0aa0: 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  b, p);.    p = p
0ab0: 50 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65  Prior;.    bFree
0ac0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
0ad0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0ae0: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0af0: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0b00: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0b10: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0b20: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0b30: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0b40: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
0b50: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
0b60: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
0b70: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
0b80: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
0b90: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
0ba0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0bb0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0bc0: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0bd0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0be0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0bf0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0c00: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0c10: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0c20: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0c30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0c40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0c50: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
0c60: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
0c70: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
0c80: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
0c90: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
0ca0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0cb0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0cc0: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0cd0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0ce0: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0cf0: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0d00: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0d10: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0d20: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0d30: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0d40: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
0d60: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
0d70: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0d80: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
0d90: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
0da0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0db0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0dc0: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0dd0: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0df0: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0e00: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0e10: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0e20: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0e30: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0e40: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
0e50: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
0e60: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
0e70: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
0e80: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
0e90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0ea0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0eb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0ec0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ed0: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0ee0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0ef0: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0f00: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0f10: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0f20: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0f30: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0f40: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
0f50: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0f60: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
0f70: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
0f80: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
0f90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
0fa0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0fb0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0fc0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0fd0: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0fe0: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0ff0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
1000: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
1010: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1020: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1030: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1040: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
1050: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
1060: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
1070: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
1080: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
1090: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
10a0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
10b0: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
10c0: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
10d0: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
10e0: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
10f0: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
1100: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
1110: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1120: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
1130: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
1140: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
1150: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
1160: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1170: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1180: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1190: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [1] = -1;.  if( 
11a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11b0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
11c0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 2c 20 70  lect(db, pNew, p
11d0: 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a  New!=&standin);.
11e0: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
11f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1200: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
1210: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1220: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
1230: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
1240: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
1250: 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45  New;.}..#if SELE
1260: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1270: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
1280: 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f  me of a Select o
1290: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
12a0: 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
12b0: 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f  me(Select *p, co
12c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
12d0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61  {.  if( p && zNa
12e0: 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  me ){.    sqlite
12f0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1300: 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20  f(p->zSelName), 
1310: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73  p->zSelName, "%s
1320: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  ", zName);.  }.}
1330: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1340: 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e  Delete the given
1350: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
1360: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
1370: 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a   substructures..
1380: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1390: 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69  electDelete(sqli
13a0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
13b0: 2a 70 29 7b 0a 20 20 63 6c 65 61 72 53 65 6c 65  *p){.  clearSele
13c0: 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a  ct(db, p, 1);.}.
13d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
13e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  pointer to the r
13f0: 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
1400: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 61 20   statement in a 
1410: 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  compound..*/.sta
1420: 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69 6e 64  tic Select *find
1430: 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65 63 74  Rightmost(Select
1440: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
1450: 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20 70 2d  ->pNext ) p = p-
1460: 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  >pNext;.  return
1470: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
1480: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
1490: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
14a0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
14b0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
14c0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
14d0: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
14e0: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
14f0: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
1500: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
1510: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
1520: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
1530: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
1540: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
1550: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
1560: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
1570: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
1580: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
1590: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
15a0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
15b0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
15c0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
15d0: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
15e0: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
15f0: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
1600: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
1610: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
1620: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
1630: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
1640: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
1650: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
1660: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
1670: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1680: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
1690: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
16a0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
16b0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
16c0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
16d0: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
1700: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
1710: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
1720: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1730: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
1740: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
1750: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
1760: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1770: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
1780: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
1790: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
17a0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
17b0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
17c0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
17d0: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
17e0: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
17f0: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1800: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1810: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1820: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1830: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1840: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1850: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1860: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
1870: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
1880: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
1890: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
18a0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
18b0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
18e0: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
18f0: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1900: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1910: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1920: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1930: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1940: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1950: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1960: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
1970: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1980: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
1990: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
19a0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
19b0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
19c0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
19d0: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
19e0: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
19f0: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1a00: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1a10: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1a20: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1a30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1a40: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1a50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1a60: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
1a70: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
1a80: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1a90: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
1aa0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
1ab0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
1ac0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1ad0: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1ae0: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1af0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b10: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1b20: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1b30: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1b40: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1b50: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1b60: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1b70: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
1b80: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
1b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ba0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
1bb0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
1bc0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1bd0: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1be0: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1bf0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1c00: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1c10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c20: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1c30: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1c40: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1c50: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1c60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c70: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
1c80: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1c90: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
1ca0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
1cb0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
1cc0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1cd0: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1ce0: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1cf0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1d00: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1d10: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1d20: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1d30: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1d40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d50: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1d60: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
1d70: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
1d80: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
1d90: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
1da0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
1db0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
1dc0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1dd0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1de0: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1df0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1e00: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1e10: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1e20: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e40: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1e50: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1e60: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
1e70: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1e80: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
1e90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1ea0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
1eb0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
1ec0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1ed0: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1ee0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1ef0: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1f00: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1f10: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1f20: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1f30: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1f40: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1f50: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1f60: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
1f70: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
1f80: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
1f90: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
1fa0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
1fb0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
1fc0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1fd0: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1fe0: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1ff0: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
2000: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
2010: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
2020: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2030: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
2040: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
2050: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
2060: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2070: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
2080: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
2090: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
20a0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
20b0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
20c0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
20d0: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
20e0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
20f0: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
2100: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
2110: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
2120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2130: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
2140: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
2150: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
2160: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
2180: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
2190: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
21a0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
21b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
21c0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
21d0: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
21e0: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
21f0: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
2200: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
2210: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
2220: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
2230: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
2240: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
2250: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
2260: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
2270: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
2280: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
2290: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
22a0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
22b0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
22c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
22d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
22f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2300: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
2310: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
2320: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
2330: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
2340: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
2350: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2360: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
2370: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
2380: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
2390: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
23a0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
23b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
23c0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
23d0: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
23e0: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
23f0: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
2400: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
2410: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
2420: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
2430: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
2440: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
2450: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
2460: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
2470: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
2480: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
2490: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
24a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
24b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
24c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24d0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
2500: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
2510: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
2520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2530: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2540: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
2550: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
2560: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
2570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2580: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2590: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
25a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
25b0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
25c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25d0: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
25e0: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
25f0: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2620: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
2630: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
2640: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
2650: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2660: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
2670: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
2680: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
26b0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
26c0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
26d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
26e0: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
26f0: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
2700: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
2710: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
2720: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
2730: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
2740: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
2750: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
2760: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
2770: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
2780: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
2790: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
27a0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
27b0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
27c0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
27d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
27e0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
27f0: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2800: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2810: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2820: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2830: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2840: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2850: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2860: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2870: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2880: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2890: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
28a0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
28b0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
28c0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
28d0: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
28e0: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
28f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2900: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2910: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2920: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2930: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2940: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2950: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2960: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
2970: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
2980: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
2990: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
29a0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
29b0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
29c0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
29d0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
29e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
29f0: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2a00: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2a10: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2a20: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2a30: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2a40: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2a50: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2a60: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
2a70: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
2a80: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
2a90: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2aa0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
2ab0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
2ac0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2ad0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2ae0: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2af0: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2b00: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2b10: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2b20: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2b30: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2b40: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2b50: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2b60: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2b70: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
2b80: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2b90: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
2ba0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
2bb0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
2bc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2bd0: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2be0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2bf0: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2c00: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2c10: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2c20: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2c30: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2c40: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2c50: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2c60: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
2c70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2c80: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
2c90: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
2ca0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
2cb0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
2cc0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2cd0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2ce0: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2cf0: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2d00: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2d10: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2d20: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2d30: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2d40: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2d50: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2d60: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
2d70: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
2d80: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
2d90: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
2da0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
2db0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
2dc0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2dd0: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2de0: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2df0: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2e00: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2e10: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2e20: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2e30: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2e40: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2e50: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2e60: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2e70: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2e80: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
2e90: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2ea0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
2eb0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2ec0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2ed0: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2ee0: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2ef0: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2f00: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2f10: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2f20: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2f40: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2f50: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2f60: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
2f70: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
2f80: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2f90: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
2fa0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
2fb0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2fc0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2fd0: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2fe0: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2ff0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
3000: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
3010: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
3020: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
3030: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
3040: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
3050: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
3060: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
3070: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
3080: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
3090: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
30a0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
30b0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
30c0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
30d0: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
30e0: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
30f0: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
3100: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
3110: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
3120: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
3130: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
3140: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
3150: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
3160: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
3170: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
3180: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
3190: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
31a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
31b0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
31c0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
31d0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
31e0: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
31f0: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
3200: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
3210: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
3240: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3250: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
3260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3270: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
3280: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
3290: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32a0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
32b0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
32c0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
32d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32e0: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
32f0: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
3300: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
3310: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
3320: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
3330: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
3340: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
3350: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
3360: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
3370: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
3380: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
3390: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
33a0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
33b0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
33c0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
33d0: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
33e0: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
33f0: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
3400: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
3410: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
3420: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
3430: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3440: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3450: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3460: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3470: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3480: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3490: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
34a0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
34b0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
34c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
34d0: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
34e0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
34f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
3500: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
3510: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
3520: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3530: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
3540: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
3550: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
3560: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
3570: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
3580: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
3590: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
35a0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
35b0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
35c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
35d0: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
35e0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
35f0: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
3600: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3610: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
3620: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
3630: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3640: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
3650: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
3660: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
3670: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
3680: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
3690: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
36a0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
36b0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
36c0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
36d0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
36e0: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
36f0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3700: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3710: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
3720: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3740: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3750: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3760: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3770: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
3780: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
3790: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
37a0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
37b0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
37c0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
37d0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
37e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
37f0: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3800: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3810: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3820: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3830: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3840: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3850: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3860: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
3870: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
3880: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
3890: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
38a0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
38b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
38c0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
38d0: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
38e0: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
38f0: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3900: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3910: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3920: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3930: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3940: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3950: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3960: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
3970: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
3980: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
3990: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
39a0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
39b0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
39c0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
39d0: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
39e0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
39f0: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3a00: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3a10: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3a20: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3a30: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3a40: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3a50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3a60: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
3a70: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
3a80: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
3a90: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
3aa0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
3ab0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
3ac0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3ad0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3ae0: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3af0: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3b00: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3b10: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3b20: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3b30: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3b40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3b50: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3b70: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
3b80: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
3b90: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
3ba0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
3bb0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3bc0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3bd0: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3be0: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3bf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3c00: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3c10: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3c20: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3c30: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3c40: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3c50: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3c60: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
3c70: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
3c80: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
3c90: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
3ca0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
3cb0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
3cc0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3cd0: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3ce0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3cf0: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3d00: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3d10: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3d20: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3d30: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3d40: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3d60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3d70: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
3d80: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
3d90: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
3da0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
3db0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
3dc0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3dd0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3de0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3df0: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3e00: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3e10: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3e20: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3e50: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3e60: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3e70: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
3e80: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3e90: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
3ea0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
3eb0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
3ec0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3ed0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3ee0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
3ef0: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
3f00: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
3f10: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
3f20: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
3f30: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
3f40: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
3f50: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
3f60: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
3f70: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
3f80: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
3f90: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
3fa0: 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a  he end */.);../*
3fb0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
3fc0: 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  e that will push
3fd0: 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 72   the record in r
3fe0: 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74 61  egisters regData
3ff0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67 44  .** through regD
4000: 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f  ata+nData-1 onto
4010: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
4020: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
4030: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
4040: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4050: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
4060: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74  ontext */.  Sort
4070: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
4080: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
4090: 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45  n about the ORDE
40a0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
40b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
40c0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
40d0: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
40e0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
40f0: 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  egData,         
4100: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4110: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4120: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
4130: 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  .  int nData,   
4140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4150: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4160: 69 6e 20 74 68 65 20 64 61 74 61 20 61 72 72 61  in the data arra
4170: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  y */.  int nPref
4180: 69 78 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a  ixReg         /*
4190: 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69 6f   No. of reg prio
41a0: 72 20 74 6f 20 72 65 67 44 61 74 61 20 61 76 61  r to regData ava
41b0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a  ilable for use *
41c0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
41d0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74 20          /* Stmt 
4200: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4210: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71  on */.  int bSeq
4220: 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74   = ((pSort->sort
4230: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
4240: 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b  _UseSorter)==0);
4250: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70  .  int nExpr = p
4260: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
4270: 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
4280: 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52      /* No. of OR
4290: 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
42a0: 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45    int nBase = nE
42b0: 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44 61  xpr + bSeq + nDa
42c0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
42d0: 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20     /* Fields in 
42e0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
42f0: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72 20      /* Regs for 
4330: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
4340: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
4350: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4360: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4370: 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64      /* Assembled
4380: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4390: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d  /.  int nOBSat =
43a0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20   pSort->nOBSat; 
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
43d0: 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a   terms to skip *
43e0: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
4410: 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20 72   to add sorter r
4420: 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72 20  ecord to sorter 
4430: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53  */..  assert( bS
4440: 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31  eq==0 || bSeq==1
4450: 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69   );.  if( nPrefi
4460: 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65  xReg ){.    asse
4470: 72 74 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  rt( nPrefixReg==
4480: 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20  nExpr+bSeq );.  
4490: 20 20 72 65 67 42 61 73 65 20 3d 20 72 65 67 44    regBase = regD
44a0: 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53  ata - nExpr - bS
44b0: 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eq;.  }else{.   
44c0: 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
44d0: 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
44e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
44f0: 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20 73 71   nBase;.  }.  sq
4500: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
4510: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
4520: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72  ort->pOrderBy, r
4530: 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 45  egBase, SQLITE_E
4540: 43 45 4c 5f 44 55 50 29 3b 0a 20 20 69 66 28 20  CEL_DUP);.  if( 
4550: 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69  bSeq ){.    sqli
4560: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4570: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
4580: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4590: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
45a0: 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78   }.  if( nPrefix
45b0: 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Reg==0 ){.    sq
45c0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
45d0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74  e(pParse, regDat
45e0: 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  a, regBase+nExpr
45f0: 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20  +bSeq, nData);. 
4600: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62   }..  sqlite3Vdb
4610: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4620: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
4630: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
4640: 6e 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f 72  nOBSat, regRecor
4650: 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61 74  d);.  if( nOBSat
4660: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  >0 ){.    int re
4670: 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54  gPrevKey;   /* T
4680: 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20  he first nOBSat 
4690: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70  columns of the p
46a0: 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20  revious row */. 
46b0: 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74     int addrFirst
46c0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
46d0: 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20  of the OP_IfNot 
46e0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e  opcode */.    in
46f0: 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20  t addrJmp;      
4700: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
4710: 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65  e OP_Jump opcode
4720: 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   */.    VdbeOp *
4730: 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63  pOp;      /* Opc
4740: 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74  ode that opens t
4750: 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
4760: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20   int nKey;      
4770: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4780: 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75  sorting key colu
4790: 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f  mns, including O
47a0: 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  P_Sequence */.  
47b0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20    KeyInfo *pKI; 
47c0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
47d0: 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73  KeyInfo on the s
47e0: 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a  orter table */..
47f0: 20 20 20 20 72 65 67 50 72 65 76 4b 65 79 20 3d      regPrevKey =
4800: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
4810: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4820: 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  m += pSort->nOBS
4830: 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e  at;.    nKey = n
4840: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f  Expr - pSort->nO
4850: 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20 20  BSat + bSeq;.   
4860: 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20   if( bSeq ){.   
4870: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
4880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4890: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
48a0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20  gBase+nExpr); . 
48b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
48c0: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
48d0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
48e0: 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74   OP_SequenceTest
48f0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
4900: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64  r);.    }.    Vd
4910: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4930: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
4940: 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20  re, regPrevKey, 
4950: 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e  regBase, pSort->
4960: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f 70  nOBSat);.    pOp
4970: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4980: 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64  tOp(v, pSort->ad
4990: 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
49a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
49b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
49c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70   return;.    pOp
49d0: 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44  ->p2 = nKey + nD
49e0: 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70  ata;.    pKI = p
49f0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
4a00: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d  .    memset(pKI-
4a10: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  >aSortOrder, 0, 
4a20: 70 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a  pKI->nField); /*
4a30: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62   Makes OP_Jump b
4a40: 65 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f  elow testable */
4a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4a60: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
4a70: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
4a80: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
4a90: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 58 46 69  tcase( pKI->nXFi
4aa0: 65 6c 64 3e 32 20 29 3b 0a 20 20 20 20 70 4f 70  eld>2 );.    pOp
4ab0: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20  ->p4.pKeyInfo = 
4ac0: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
4ad0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
4ae0: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42  t->pOrderBy, nOB
4af0: 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Sat,.           
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 2d 31 29 3b  pKI->nXField-1);
4b30: 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73  .    addrJmp = s
4b40: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
4b50: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
4b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4b70: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
4b80: 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d  Jmp+1, 0, addrJm
4b90: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
4ba0: 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  ge(v);.    pSort
4bb0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73  ->labelBkOut = s
4bc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4bd0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72  bel(v);.    pSor
4be0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  t->regReturn = +
4bf0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
4c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c10: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
4c20: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
4c30: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
4c40: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
4c50: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4c60: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
4c70: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4c80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4c90: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
4ca0: 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71  drFirst);.    sq
4cb0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
4cc0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
4cd0: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70  e, regPrevKey, p
4ce0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20  Sort->nOBSat);. 
4cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4d00: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d  mpHere(v, addrJm
4d10: 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  p);.  }.  if( pS
4d20: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
4d30: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
4d40: 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ter ){.    op = 
4d50: 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b  OP_SorterInsert;
4d60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
4d70: 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b   = OP_IdxInsert;
4d80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4d90: 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
4da0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
4db0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69   regRecord);.  i
4dc0: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  f( pSelect->iLim
4dd0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
4de0: 64 72 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d  dr;.    int iLim
4df0: 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  it;.    if( pSel
4e00: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ect->iOffset ){.
4e10: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
4e20: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
4e30: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
4e40: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
4e50: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  lect->iLimit;.  
4e60: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
4e70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4e80: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f  (v, OP_IfNotZero
4e90: 2c 20 69 4c 69 6d 69 74 2c 20 30 2c 20 2d 31 29  , iLimit, 0, -1)
4ea0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4eb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ec0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c  beAddOp1(v, OP_L
4ed0: 61 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ast, pSort->iECu
4ee0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4ef0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4f00: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74  OP_Delete, pSort
4f10: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4f20: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4f30: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
4f40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
4f50: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
4f60: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
4f70: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
4f80: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
4f90: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
4fa0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
4fb0: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
4fc0: 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20  nt iOffset,     
4fd0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
4fe0: 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20  ding the offset 
4ff0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5000: 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f   iContinue     /
5010: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
5020: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
5030: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
5040: 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a  f( iOffset>0 ){.
5050: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
5060: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
5070: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5080: 5f 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c  _IfNeg, iOffset,
5090: 20 30 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76   0, -1); VdbeCov
50a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
50b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
50c0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
50d0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
50e0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
50f0: 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f  skip OFFSET reco
5100: 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  rds"));.    sqli
5110: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5120: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
5130: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
5140: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
5150: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
5160: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
5170: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
5180: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
5190: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
51a0: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
51b0: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
51c0: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
51d0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
51e0: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
51f0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
5200: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
5210: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
5220: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
5230: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
5240: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
5250: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
5260: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
5270: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
5280: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
5290: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
52a0: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
52b0: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
52c0: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
52d0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
52e0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
52f0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5300: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
5310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
5320: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
5330: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
5340: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
5350: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
5360: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
5370: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
5380: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
5390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
53a0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
53b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
53c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
53d0: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
53e0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
53f0: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
5400: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
5410: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5420: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
5430: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5440: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
5450: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
5460: 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62  t, iMem, N); Vdb
5470: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5490: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
54a0: 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29  rd, iMem, N, r1)
54b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
54c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
54d0: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29  nsert, iTab, r1)
54e0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
54f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5500: 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  , r1);.}..#ifnde
5510: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
5520: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
5530: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
5540: 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45  essage when a SE
5550: 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74  LECT is used wit
5560: 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73  hin a subexpress
5570: 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a  ion.** (example:
5580: 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20    "a IN (SELECT 
5590: 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20  * FROM table)") 
55a0: 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20  but it has more 
55b0: 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a  than 1 result.**
55c0: 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20   column.  We do 
55d0: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
55e0: 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65  tine because the
55f0: 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f   error used to o
5600: 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69  ccur.** in multi
5610: 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68  ple places.  (Th
5620: 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63  e error only occ
5630: 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65  urs in one place
5640: 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20   now, but we.** 
5650: 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f  retain the subro
5660: 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a  utine to minimiz
5670: 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f  e code disruptio
5680: 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  n.).*/.static in
5690: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
56a0: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
56b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
56c0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
56d0: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
56e0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
56f0: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
5700: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
5710: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
5720: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
5730: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
5740: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
5750: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
5760: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
5770: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
5780: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
5790: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
57a0: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
57b0: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
57c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
57d0: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
57e0: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
57f0: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
5800: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
5810: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
5820: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
5830: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5840: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5850: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
5860: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5870: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
5880: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
5890: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
58a0: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
58b0: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
58c0: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
58d0: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
58e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
58f0: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
5900: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
5910: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
5920: 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20  row.  If srcTab 
5930: 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f  is.** zero or mo
5940: 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73  re, then data is
5950: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
5960: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
5970: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
5980: 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f  to get number co
5990: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61  lumns and the da
59a0: 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20  tatype for each 
59b0: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
59c0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
59d0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
59e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
59f0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5a00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
5a10: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
5a20: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
5a30: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
5a40: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
5a50: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
5a60: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
5a70: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
5a80: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
5a90: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
5aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5ab0: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
5ac0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
5ad0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
5ae0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
5af0: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
5b00: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f  how to process O
5b10: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73  RDER BY */.  Dis
5b20: 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69  tinctCtx *pDisti
5b30: 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  nct, /* If not N
5b40: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
5b50: 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54   to process DIST
5b60: 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74  INCT */.  Select
5b70: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
5b80: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
5b90: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
5ba0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
5bb0: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
5bc0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
5bd0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
5be0: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
5bf0: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
5c00: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5c10: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
5c20: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
5c30: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5c40: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5c50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5c60: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
5c70: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5c80: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
5c90: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
5ca0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
5cb0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5cc0: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
5cd0: 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  ry holding resul
5ce0: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65  t set */.  int e
5cf0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
5d00: 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f  est;   /* How to
5d10: 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75   dispose of resu
5d20: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
5d30: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
5d40: 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72  arm; /* First ar
5d50: 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73  gument to dispos
5d60: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
5d70: 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20  nt nResultCol;  
5d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5d90: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
5da0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
5db0: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20  nPrefixReg = 0; 
5dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5dd0: 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
5de0: 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52  ters before regR
5df0: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esult */..  asse
5e00: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
5e10: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
5e20: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
5e30: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
5e40: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
5e50: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
5e60: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
5e70: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
5e80: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
5e90: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
5ea0: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
5eb0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
5ec0: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
5ed0: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
5ee0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
5ef0: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
5f00: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
5f10: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
5f20: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
5f30: 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ultCol = pEList-
5f40: 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
5f50: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
5f60: 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  {.    if( pSort 
5f70: 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78  ){.      nPrefix
5f80: 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  Reg = pSort->pOr
5f90: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
5fa0: 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d      if( !(pSort-
5fb0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
5fc0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
5fd0: 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b   ) nPrefixReg++;
5fe0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
5ff0: 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65  Mem += nPrefixRe
6000: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65  g;.    }.    pDe
6010: 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72  st->iSdst = pPar
6020: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6030: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6040: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
6050: 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69  lse if( pDest->i
6060: 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20  Sdst+nResultCol 
6070: 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  > pParse->nMem )
6080: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
6090: 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74   an error condit
60a0: 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73  ion that can res
60b0: 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ult, for example
60c0: 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a  , when a SELECT.
60d0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69      ** on the ri
60e0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
60f0: 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61   an INSERT conta
6100: 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20  ins more result 
6110: 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20  columns than.   
6120: 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f   ** there are co
6130: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
6140: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20  le on the left. 
6150: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
6160: 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a  be caught.    **
6170: 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
6180: 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ter.  But we nee
6190: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65  d to make sure e
61a0: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20  nough memory is 
61b0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
61c0: 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20   to avoid other 
61d0: 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20  spurious errors 
61e0: 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e  in the meantime.
61f0: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
6200: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
6210: 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d  ol;.  }.  pDest-
6220: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
6230: 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74  Col;.  regResult
6240: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
6250: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
6260: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6270: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6280: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6290: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
62a0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
62b0: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
62c0: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
62d0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
62e0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
62f0: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
6300: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
6310: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
6320: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
6330: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
6340: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
6350: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
6360: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
6370: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
6380: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
6390: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
63a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
63b0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
63c0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
63d0: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
63e0: 20 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d 53         (eDest==S
63f0: 52 54 5f 4f 75 74 70 75 74 7c 7c 65 44 65 73 74  RT_Output||eDest
6400: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29  ==SRT_Coroutine)
6410: 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50  ?SQLITE_ECEL_DUP
6420: 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  :0);.  }..  /* I
6430: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
6440: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
6450: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
6460: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
6470: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
6480: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
6490: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
64a0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
64b0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
64c0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
64d0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
64e0: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
64f0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
6500: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
6510: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
6520: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
6530: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
6540: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
6550: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
6560: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
6570: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
6580: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
6590: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
65a0: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
65b0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
65c0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
65d0: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
65e0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
65f0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
6600: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
6610: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
6620: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
6630: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
6640: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6650: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
6660: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
6670: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
6680: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
6690: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
66a0: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
66b0: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
66c0: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
66d0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
66e0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
66f0: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
6700: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
6710: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
6720: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
6730: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
6740: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
6750: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
6760: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
6770: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
6780: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
6790: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
67a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
67b0: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
67c0: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
67d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
67e0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
67f0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
6800: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
6810: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
6820: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
6830: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
6840: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
6850: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
6860: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
6870: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6880: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
6890: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
68a0: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
68b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
68c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
68d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
68e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
68f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6900: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6910: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
6920: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
6930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6940: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
6950: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
6960: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
6970: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
6980: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
6990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
69a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
69b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
69c0: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
69d0: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
69e0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
69f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6a00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
6a10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6a20: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
6a30: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
6a40: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
6a50: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
6a60: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6a70: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
6a80: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
6a90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6ab0: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
6ac0: 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  p || pParse->db-
6ad0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6ae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6af0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6b00: 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74  _Copy, regResult
6b10: 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75  , regPrev, nResu
6b20: 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ltCol-1);.      
6b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6b40: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  ..      case WHE
6b50: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
6b60: 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
6b70: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
6b80: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
6b90: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
6ba0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6bb0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
6bc0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
6bd0: 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63  assert( pDistinc
6be0: 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  t->eTnctType==WH
6bf0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
6c00: 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20  RDERED );.      
6c10: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
6c20: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
6c30: 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74  ->tabTnct, iCont
6c40: 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  inue, nResultCol
6c50: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
6c60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6c70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6c80: 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20  f( pSort==0 ){. 
6c90: 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28       codeOffset(
6ca0: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
6cb0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
6cc0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
6cd0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
6ce0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
6cf0: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
6d00: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
6d10: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
6d20: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
6d30: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
6d40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6d50: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
6d60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
6d70: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
6d80: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
6d90: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6da0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
6db0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6dc0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
6dd0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
6de0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b  nResultCol, r1);
6df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6e00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6e10: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
6e20: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
6e30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
6e40: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
6e50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6e60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
6e70: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
6e80: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
6e90: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
6ea0: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
6eb0: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
6ec0: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
6ed0: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
6ee0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
6ef0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
6f00: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
6f10: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
6f20: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
6f30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6f40: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
6f50: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
6f60: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
6f70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6f80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6f90: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
6fa0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
6fb0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
6fc0: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
6fd0: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
6fe0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
6ff0: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
7000: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
7010: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
7020: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
7030: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
7040: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7050: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
7060: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
7070: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
7080: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7090: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
70a0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
70b0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
70c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
70d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
70e0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
70f0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7100: 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  l, r1+nPrefixReg
7110: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
7120: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20  E_OMIT_CTE.     
7130: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
7140: 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20  DistFifo ){.    
7150: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
7160: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
7170: 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73  tFifo, then curs
7180: 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20  or (iParm+1) is 
7190: 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
71a0: 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  on an ephemeral 
71b0: 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75  index. If the cu
71c0: 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72  rrent row is alr
71d0: 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20  eady present.   
71e0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
71f0: 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69  ndex, do not wri
7200: 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74  te it to the out
7210: 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64  put. If not, add
7220: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7230: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74  current row to t
7240: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f  he index and pro
7250: 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e  ceed with writin
7260: 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20  g it to the.    
7270: 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61      ** output ta
7280: 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f  ble as well.  */
7290: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
72a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
72b0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
72c0: 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  4;.        sqlit
72d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
72e0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
72f0: 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20  rm+1, addr, r1, 
7300: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
7310: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
7320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7330: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
7340: 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20  iParm+1, r1);.  
7350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
7360: 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ort==0 );.      
7370: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
7380: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
7390: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
73a0: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
73b0: 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52  , p, r1+nPrefixR
73c0: 65 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  eg, 1, nPrefixRe
73d0: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
73e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
73f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7400: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7420: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
7430: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
7440: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7450: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7460: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
7470: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
7480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7490: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
74a0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
74b0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
74c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
74d0: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
74e0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
74f0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
7500: 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65  e, r1, nPrefixRe
7510: 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  g+1);.      brea
7520: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
7530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7540: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
7550: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
7560: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
7570: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
7580: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
7590: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
75a0: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
75b0: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
75c0: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
75d0: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
75e0: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
75f0: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
7600: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
7610: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
7620: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
7630: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
7640: 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
7650: 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  st =.           
7660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
7670: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
7680: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7690: 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
76a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
76b0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rt ){.        /*
76c0: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
76d0: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
76e0: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
76f0: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
7700: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
7710: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
7720: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
7730: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
7740: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
7750: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
7760: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
7770: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
7780: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
7790: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
77a0: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
77b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
77c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
77d0: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
77e0: 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66  Result, 1, nPref
77f0: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
7800: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
7810: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
7820: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
7830: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7840: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
7850: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7860: 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44  Result,1,r1, &pD
7870: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
7880: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7890: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
78a0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
78b0: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
78c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
78d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
78e0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
78f0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
7900: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7910: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
7920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7930: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7940: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
7950: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
7960: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
7970: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
7980: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
7990: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
79a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
79b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
79c0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
79d0: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
79e0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
79f0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
7a00: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7a10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7a20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
7a30: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
7a40: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
7a50: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
7a60: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
7a70: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
7a80: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
7a90: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
7aa0: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
7ab0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
7ac0: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
7ad0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
7ae0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
7af0: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31  t( nResultCol==1
7b00: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7b10: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7b20: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7b30: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7b40: 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50  regResult, 1, nP
7b50: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
7b60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b70: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
7b80: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
7b90: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
7ba0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
7bb0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
7bc0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
7bd0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7be0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
7bf0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
7c00: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
7c10: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
7c20: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
7c30: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
7c40: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
7c50: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
7c60: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
7c70: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
7c80: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
7c90: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7ca0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
7cb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7cc0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7cd0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7ce0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7cf0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7d00: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7d10: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7d20: 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65  ltCol, nPrefixRe
7d30: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
7d40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
7d50: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
7d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7d70: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
7d80: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
7d90: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
7da0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7db0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7dc0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
7dd0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7de0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
7df0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
7e00: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
7e10: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  e, regResult, nR
7e20: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
7e30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7e40: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
7e50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
7e60: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
7e70: 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70  results into a p
7e80: 72 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68  riority queue th
7e90: 61 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f  at is order acco
7ea0: 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20  rding to.    ** 
7eb0: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20  pDest->pOrderBy 
7ec0: 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74  (in pSO).  pDest
7ed0: 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50  ->iSDParm (in iP
7ee0: 61 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73  arm) is the curs
7ef0: 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  or for an.    **
7f00: 20 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d   index with pSO-
7f10: 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73  >nExpr+2 columns
7f20: 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75  .  Build a key u
7f30: 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65  sing pSO for the
7f40: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53   first.    ** pS
7f50: 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73  O->nExpr columns
7f60: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
7f70: 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e   all keys are un
7f80: 69 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61  ique by adding a
7f90: 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50  .    ** final OP
7fa0: 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e  _Sequence column
7fb0: 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75  .  The last colu
7fc0: 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64  mn is the record
7fd0: 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20   as a blob..    
7fe0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
7ff0: 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63  DistQueue:.    c
8000: 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b  ase SRT_Queue: {
8010: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  .      int nKey;
8020: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
8030: 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74  2, r3;.      int
8040: 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20   addrTest = 0;. 
8050: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8060: 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20  SO;.      pSO = 
8070: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b  pDest->pOrderBy;
8080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8090: 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79  SO );.      nKey
80a0: 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20   = pSO->nExpr;. 
80b0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
80c0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
80d0: 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  se);.      r2 = 
80e0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
80f0: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79  nge(pParse, nKey
8100: 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  +2);.      r3 = 
8110: 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20  r2+nKey+1;.     
8120: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8130: 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20  DistQueue ){.   
8140: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
8150: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
8160: 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75  stQueue, then cu
8170: 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69  rsor (iParm+1) i
8180: 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
8190: 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70  * on a second ep
81a0: 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68  hemeral index th
81b0: 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c  at holds all val
81c0: 75 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f  ues every previo
81d0: 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  usly.        ** 
81e0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65  added to the que
81f0: 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ue. */.        a
8200: 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65  ddrTest = sqlite
8210: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
8220: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
8230: 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  m+1, 0, .       
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8270: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
8280: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
82a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
82b0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
82c0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
82d0: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a  ResultCol, r3);.
82e0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
82f0: 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
8300: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8310: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8320: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
8330: 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20  rm+1, r3);.     
8340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8350: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
8360: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
8370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
8380: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20  or(i=0; i<nKey; 
8390: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
83a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
83b0: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20  v, OP_SCopy,.   
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
83e0: 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78   + pSO->a[i].u.x
83f0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
8400: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8410: 20 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69              r2+i
8420: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8440: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
8450: 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65  e, iParm, r2+nKe
8460: 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y);.      sqlite
8470: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8480: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32  P_MakeRecord, r2
8490: 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20  , nKey+2, r1);. 
84a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
84b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
84c0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
84d0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  1);.      if( ad
84e0: 64 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33  drTest ) sqlite3
84f0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8500: 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20  addrTest);.     
8510: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
8520: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
8530: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8540: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
8550: 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b  e(pParse, r2, nK
8560: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65  ey+2);.      bre
8570: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8580: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8590: 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  CTE */....#if !d
85a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
85b0: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
85c0: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
85d0: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
85e0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
85f0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
8600: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
8610: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
8620: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
8630: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
8640: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
8650: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
8660: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
8670: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
8680: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
8690: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
86a0: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
86b0: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
86c0: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
86d0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
86e0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
86f0: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
8700: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
8710: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
8720: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
8730: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
8740: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
8750: 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a    Except, if.  *
8760: 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72  * there is a sor
8770: 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ter, in which ca
8780: 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  se the sorter ha
8790: 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65  s already limite
87a0: 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75  d.  ** the outpu
87b0: 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20  t for us..  */. 
87c0: 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26   if( pSort==0 &&
87d0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
87e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
87f0: 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
8800: 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  mpZero, p->iLimi
8810: 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
8820: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
8830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
8840: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
8850: 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66  ect sufficient f
8860: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e  or an index of N
8870: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64   key columns and
8880: 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75  .** X extra colu
8890: 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  mns..*/.KeyInfo 
88a0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41  *sqlite3KeyInfoA
88b0: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62  lloc(sqlite3 *db
88c0: 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b  , int N, int X){
88d0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
88e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
88f0: 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20 20 20  ero(0, .        
8900: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
8910: 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b  f(KeyInfo) + (N+
8920: 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  X)*(sizeof(CollS
8930: 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28 20  eq*)+1));.  if( 
8940: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
8950: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
8960: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
8970: 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75    p->nField = (u
8980: 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46  16)N;.    p->nXF
8990: 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20  ield = (u16)X;. 
89a0: 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28     p->enc = ENC(
89b0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
89c0: 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66   db;.    p->nRef
89d0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
89e0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
89f0: 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  led = 1;.  }.  r
8a00: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
8a10: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
8a20: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
8a30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
8a40: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
8a50: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
8a60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8a70: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
8a80: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
8a90: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
8aa0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
8ab0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
8ac0: 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e   Make a new poin
8ad0: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
8ae0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e   object.*/.KeyIn
8af0: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
8b00: 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  foRef(KeyInfo *p
8b10: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
8b20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
8b30: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
8b40: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ef++;.  }.  retu
8b50: 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn p;.}..#ifdef 
8b60: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
8b70: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8b80: 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  f a KeyInfo obje
8b90: 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ct can be change
8ba0: 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f  .  The KeyInfo o
8bb0: 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c  bject.** can onl
8bc0: 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20  y be changed if 
8bd0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73  this is just a s
8be0: 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20  ingle reference 
8bf0: 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a  to the object..*
8c00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8c10: 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69  e is used only i
8c20: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
8c30: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
8c40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49  .int sqlite3KeyI
8c50: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b  nfoIsWriteable(K
8c60: 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75  eyInfo *p){ retu
8c70: 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d  rn p->nRef==1; }
8c80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8c90: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
8ca0: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
8cb0: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
8cc0: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
8cd0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
8ce0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
8cf0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
8d00: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
8d10: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
8d20: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8d30: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
8d40: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
8d50: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
8d60: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
8d70: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
8d80: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8d90: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
8da0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
8db0: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
8dc0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
8dd0: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
8de0: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
8df0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
8e00: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
8e10: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
8e20: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
8e30: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
8e40: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
8e50: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
8e60: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
8e70: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
8e80: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
8e90: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8ea0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
8eb0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
8ec0: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
8ed0: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
8ee0: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
8ef0: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
8f00: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
8f10: 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
8f20: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
8f30: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
8f40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8f50: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
8f60: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8f70: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8f80: 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68  ,     /* Form th
8f90: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
8fa0: 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c   from this ExprL
8fb0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ist */.  int iSt
8fc0: 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  art,          /*
8fd0: 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73   Begin with this
8fe0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74   column of pList
8ff0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
9000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
9010: 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72  d this many extr
9020: 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  a columns to the
9030: 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   end */.){.  int
9040: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
9050: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
9060: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9070: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
9080: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9090: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  >db;.  int i;.. 
90a0: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
90b0: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
90c0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
90d0: 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69  lloc(db, nExpr-i
90e0: 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29  Start, nExtra+1)
90f0: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
9100: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
9110: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
9120: 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b  teable(pInfo) );
9130: 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72  .    for(i=iStar
9140: 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  t, pItem=pList->
9150: 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70  a+iStart; i<nExp
9160: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
9170: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
9180: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
9190: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
91a0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
91b0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
91c0: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
91d0: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
91e0: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
91f0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69  pInfo->aColl[i-i
9200: 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  Start] = pColl;.
9210: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
9220: 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74  rtOrder[i-iStart
9230: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
9240: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
9250: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
9260: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
9270: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9280: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
9290: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
92a0: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
92b0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
92c0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
92d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
92e0: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
92f0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
9300: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
9310: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
9320: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
9330: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
9340: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
9350: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
9360: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
9370: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
9380: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
9390: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
93a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
93b0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
93c0: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
93d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
93e0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
93f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9400: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
9410: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9420: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
9430: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
9440: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
9450: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
9460: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
9470: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
9480: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
9490: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
94a0: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
94b0: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
94c0: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
94d0: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
94e0: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
94f0: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
9500: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
9510: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
9520: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
9530: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
9540: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
9550: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
9560: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9570: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
9580: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9590: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
95a0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
95b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
95c0: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
95d0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
95e0: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
95f0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
9600: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
9610: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9620: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
9630: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
9640: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
9650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9660: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9670: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9680: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9690: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
96a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
96b0: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
96c0: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
96d0: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
96e0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
96f0: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
9700: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
9710: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
9720: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
9730: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
9740: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
9750: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
9760: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
9770: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
9780: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
9790: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
97a0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
97b0: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
97c0: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
97d0: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
97e0: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
97f0: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
9800: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
9810: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
9820: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
9830: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
9840: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
9850: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
9860: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9870: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
9880: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
9890: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
98a0: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
98b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
98c0: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
98d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
98e0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
98f0: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
9900: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
9910: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
9920: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
9930: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9940: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9950: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9960: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9970: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
9980: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
9990: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
99a0: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
99b0: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
99c0: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
99d0: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
99e0: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
99f0: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
9a00: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
9a10: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
9a20: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
9a30: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
9a40: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
9a50: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
9a60: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
9a70: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9a80: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
9a90: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
9aa0: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
9ab0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
9ac0: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
9ad0: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
9ae0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
9af0: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
9b00: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
9b10: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
9b20: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
9b30: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
9b40: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
9b50: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
9b60: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
9b70: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
9b80: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
9b90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9ba0: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
9bb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
9be0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9c10: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
9c20: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
9c30: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c50: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
9c60: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
9c90: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
9ca0: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
9cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9cc0: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
9cd0: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
9ce0: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
9cf0: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
9d00: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
9d10: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
9d20: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
9d30: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
9d40: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
9d50: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9d60: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
9d70: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
9d80: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
9d90: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
9da0: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
9db0: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
9dc0: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
9dd0: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
9de0: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
9df0: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
9e00: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
9e10: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
9e20: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
9e30: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
9e40: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
9e50: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
9e60: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
9e70: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
9e80: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
9e90: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
9ea0: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
9eb0: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
9ec0: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
9ed0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
9ee0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
9ef0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
9f00: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
9f10: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
9f20: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
9f30: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
9f40: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
9f50: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
9f60: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
9f70: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
9f80: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
9f90: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
9fa0: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
9fb0: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
9fc0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
9fd0: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
9fe0: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
9ff0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
a000: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
a010: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
a020: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a030: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
a040: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
a050: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
a060: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
a070: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
a080: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
a090: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
a0a0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
a0b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a0c0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
a0d0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
a0e0: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
a0f0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
a100: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
a110: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a120: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
a130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a140: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
a150: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
a160: 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
a170: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
a180: 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  v);     /* Jump 
a190: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
a1a0: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
a1b0: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
a1c0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a1d0: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
a1e0: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
a1f0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
a200: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
a210: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
a220: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
a230: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
a240: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
a250: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
a260: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
a270: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
a280: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
a290: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
a2a0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
a2b0: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2d0: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
a2e0: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
a2f0: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
a320: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
a330: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
a340: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a370: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
a380: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
a390: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
a3a0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
a3b0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63  COMMENTS.  struc
a3c0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a3d0: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
a3e0: 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a  ist->a;.#endif..
a3f0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
a400: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73  elBkOut ){.    s
a410: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a420: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
a430: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
a440: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a450: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
a460: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a470: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 42 72 65  Goto, 0, addrBre
a480: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
a490: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
a4a0: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
a4b0: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54  BkOut);.  }.  iT
a4c0: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  ab = pSort->iECu
a4d0: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
a4e0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
a4f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
a500: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 72 65 67  utine ){.    reg
a510: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72  Rowid = 0;.    r
a520: 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69  egRow = pDest->i
a530: 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44  Sdst;.    nSortD
a540: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
a550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52   }else{.    regR
a560: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
a570: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a580: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73  ;.    regRow = s
a590: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a5a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 6e 53  (pParse);.    nS
a5b0: 6f 72 74 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d  ortData = 1;.  }
a5c0: 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72  .  nKey = pOrder
a5d0: 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  By->nExpr - pSor
a5e0: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28  t->nOBSat;.  if(
a5f0: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
a600: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
a610: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e  Sorter ){.    in
a620: 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b  t regSortOut = +
a630: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
a640: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50     iSortTab = pP
a650: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
a660: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
a670: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20  elBkOut ){.     
a680: 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69   addrOnce = sqli
a690: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
a6a0: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
a6b0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
a6c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a6d0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
a6e0: 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65  do, iSortTab, re
a6f0: 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31  gSortOut, nKey+1
a700: 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20  +nSortData);.   
a710: 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20   if( addrOnce ) 
a720: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a730: 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29  ere(v, addrOnce)
a740: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  ;.    addr = 1 +
a750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a760: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
a770: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
a780: 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  reak);.    VdbeC
a790: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a7a0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
a7b0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
a7c0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c  ntinue);.    sql
a7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a7e0: 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
a7f0: 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75   iTab, regSortOu
a800: 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20  t, iSortTab);.  
a810: 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65    bSeq = 0;.  }e
a820: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  lse{.    addr = 
a830: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
a840: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
a850: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
a860: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
a870: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
a880: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
a890: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
a8a0: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
a8b0: 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20   iTab;.    bSeq 
a8c0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 1;.  }.  for(i
a8d0: 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b  =0; i<nSortData;
a8e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
a8f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a900: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
a910: 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69  Tab, nKey+bSeq+i
a920: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
a930: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
a940: 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d   "%s", aOutEx[i]
a950: 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b  .zName ? aOutEx[
a960: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
a970: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
a980: 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  }.  switch( eDes
a990: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
a9a0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
a9b0: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
a9c0: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
a9d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
a9e0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
a9f0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
aa00: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
aa10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aa20: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
aa30: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  wid, iParm, regR
aa40: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
aa50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
aa60: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
aa70: 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  rm, regRow, regR
aa80: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
aa90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
aaa0: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
aab0: 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  D);.      break;
aac0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
aad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
aae0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
aaf0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
ab00: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
ab10: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
ab20: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
ab30: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
ab40: 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69  gRow, 1, regRowi
ab50: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
ab60: 20 20 20 20 20 20 20 20 20 20 20 26 70 44 65 73             &pDes
ab70: 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a  t->affSdst, 1);.
ab80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ab90: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
aba0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
abb0: 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  Row, 1);.      s
abc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
abd0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
abe0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
abf0: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
ac00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ac10: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
ac20: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
ac30: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
ac40: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
ac50: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
ac60: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
ac70: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
ac80: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
ac90: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
aca0: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
acb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
acc0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
acd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
ace0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
acf0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
ad00: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
ad10: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
ad20: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
ad30: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ad40: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
ad50: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
ad60: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
ad70: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
ad80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad90: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
ada0: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
adb0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
adc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
add0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ade0: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
adf0: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
ae00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ae10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ae20: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ae30: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
ae40: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
ae50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ae60: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
ae70: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c  Rowid ){.    sql
ae80: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ae90: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
aea0: 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  w);.    sqlite3R
aeb0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
aec0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
aed0: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f  .  }.  /* The bo
aee0: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
aef0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
af00: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
af10: 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  v, addrContinue)
af20: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  ;.  if( pSort->s
af30: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
af40: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
af50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
af60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
af70: 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  terNext, iTab, a
af80: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
af90: 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(v);.  }else{.
afa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
afb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
afc0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
afd0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
afe0: 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d    }.  if( pSort-
aff0: 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c  >regReturn ) sql
b000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
b010: 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f  , OP_Return, pSo
b020: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  rt->regReturn);.
b030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b040: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
b050: 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rBreak);.}../*.*
b060: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
b070: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
b080: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
b090: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
b0a0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
b0b0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
b0c0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
b0d0: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
b0e0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
b0f0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74  **.** Also try t
b100: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73  o estimate the s
b110: 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ize of the retur
b120: 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65  ned value and re
b130: 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73  turn that.** res
b140: 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74  ult in *pEstWidt
b150: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  h..**.** The dec
b160: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
b170: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
b180: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
b190: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
b1a0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
b1b0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
b1c0: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
b1d0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
b1e0: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
b1f0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
b200: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
b210: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
b220: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
b230: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
b240: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
b250: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
b260: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
b270: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
b280: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
b290: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
b2a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b2b0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
b2c0: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
b2d0: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
b2e0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
b2f0: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
b300: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
b310: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
b320: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
b330: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
b340: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
b350: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
b360: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
b370: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
b380: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
b390: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
b3a0: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
b3b0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
b3c0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
b3d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b3e0: 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20  tine has either 
b3f0: 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72  3 or 6 parameter
b400: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  s depending on w
b410: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
b420: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
b430: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
b440: 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TA compile-time 
b450: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
b460: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
b470: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
b480: 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65  ETADATA.# define
b490: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
b4a0: 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54  C,D,E,F) columnT
b4b0: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
b4c0: 45 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73  E,F).static cons
b4d0: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
b4e0: 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f  peImpl(.  NameCo
b4f0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45  ntext *pNC, .  E
b500: 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f  xpr *pExpr,.  co
b510: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
b520: 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  gDb,.  const cha
b530: 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20  r **pzOrigTab,. 
b540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
b550: 4f 72 69 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70  OrigCol,.  u8 *p
b560: 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68  EstWidth.){.  ch
b570: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
b580: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
b590: 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  nst *zOrigTab = 
b5a0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
b5b0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
b5c0: 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69  else /* if !defi
b5d0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b5e0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b5f0: 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63  A) */.# define c
b600: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
b610: 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70  D,E,F) columnTyp
b620: 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61  eImpl(A,B,F).sta
b630: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
b640: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a  columnTypeImpl(.
b650: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
b660: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
b670: 70 72 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69  pr,.  u8 *pEstWi
b680: 64 74 68 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a  dth.){.#endif /*
b690: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b6a0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
b6b0: 45 54 41 44 41 54 41 29 20 2a 2f 0a 20 20 63 68  ETADATA) */.  ch
b6c0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
b6d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
b6e0: 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b  u8 estWidth = 1;
b6f0: 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  ..  if( NEVER(pE
b700: 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e  xpr==0) || pNC->
b710: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
b720: 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68  turn 0;.  switch
b730: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
b740: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
b750: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
b760: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
b770: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
b780: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
b790: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
b7a0: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
b7b0: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
b7c0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
b7d0: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
b7e0: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
b7f0: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
b800: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
b810: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
b820: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
b830: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
b840: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b850: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
b860: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
b870: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
b880: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
b890: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b8a0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
b8b0: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
b8c0: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
b8d0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
b8e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
b8f0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
b900: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
b910: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
b920: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
b930: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
b940: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
b950: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
b960: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
b970: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
b980: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54       SrcList *pT
b990: 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  abList = pNC->pS
b9a0: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  rcList;.        
b9b0: 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69  for(j=0;j<pTabLi
b9c0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
b9d0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
b9e0: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
b9f0: 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  e;j++);.        
ba00: 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  if( j<pTabList->
ba10: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
ba20: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
ba30: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
ba40: 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61          pS = pTa
ba50: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c  bList->a[j].pSel
ba60: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ect;.        }el
ba70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
ba80: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
ba90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
baa0: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
bab0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
bac0: 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20  /* At one time, 
bad0: 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45  code such as "SE
bae0: 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68  LECT new.x" with
baf0: 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75  in a trigger wou
bb00: 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ld.        ** ca
bb10: 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69  use this conditi
bb20: 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63  on to run.  Sinc
bb30: 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20  e then, we have 
bb40: 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77  restructured how
bb50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67  .        ** trig
bb60: 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65  ger code is gene
bb70: 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69  rated and so thi
bb80: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  s condition is n
bb90: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
bba0: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48    ** possible. H
bbb0: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73  owever, it can s
bbc0: 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72  till be true for
bbd0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
bbe0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
bbf0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
bc00: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
bc10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
bc20: 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b  t1(col INTEGER);
bc30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
bc40: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e  LECT (SELECT t1.
bc50: 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74  col) FROM FROM t
bc60: 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  1;.        **.  
bc70: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f        ** when co
bc80: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
bc90: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
bca0: 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20  ession "t1.col" 
bcb0: 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
bcc0: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49  ** sub-select. I
bcd0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74  n this case, set
bce0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
bcf0: 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20   to NULL, even. 
bd00: 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68         ** though
bd10: 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c   it should reall
bd20: 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a  y be "INTEGER"..
bd30: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
bd40: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
bd50: 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20  t a problem, as 
bd60: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
bd70: 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e  of "t1.col" is n
bd80: 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ever.        ** 
bd90: 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d  used. When colum
bda0: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
bdb0: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
bdc0: 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ion .        ** 
bdd0: 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29  "(SELECT t1.col)
bde0: 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  ", the correct t
bdf0: 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ype is returned 
be00: 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45  (see the TK_SELE
be10: 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72  CT.        ** br
be20: 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  anch below.  */.
be30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
be40: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
be50: 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45  sert( pTab && pE
be60: 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20  xpr->pTab==pTab 
be70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
be80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
be90: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
bea0: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
beb0: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
bec0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
bed0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
bee0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
bef0: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
bf00: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
bf10: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
bf20: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
bf30: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
bf40: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
bf50: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
bf60: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
bf70: 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Col>=0 && ALWAYS
bf80: 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74  (iCol<pS->pEList
bf90: 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
bfa0: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c        /* If iCol
bfb0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
bfc0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ro, then the exp
bfd0: 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73  ression requests
bfe0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
bff0: 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73  * rowid of the s
c000: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
c010: 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69  w. This expressi
c020: 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65  on is legal (see
c030: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
c040: 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32  est case misc2.2
c050: 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20  .2) - it always 
c060: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
c070: 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  L..          */.
c080: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f            NameCo
c090: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
c0a0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
c0b0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  S->pEList->a[iCo
c0c0: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  l].pExpr;.      
c0d0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
c0e0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
c0f0: 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74         sNC.pNext
c100: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20   = pNC;.        
c110: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
c120: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
c130: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
c140: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
c150: 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67  ,&zOrigDb,&zOrig
c160: 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  Tab,&zOrigCol, &
c170: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
c180: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
c190: 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68  e if( pTab->pSch
c1a0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ema ){.        /
c1b0: 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a  * A real table *
c1c0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
c1d0: 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20  ( !pS );.       
c1e0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
c1f0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
c200: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c210: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
c220: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
c230: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69  Tab->nCol) );.#i
c240: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c250: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c260: 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  TA.        if( i
c270: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
c280: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
c290: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
c2a0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69  zOrigCol = "rowi
c2b0: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
c2c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
c2d0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
c2e0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
c2f0: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
c300: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c310: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
c320: 20 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70      estWidth = p
c330: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c340: 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  szEst;.        }
c350: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61  .        zOrigTa
c360: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
c370: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
c380: 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  ->pParse ){.    
c390: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
c3a0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
c3b0: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
c3c0: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
c3d0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
c3e0: 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70  zOrigDb = pNC->p
c3f0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
c400: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  Db].zName;.     
c410: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
c420: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
c430: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
c440: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
c450: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c460: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
c470: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c480: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
c490: 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62   estWidth = pTab
c4a0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45  ->aCol[iCol].szE
c4b0: 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  st;.        }.#e
c4c0: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
c4d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c4e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c4f0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
c500: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
c510: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
c520: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
c530: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
c540: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
c550: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
c560: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
c570: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
c580: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
c590: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
c5a0: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
c5b0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
c5c0: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
c5d0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
c5e0: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
c5f0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
c600: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
c610: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  pS->pEList->a[0]
c620: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
c630: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
c640: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
c650: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
c660: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
c670: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
c680: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
c690: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
c6a0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
c6b0: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
c6c0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
c6d0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
c6e0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
c6f0: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
c700: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
c710: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
c720: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c730: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c740: 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70  TADATA  .  if( p
c750: 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61  zOrigDb ){.    a
c760: 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62  ssert( pzOrigTab
c770: 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b   && pzOrigCol );
c780: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d  .    *pzOrigDb =
c790: 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70   zOrigDb;.    *p
c7a0: 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67  zOrigTab = zOrig
c7b0: 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  Tab;.    *pzOrig
c7c0: 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a  Col = zOrigCol;.
c7d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
c7e0: 20 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45   pEstWidth ) *pE
c7f0: 73 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64  stWidth = estWid
c800: 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79  th;.  return zTy
c810: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  pe;.}../*.** Gen
c820: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
c830: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
c840: 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  BE the declarati
c850: 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75  on types of colu
c860: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
c870: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
c880: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
c890: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20  eColumnTypes(.  
c8a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c8b0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
c8c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
c8d0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
c8e0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
c8f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
c900: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
c910: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
c920: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
c930: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
c940: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
c950: 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  YPE.  Vdbe *v = 
c960: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
c970: 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
c980: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43  ntext sNC;.  sNC
c990: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
c9a0: 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72  List;.  sNC.pPar
c9b0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
c9c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
c9d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c9e0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
c9f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
ca00: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ca10: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
ca20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
ca30: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
ca40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
ca50: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
ca60: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
ca70: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
ca80: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
ca90: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
caa0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
cab0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
cac0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
cad0: 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  gCol, 0);..    /
cae0: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
caf0: 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70  make its own cop
cb00: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
cb10: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
cb20: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
cb30: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
cb40: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
cb50: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
cb60: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
cb70: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
cb80: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
cb90: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
cba0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cbb0: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
cbc0: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c  SE, zOrigDb, SQL
cbd0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
cbe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
cbf0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
cc00: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
cc10: 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f  OrigTab, SQLITE_
cc20: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
cc30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
cc40: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cc50: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
cc60: 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  gCol, SQLITE_TRA
cc70: 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20  NSIENT);.#else. 
cc80: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
cc90: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
cca0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
ccb0: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
ccc0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
ccd0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
cce0: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
ccf0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
cd00: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
cd10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
cd20: 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d  T_DECLTYPE) */.}
cd30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
cd40: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
cd50: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
cd60: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
cd70: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
cd80: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
cd90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
cda0: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
cdb0: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
cdc0: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
cdd0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
cde0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
cdf0: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
ce00: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
ce10: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
ce20: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
ce30: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
ce40: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
ce50: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
ce60: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
ce70: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
ce80: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
ce90: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
cea0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
ceb0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
cec0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ced0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
cee0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
cef0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
cf00: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
cf10: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
cf20: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
cf30: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
cf40: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
cf50: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
cf60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
cf70: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
cf80: 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52  amesSet || NEVER
cf90: 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  (v==0) || db->ma
cfa0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
cfb0: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
cfc0: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
cfd0: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
cfe0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
cff0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
d000: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
d010: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
d020: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
d030: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
d040: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
d050: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
d060: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
d070: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
d080: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
d090: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
d0a0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
d0b0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d      if( NEVER(p=
d0c0: 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
d0d0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
d0e0: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
d0f0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
d100: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
d110: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
d120: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d130: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d140: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
d150: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d160: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
d170: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
d180: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  || p->op==TK_AGG
d190: 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62  _COLUMN) && pTab
d1a0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
d1b0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
d1c0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
d1d0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
d1e0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
d1f0: 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28  for(j=0; ALWAYS(
d200: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
d210: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); j++){.       
d220: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
d230: 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e  [j].iCursor==p->
d240: 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a  iTable ) break;.
d250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
d260: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
d270: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
d280: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
d290: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
d2a0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
d2b0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
d2c0: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
d2d0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
d2e0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
d2f0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
d300: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
d310: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
d320: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
d330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
d340: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
d350: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
d360: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
d370: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
d380: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
d390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d3a0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d3b0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20  COLNAME_NAME, . 
d3c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d3d0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
d3e0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
d3f0: 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  n), SQLITE_DYNAM
d400: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
d410: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29   if( fullNames )
d420: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
d430: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
d440: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
d450: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
d460: 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
d470: 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  me, zCol);.     
d480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d490: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d4a0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
d4b0: 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  me, SQLITE_DYNAM
d4c0: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
d4d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d4e0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d4f0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d500: 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45  ME, zCol, SQLITE
d510: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d520: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
d530: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
d540: 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *z = pEList->a[
d550: 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  i].zSpan;.      
d560: 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74  z = z==0 ? sqlit
d570: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63  e3MPrintf(db, "c
d580: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a  olumn%d", i+1) :
d590: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
d5a0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  (db, z);.      s
d5b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d5c0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d5d0: 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49  ME_NAME, z, SQLI
d5e0: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
d5f0: 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74   }.  }.  generat
d600: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
d610: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
d620: 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  EList);.}../*.**
d630: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
d640: 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68  sion list (which
d650: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c   is really the l
d660: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
d670: 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20  ns.** that form 
d680: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
d690: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
d6a0: 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70  ment) compute ap
d6b0: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c  propriate.** col
d6c0: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20  umn names for a 
d6d0: 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64  table that would
d6e0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
d6f0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
d700: 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   All column name
d710: 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65  s will be unique
d720: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
d730: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   column names ar
d740: 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c  e computed.  Col
d750: 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d  umn.zType, Colum
d760: 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20  n.zColl,.** and 
d770: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
d780: 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65  Column are zeroe
d790: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
d7a0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
d7b0: 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f  cess.  If a memo
d7c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
d7d0: 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73  ror occurs,.** s
d7e0: 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61  tore NULL in *pa
d7f0: 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e  Col and 0 in *pn
d800: 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Col and return S
d810: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
d820: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
d830: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
d840: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
d850: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d860: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d870: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
d880: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
d890: 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f  /* Expr list fro
d8a0: 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76  m which to deriv
d8b0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
d8c0: 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20  /.  i16 *pnCol, 
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
d8e0: 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
d8f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20  of columns here 
d900: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61  */.  Column **pa
d910: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Col          /* 
d920: 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f  Write the new co
d930: 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a  lumn list here *
d940: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d950: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d960: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
d970: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
d980: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
d990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
d9a0: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
d9b0: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d9d0: 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d  Index added to m
d9e0: 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69  ake the name uni
d9f0: 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  que */.  Column 
da00: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20  *aCol, *pCol;   
da10: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
da20: 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20  ing over result 
da30: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
da40: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
da50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
da60: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
da70: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
da80: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20  */.  Expr *p;   
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
dab0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  or a single resu
dac0: 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  lt column */.  c
dad0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
dae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
daf0: 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  lumn name */.  i
db00: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
db10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
db20: 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e  ze of name in zN
db30: 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20  ame[] */..  if( 
db40: 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43  pEList ){.    nC
db50: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
db60: 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73  pr;.    aCol = s
db70: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
db80: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43  ro(db, sizeof(aC
db90: 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20  ol[0])*nCol);.  
dba0: 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c    testcase( aCol
dbb0: 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
dbc0: 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
dbd0: 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a    aCol = 0;.  }.
dbe0: 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b    *pnCol = nCol;
dbf0: 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c  .  *paCol = aCol
dc00: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  ;..  for(i=0, pC
dc10: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b  ol=aCol; i<nCol;
dc20: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
dc30: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
dc40: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
dc50: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
dc60: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
dc70: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
dc80: 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  te(pEList->a[i].
dc90: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
dca0: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
dcb0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
dcc0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
dcd0: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
dce0: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
dcf0: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
dd00: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
dd10: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
dd20: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
dd30: 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  p(db, zName);.  
dd40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
dd50: 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
dd60: 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  p;  /* The expre
dd70: 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68  ssion that is th
dd80: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
dd90: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61  name */.      Ta
dda0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
ddb0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f     /* Table asso
ddc0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
ddd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
dde0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c       while( pCol
ddf0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  Expr->op==TK_DOT
de00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
de10: 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Expr = pColExpr-
de20: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
de30: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
de40: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  r!=0 );.      }.
de50: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78        if( pColEx
de60: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
de70: 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c  N && ALWAYS(pCol
de80: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29  Expr->pTab!=0) )
de90: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
dea0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65   columns use the
deb0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d   column name nam
dec0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
ded0: 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72   iCol = pColExpr
dee0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
def0: 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78     pTab = pColEx
df00: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
df10: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
df20: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
df30: 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  y;.        zName
df40: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
df50: 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20  f(db, "%s",.    
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
df70: 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f  l>=0 ? pTab->aCo
df80: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20  l[iCol].zName : 
df90: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
dfa0: 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78  }else if( pColEx
dfb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pr->op==TK_ID ){
dfc0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
dfd0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
dfe0: 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49  y(pColExpr, EP_I
dff0: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
e000: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e010: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e020: 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75  %s", pColExpr->u
e030: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
e040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
e050: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
e060: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
e070: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
e080: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
e090: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
e0a0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
e0b0: 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d  b, "%s", pEList-
e0c0: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[i].zSpan);.  
e0d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e0e0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
e0f0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  iled ){.      sq
e100: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e110: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
e120: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
e130: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
e140: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
e150: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
e160: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
e170: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
e180: 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
e190: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
e1a0: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
e1b0: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
e1c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
e1d0: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
e1e0: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
e1f0: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
e200: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e210: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
e220: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
e230: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e240: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
e250: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66  int k;.        f
e260: 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e  or(k=nName-1; k>
e270: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  1 && sqlite3Isdi
e280: 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b  git(zName[k]); k
e290: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
e2a0: 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b  ( k>=0 && zName[
e2b0: 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20  k]==':' ) nName 
e2c0: 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = k;.        zNa
e2d0: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
e2e0: 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20         zNewName 
e2f0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e300: 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e  (db, "%s:%d", zN
e310: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
e320: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e330: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
e340: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a         zName = z
e350: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
e360: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
e370: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
e380: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
e390: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
e3a0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
e3b0: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
e3c0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e3d0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
e3e0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
e3f0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
e400: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
e410: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
e420: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
e430: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
e440: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
e450: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e460: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
e470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e480: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
e490: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
e4a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
e4b0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
e4c0: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
e4d0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
e4e0: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
e4f0: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
e500: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
e510: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
e520: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
e530: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
e540: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
e550: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
e560: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
e570: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
e580: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
e590: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
e5a0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
e5b0: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
e5c0: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
e5d0: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
e5e0: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
e5f0: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
e600: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
e610: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
e620: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
e630: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e640: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e650: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
e660: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
e670: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
e680: 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
e690: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
e6a0: 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
e6b0: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
e6c0: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
e6d0: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
e6e0: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
e6f0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e700: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e710: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
e720: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
e730: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
e740: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
e750: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
e760: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e770: 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c  m *a;.  u64 szAl
e780: 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
e790: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
e7a0: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
e7b0: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
e7c0: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
e7d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
e7e0: 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
e7f0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
e800: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e810: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
e820: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
e830: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
e840: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
e850: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
e860: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
e870: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
e880: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
e890: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
e8a0: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
e8b0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
e8c0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
e8d0: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
e8e0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
e8f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e900: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
e910: 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43  NC, p,0,0,0, &pC
e920: 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20  ol->szEst));.   
e930: 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e   szAll += pCol->
e940: 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d  szEst;.    pCol-
e950: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
e960: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
e970: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
e980: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
e990: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
e9a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
e9b0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
e9c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e9d0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
e9e0: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
e9f0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
ea00: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
ea10: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
ea20: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
ea30: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
ea40: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
ea50: 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  szAll*4);.}../*.
ea60: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
ea70: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
ea80: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
ea90: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
eaa0: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
eab0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
eac0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
ead0: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
eae0: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
eaf0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
eb00: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
eb10: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
eb20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
eb30: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
eb40: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
eb50: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
eb60: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
eb70: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
eb80: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
eb90: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
eba0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
ebb0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
ebc0: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
ebd0: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
ebe0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
ebf0: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
ec00: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
ec10: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
ec20: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
ec30: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
ec40: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
ec50: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
ec60: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
ec70: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
ec80: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
ec90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
eca0: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
ecb0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
ecc0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
ecd0: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
ece0: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
ecf0: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
ed00: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
ed10: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
ed20: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
ed30: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
ed40: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
ed50: 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
ed60: 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
ed70: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
ed80: 38 35 37 36 29 20 29 3b 0a 20 20 73 65 6c 65 63  8576) );.  selec
ed90: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
eda0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
edb0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
edc0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
edd0: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63  ->aCol);.  selec
ede0: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
edf0: 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
ee00: 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74  e, pTab, pSelect
ee10: 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
ee20: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d   = -1;.  if( db-
ee30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
ee40: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
ee50: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
ee60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
ee70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
ee80: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ab;.}../*.** Get
ee90: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
eea0: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
eeb0: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
eec0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
eed0: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
eee0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
eef0: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
ef00: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
ef10: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
ef20: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
ef30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
ef40: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ef50: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
ef60: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
ef70: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
ef80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
ef90: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  te(pParse);.    
efa0: 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56  if( v ) sqlite3V
efb0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
efc0: 49 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Init);.    if( p
efd0: 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
efe0: 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69  ==0.     && Opti
eff0: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
f000: 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
f010: 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
f020: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
f030: 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
f040: 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ctor = 1;.    }.
f050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
f060: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
f070: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
f080: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
f090: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
f0a0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
f0b0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
f0c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
f0d0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
f0e0: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
f0f0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
f100: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
f110: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
f120: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
f130: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
f140: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
f150: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
f160: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
f170: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
f180: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
f190: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
f1a0: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
f1b0: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
f1c0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
f1d0: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
f1e0: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
f1f0: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
f200: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
f210: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
f220: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
f230: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
f240: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
f250: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
f260: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
f270: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
f280: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
f290: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
f2a0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
f2b0: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
f2c0: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
f2d0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
f2e0: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
f2f0: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
f300: 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
f310: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
f320: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
f330: 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
f340: 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
f350: 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
f360: 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
f370: 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
f380: 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
f390: 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
f3a0: 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
f3b0: 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
f3c0: 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
f3d0: 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
f3e0: 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
f3f0: 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20  ly if pLimit!=0 
f400: 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f  or pOffset!=0 do
f410: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
f420: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
f430: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
f440: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
f450: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
f460: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
f470: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
f480: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
f490: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
f4a0: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
f4b0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
f4c0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
f4d0: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
f4e0: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
f4f0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
f500: 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b  *p, int iBreak){
f510: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a  .  Vdbe *v = 0;.
f520: 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
f530: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
f540: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b  .  int addr1, n;
f550: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
f560: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
f570: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
f580: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
f590: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
f5a0: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
f5b0: 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77  troversy about w
f5c0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
f5d0: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
f5e0: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
f5f0: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
f600: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
f610: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
f620: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
f630: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
f640: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
f650: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  se);.  assert( p
f660: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  ->pOffset==0 || 
f670: 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  p->pLimit!=0 );.
f680: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
f690: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
f6a0: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
f6b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f6c0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
f6d0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
f6e0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
f6f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
f700: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
f710: 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20  pLimit, &n) ){. 
f720: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f730: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
f740: 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29  eger, n, iLimit)
f750: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
f760: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
f770: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
f780: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
f790: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f7a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
f7b0: 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20  o, 0, iBreak);. 
f7c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
f7d0: 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  >=0 && p->nSelec
f7e0: 74 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20  tRow>(u64)n ){. 
f7f0: 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
f800: 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20  tRow = n;.      
f810: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
f820: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f830: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
f840: 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  imit, iLimit);. 
f850: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f860: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
f870: 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
f880: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f890: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
f8a0: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
f8b0: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
f8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f8d0: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
f8e0: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
f8f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f910: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
f920: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
f930: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
f940: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
f950: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
f960: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
f970: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
f980: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
f990: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
f9a0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f9b0: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
f9c0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
f9d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f9e0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f9f0: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
fa00: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fa10: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fa20: 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
fa30: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64  er"));.      add
fa40: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
fa50: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
fa60: 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64  os, iOffset); Vd
fa70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
fa80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fa90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
faa0: 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74  eger, 0, iOffset
fab0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fac0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
fad0: 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71  addr1);.      sq
fae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
faf0: 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69  v, OP_Add, iLimi
fb00: 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66  t, iOffset, iOff
fb10: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64  set+1);.      Vd
fb20: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
fb30: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
fb40: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
fb50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fb60: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69  v, OP_IfPos, iLi
fb70: 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
fb80: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
fb90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fba0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31  , OP_Integer, -1
fbb0: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
fbc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
fbd0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
fbe0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
fbf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fc00: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
fc10: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
fc20: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
fc30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fc40: 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
fc50: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
fc60: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
fc70: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
fc80: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
fc90: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
fca0: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
fcb0: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
fcc0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
fcd0: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
fce0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
fcf0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
fd00: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
fd10: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
fd20: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
fd30: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
fd40: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
fd50: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
fd60: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
fd70: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
fd80: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
fd90: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
fda0: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
fdb0: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
fdc0: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
fdd0: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
fde0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
fdf0: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
fe00: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
fe10: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
fe20: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
fe30: 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d  0 );.  if( pRet=
fe40: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45  =0 && iCol<p->pE
fe50: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
fe60: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
fe70: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
fe80: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
fe90: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
fea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
feb0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
fec0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
fed0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
fee0: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
fef0: 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
ff00: 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20  LECT.** with an 
ff10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
ff20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
ff30: 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74  llocates and ret
ff40: 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a  urns a KeyInfo.*
ff50: 2a 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74  * structure suit
ff60: 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65  able for impleme
ff70: 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  nting the ORDER 
ff80: 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  BY..**.** Space 
ff90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
ffa0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
ffb0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
ffc0: 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69  alloc. The calli
ffd0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
ffe0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
fff0: 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
10000 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
10010 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
10020 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
10030 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53   KeyInfo *multiS
10040 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
10050 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
10060 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
10070 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70  t nExtra){.  Exp
10080 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
10090 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
100a0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20   int nOrderBy = 
100b0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
100c0 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr;.  sqlite3 *d
100d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
100e0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20    KeyInfo *pRet 
100f0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
10100 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72  Alloc(db, nOrder
10110 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20  By+nExtra, 1);. 
10120 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
10130 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
10140 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
10150 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
10160 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
10170 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64  m *pItem = &pOrd
10180 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  erBy->a[i];.    
10190 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20    Expr *pTerm = 
101a0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
101b0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
101c0 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ll;..      if( p
101d0 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50  Term->flags & EP
101e0 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  _Collate ){.    
101f0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
10200 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
10210 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20  Parse, pTerm);. 
10220 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10230 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
10240 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
10250 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d  Parse, p, pItem-
10260 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
10270 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  -1);.        if(
10280 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
10290 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
102a0 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  l;.        pOrde
102b0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
102c0 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
102d0 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
102e0 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20  eString(pParse, 
102f0 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  pTerm, pColl->zN
10300 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
10310 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10320 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
10330 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20  eable(pRet) );. 
10340 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c       pRet->aColl
10350 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
10360 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72     pRet->aSortOr
10370 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
10380 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
10390 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
103a0 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
103b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
103c0 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68  MIT_CTE./*.** Th
103d0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
103e0 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74  ates VDBE code t
103f0 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
10400 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20  ntent of a WITH 
10410 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65  RECURSIVE.** que
10420 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ry of the form:.
10430 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69  **.**   <recursi
10440 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73  ve-table> AS (<s
10450 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f  etup-query> UNIO
10460 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69  N [ALL] <recursi
10470 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20  ve-query>).**   
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
104a0 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  __/             
104b0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
104c0 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
104e0 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20  ->pPrior        
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a                p.
10500 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  **.**.** There i
10510 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65  s exactly one re
10520 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72  ference to the r
10530 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69  ecursive-table i
10540 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
10550 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76  e.** of recursiv
10560 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20  e-query, marked 
10570 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74  with the SrcList
10580 2d 3e 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76  ->a[].isRecursiv
10590 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  e flag..**.** Th
105a0 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75  e setup-query ru
105b0 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72  ns once to gener
105c0 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73  ate an initial s
105d0 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  et of rows that 
105e0 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65  go.** into a Que
105f0 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20  ue table.  Rows 
10600 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
10610 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62  om the Queue tab
10620 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65  le one by.** one
10630 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72  .  Each row extr
10640 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
10650 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44   is output to pD
10660 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73  est.  Then the s
10670 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74  ingle.** extract
10680 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74  ed row (now in t
10690 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c  he iCurrent tabl
106a0 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  e) becomes the c
106b0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  ontent of the.**
106c0 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
106d0 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65   for a recursive
106e0 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65  -query run.  The
106f0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72   output of the r
10700 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a  ecursive-query.*
10710 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20  * is added back 
10720 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
10730 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74  able.  Then anot
10740 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61  her row is extra
10750 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a  cted from Queue.
10760 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ** and the itera
10770 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75  tion continues u
10780 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74  ntil the Queue t
10790 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
107a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70  *.** If the comp
107b0 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61  ound query opera
107c0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65  tor is UNION the
107d0 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72  n no duplicate r
107e0 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20  ows are ever.** 
107f0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
10800 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
10810 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61  The iDistinct ta
10820 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79  ble keeps a copy
10830 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20   of all rows.** 
10840 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62  that have ever b
10850 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
10860 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73  o Queue and caus
10870 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f  es duplicates to
10880 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64   be.** discarded
10890 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  .  If the operat
108a0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c  or is UNION ALL,
108b0 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73   then duplicates
108c0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
108d0 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72   .** If the quer
108e0 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42  y has an ORDER B
108f0 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20  Y, then entries 
10900 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62  in the Queue tab
10910 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a  le are kept in.*
10920 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  * ORDER BY order
10930 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65   and the first e
10940 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65  ntry is extracte
10950 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65  d for each cycle
10960 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e  .  Without.** an
10970 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51   ORDER BY, the Q
10980 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75  ueue table is ju
10990 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a  st a FIFO..**.**
109a0 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   If a LIMIT clau
109b0 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20  se is provided, 
109c0 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69  then the iterati
109d0 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c  on stops after L
109e0 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76  IMIT rows.** hav
109f0 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f  e been output to
10a00 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54   pDest.  A LIMIT
10a10 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74   of zero means t
10a20 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73  o output no rows
10a30 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69   and a.** negati
10a40 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74  ve LIMIT means t
10a50 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77  o output all row
10a60 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
10a70 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63  also an OFFSET c
10a80 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20  lause.** with a 
10a90 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20  positive value, 
10aa0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f  then the first O
10ab0 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72  FFSET outputs ar
10ac0 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68  e discarded rath
10ad0 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67  er.** than being
10ae0 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20   sent to pDest. 
10af0 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74   The LIMIT count
10b00 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
10b10 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53  until after OFFS
10b20 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20  ET.** rows have 
10b30 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  been skipped..*/
10b40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
10b50 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
10b60 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65  veQuery(.  Parse
10b70 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10b80 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10b90 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10ba0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
10bb0 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20  * The recursive 
10bc0 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64  SELECT to be cod
10bd0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
10be0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
10bf0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
10c00 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
10c10 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
10c20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
10c30 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
10c40 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72   clause of the r
10c50 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
10c60 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  /.  int nCol = p
10c70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
10c80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
10c90 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
10ca0 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f  cursive table */
10cb0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10cc0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
10cd0 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
10ce0 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
10cf0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
10d00 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75  .  Select *pSetu
10d10 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20  p = p->pPrior;  
10d20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75   /* The setup qu
10d30 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ery */.  int add
10d40 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
10d50 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
10d60 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
10d70 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  nt addrCont, add
10d80 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20  rBreak;      /* 
10d90 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45  CONTINUE and BRE
10da0 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  AK addresses */.
10db0 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
10dc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10dd0 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74  /* The Current t
10de0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
10df0 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  gCurrent;       
10e00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
10e10 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72  ter holding Curr
10e20 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
10e30 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20  nt iQueue;      
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e50 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  The Queue table 
10e60 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e  */.  int iDistin
10e70 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ct = 0;         
10e80 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
10e90 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69  unique results i
10ea0 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74  f UNION */.  int
10eb0 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66   eDest = SRT_Fif
10ec0 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  o;         /* Ho
10ed0 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75  w to write to Qu
10ee0 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  eue */.  SelectD
10ef0 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20  est destQueue;  
10f00 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
10f10 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20  Dest targetting 
10f20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10f30 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10f60 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
10f90 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  code */.  ExprLi
10fa0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
10fb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
10fc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
10fd0 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
10fe0 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20  , *pOffset;     
10ff0 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54    /* Saved LIMIT
11000 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20   and OFFSET */. 
11010 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72   int regLimit, r
11020 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  egOffset;      /
11030 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64  * Registers used
11040 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   by LIMIT and OF
11050 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  FSET */..  /* Ob
11060 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  tain authorizati
11070 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72  on to do a recur
11080 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
11090 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
110a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
110b0 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30  ITE_RECURSIVE, 0
110c0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
110d0 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
110e0 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
110f0 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66  FSET clauses, if
11100 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20   they exist */. 
11110 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
11120 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11130 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
11140 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
11150 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65  arse, p, addrBre
11160 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20  ak);.  pLimit = 
11170 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66  p->pLimit;.  pOf
11180 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
11190 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20  t;.  regLimit = 
111a0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67  p->iLimit;.  reg
111b0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
111c0 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  set;.  p->pLimit
111d0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20   = p->pOffset = 
111e0 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  0;.  p->iLimit =
111f0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
11200 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
11210 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a  >pOrderBy;..  /*
11220 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73   Locate the curs
11230 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
11240 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
11250 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57  /.  for(i=0; ALW
11260 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63  AYS(i<pSrc->nSrc
11270 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
11280 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65   pSrc->a[i].isRe
11290 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
112a0 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63   iCurrent = pSrc
112b0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[i].iCursor;.
112c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
112d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
112e0 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75  ocate cursors nu
112f0 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20  mbers for Queue 
11300 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54  and Distinct.  T
11310 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
11320 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69   for.  ** the Di
11330 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73  stinct table mus
11340 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  t be exactly one
11350 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75   greater than Qu
11360 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a  eue in order.  *
11370 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69  * for the SRT_Di
11380 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44  stFifo and SRT_D
11390 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61  istQueue destina
113a0 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a  tions to work. *
113b0 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61  /.  iQueue = pPa
113c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
113d0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
113e0 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20  ON ){.    eDest 
113f0 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54  = pOrderBy ? SRT
11400 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54  _DistQueue : SRT
11410 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69  _DistFifo;.    i
11420 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
11430 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c  e->nTab++;.  }el
11440 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  se{.    eDest = 
11450 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51  pOrderBy ? SRT_Q
11460 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b  ueue : SRT_Fifo;
11470 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
11480 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
11490 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20  stQueue, eDest, 
114a0 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41  iQueue);..  /* A
114b0 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20  llocate cursors 
114c0 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65  for Current, Que
114d0 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74  ue, and Distinct
114e0 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e  . */.  regCurren
114f0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
11500 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
11510 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
11520 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65  enPseudo, iCurre
11530 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20  nt, regCurrent, 
11540 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72  nCol);.  if( pOr
11550 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
11560 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
11570 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
11580 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
11590 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71  e, p, 1);.    sq
115a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
115b0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
115c0 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  ral, iQueue, pOr
115d0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
115e0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
115f0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
11600 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
11610 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51  INFO);.    destQ
11620 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20  ueue.pOrderBy = 
11630 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73  pOrderBy;.  }els
11640 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
11650 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
11660 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
11670 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  ueue, nCol);.  }
11680 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
11690 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22  v, "Queue table"
116a0 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69  ));.  if( iDisti
116b0 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64  nct ){.    p->ad
116c0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
116d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
116e0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
116f0 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74  meral, iDistinct
11700 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c  , 0);.    p->sel
11710 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
11720 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a  Ephemeral;.  }..
11730 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20    /* Detach the 
11740 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11750 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e  from the compoun
11760 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d  d SELECT */.  p-
11770 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a  >pOrderBy = 0;..
11780 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
11790 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
117a0 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65  tup-query in Que
117b0 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d  ue. */.  pSetup-
117c0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63  >pNext = 0;.  rc
117d0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
117e0 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c  (pParse, pSetup,
117f0 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20   &destQueue);.  
11800 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20  pSetup->pNext = 
11810 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  p;.  if( rc ) go
11820 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  to end_of_recurs
11830 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a  ive_query;..  /*
11840 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72   Find the next r
11850 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20  ow in the Queue 
11860 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20  and output that 
11870 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  row */.  addrTop
11880 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11890 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
118a0 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42  d, iQueue, addrB
118b0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
118c0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72  age(v);..  /* Tr
118d0 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20  ansfer the next 
118e0 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65  row in Queue ove
118f0 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a  r to Current */.
11900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11910 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
11920 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a  w, iCurrent); /*
11930 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e   To reset column
11940 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20   cache */.  if( 
11950 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11970 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
11980 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
11990 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75  ->nExpr+1, regCu
119a0 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  rrent);.  }else{
119b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
119c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
119d0 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65  Data, iQueue, re
119e0 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20  gCurrent);.  }. 
119f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11a00 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
11a10 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
11a20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c  Output the singl
11a30 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
11a40 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d   */.  addrCont =
11a50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11a60 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65  Label(v);.  code
11a70 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66  Offset(v, regOff
11a80 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  set, addrCont);.
11a90 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
11aa0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
11ab0 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74  pEList, iCurrent
11ac0 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
11ad0 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
11ae0 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
11af0 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
11b00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b10 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
11b20 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
11b30 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
11b40 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11b50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
11b60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11b70 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
11b80 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
11b90 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
11ba0 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
11bb0 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
11bc0 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
11bd0 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
11be0 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
11bf0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
11c00 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
11c10 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
11c20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  0;.  sqlite3Sele
11c30 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
11c40 65 73 74 51 75 65 75 65 29 3b 0a 20 20 61 73 73  estQueue);.  ass
11c50 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
11c60 30 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  0 );.  p->pPrior
11c70 20 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f 2a   = pSetup;..  /*
11c80 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
11c90 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
11ca0 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
11cb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11cc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
11cd0 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  o, 0, addrTop);.
11ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11cf0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
11d00 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66  rBreak);..end_of
11d10 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
11d20 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
11d30 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
11d40 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
11d50 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42  y);.  p->pOrderB
11d60 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11d70 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
11d80 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  it;.  p->pOffset
11d90 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65   = pOffset;.  re
11da0 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
11db0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  * SQLITE_OMIT_CT
11dc0 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  E */../* Forward
11dd0 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73   references */.s
11de0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
11df0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
11e00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11e10 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11e20 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
11e30 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
11e40 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
11e50 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
11e60 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
11e70 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
11e80 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
11e90 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
11ea0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a   results */.);..
11eb0 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73  /*.** Error mess
11ec0 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f  age for when two
11ed0 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f   or more terms o
11ee0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
11ef0 65 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65  ect have differe
11f00 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c  nt.** size resul
11f10 74 20 73 65 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  t sets..*/.stati
11f20 63 20 76 6f 69 64 20 73 65 6c 65 63 74 57 72 6f  c void selectWro
11f30 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28  ngNumTermsError(
11f40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
11f50 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
11f60 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
11f70 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20  F_Values ){.    
11f80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11f90 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c  pParse, "all VAL
11fa0 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68  UES must have th
11fb0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
11fc0 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73   terms");.  }els
11fd0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
11fe0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11ff0 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
12000 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
12010 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
12020 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
12030 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
12040 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
12050 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
12060 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
12070 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
12080 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
12090 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
120a0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
120b0 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
120c0 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
120d0 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
120e0 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
120f0 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
12100 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
12110 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
12120 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
12130 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
12140 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
12150 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
12160 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
12170 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
12180 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
12190 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
121a0 2a 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20  **   (1) It has 
121b0 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53  no LIMIT or OFFS
121c0 45 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20  ET.**   (2) All 
121d0 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
121e0 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
121f0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
12200 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74  Y clause.*/.stat
12210 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
12220 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73  ctValues(.  Pars
12230 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12240 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
12250 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
12260 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12270 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
12280 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
12290 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
122a0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
122b0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
122c0 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
122d0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ults */.){.  Sel
122e0 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69  ect *pPrior;.  i
122f0 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
12300 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
12310 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
12320 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  nt rc = 0;.  ass
12330 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
12340 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
12350 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73   );.  do{.    as
12360 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
12370 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b  s & SF_Values );
12380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12390 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70  op==TK_ALL || (p
123a0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
123b0 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29  && p->pPrior==0)
123c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
123d0 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a  p->pLimit==0 );.
123e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
123f0 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
12400 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
12410 6e 45 78 70 72 21 3d 6e 45 78 70 72 20 29 7b 0a  nExpr!=nExpr ){.
12420 20 20 20 20 20 20 73 65 6c 65 63 74 57 72 6f 6e        selectWron
12430 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70  gNumTermsError(p
12440 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
12450 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
12460 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69  .    if( p->pPri
12470 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or==0 ) break;. 
12480 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50     assert( p->pP
12490 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29  rior->pNext==p )
124a0 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  ;.    p = p->pPr
124b0 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b  ior;.    nRow++;
124c0 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20  .  }while(1);.  
124d0 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
124e0 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
124f0 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  or;.    p->pPrio
12500 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
12510 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12520 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
12530 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
12540 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28   pPrior;.    if(
12550 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
12560 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
12570 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70   nRow;.    p = p
12580 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  ->pNext;.  }.  r
12590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
125a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
125b0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
125c0 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
125d0 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
125e0 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
125f0 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
12600 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
12610 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
12620 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
12630 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
12640 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
12650 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
12660 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
12670 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
12680 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
12690 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
126a0 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
126b0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
126c0 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
126d0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
126e0 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
126f0 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
12700 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
12710 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
12720 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
12730 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
12740 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
12750 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
12760 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
12770 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
12780 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
12790 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
127a0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
127b0 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
127c0 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
127d0 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
127e0 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
127f0 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
12800 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
12810 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
12820 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
12830 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
12840 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
12850 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
12860 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
12870 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
12890 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
128a0 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
128b0 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
128c0 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
128d0 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
128e0 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
128f0 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
12900 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12910 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
12920 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
12930 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
12940 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
12950 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
12960 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
12970 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
12980 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
12990 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
129a0 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
129b0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
129c0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
129d0 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
129e0 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
129f0 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
12a00 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
12a10 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
12a20 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
12a30 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
12a40 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
12a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12a60 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
12a70 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
12a80 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
12a90 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
12aa0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
12ab0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
12ac0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
12ad0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
12ae0 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
12af0 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
12b00 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
12b10 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
12b20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
12b30 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
12b40 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
12b50 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
12b60 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
12b70 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
12b80 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12b90 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
12ba0 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
12bb0 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
12bc0 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
12bd0 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
12be0 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
12bf0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
12c00 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
12c10 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
12c20 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
12c30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12c40 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
12c50 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20  t iSub1 = 0;    
12c60 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
12c70 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
12c80 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20   */.  int iSub2 
12c90 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
12ca0 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
12cb0 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
12cc0 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
12cd0 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
12ce0 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
12cf0 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
12d00 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
12d10 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
12d20 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
12d30 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
12d40 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
12d50 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
12d60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12d70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b   && p->pPrior );
12d80 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e    /* Calling fun
12d90 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73  ction guarantees
12da0 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20   this much */.  
12db0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
12dc0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
12dd0 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70  ive)==0 || p->op
12de0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f  ==TK_ALL || p->o
12df0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
12e00 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
12e10 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
12e20 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d  pPrior;.  dest =
12e30 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
12e40 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
12e50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12e60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
12e70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
12e80 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
12e90 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
12ea0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
12eb0 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
12ec0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
12ed0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
12ee0 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
12ef0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
12f00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12f10 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
12f20 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
12f30 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
12f40 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
12f50 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
12f60 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
12f70 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
12f80 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12f90 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
12fa0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
12fb0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
12fc0 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
12fd0 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
12fe0 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
12ff0 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
13000 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
13010 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
13020 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
13030 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
13040 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
13050 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
13060 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
13070 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13080 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
13090 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
130a0 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
130b0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
130c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
130d0 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
130e0 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65  ORDERED);.    de
130f0 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54  st.eDest = SRT_T
13100 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
13110 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  Special handling
13120 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d   for a compound-
13130 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
13140 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55  inates as a VALU
13150 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ES clause..  */.
13160 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
13170 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
13180 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  e ){.    rc = mu
13190 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
131a0 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
131b0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  );.    goto mult
131c0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
131d0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
131e0 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
131f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
13200 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
13210 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
13220 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
13230 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
13240 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13250 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
13260 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
13270 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
13280 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
13290 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 65  >nExpr ){.    se
132a0 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d  lectWrongNumTerm
132b0 73 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  sError(pParse, p
132c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
132d0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
132e0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23  lect_end;.  }..#
132f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13300 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e  IT_CTE.  if( p->
13310 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
13320 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67  cursive ){.    g
13330 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
13340 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65  siveQuery(pParse
13350 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d  , p, &dest);.  }
13360 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  else.#endif..  /
13370 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
13380 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
13390 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
133a0 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
133b0 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
133c0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
133d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
133e0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
133f0 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
13400 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
13410 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
13420 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
13430 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
13440 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
13450 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
13460 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
13470 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
13480 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
13490 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  t nLimit;.      
134a0 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
134b0 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
134c0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
134d0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  = p->iLimit;.   
134e0 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73     pPrior->iOffs
134f0 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
13500 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
13510 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
13520 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
13530 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
13540 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70  ffset;.      exp
13550 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
13560 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
13570 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
13580 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13590 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
135a0 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
135b0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
135c0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66   0;.      p->pOf
135d0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
135e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
135f0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
13600 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
13610 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
13620 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
13630 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
13640 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  iLimit;.      p-
13650 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
13660 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
13670 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
13680 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  ){.        addr 
13690 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
136a0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
136b0 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62   p->iLimit); Vdb
136c0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
136d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
136e0 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61  t((v, "Jump ahea
136f0 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
13700 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ed"));.      }. 
13710 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
13720 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
13730 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
13740 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
13750 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13760 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
13770 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13790 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
137a0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
137b0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
137c0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
137d0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70  >nSelectRow += p
137e0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
137f0 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  w;.      if( pPr
13800 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20  ior->pLimit.    
13810 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
13820 72 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f  rIsInteger(pPrio
13830 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d  r->pLimit, &nLim
13840 69 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c  it).       && nL
13850 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65  imit>0 && p->nSe
13860 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e  lectRow > (u64)n
13870 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a  Limit .      ){.
13880 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
13890 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a  ctRow = nLimit;.
138a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
138b0 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
138c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
138d0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
138e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
138f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13900 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
13910 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
13920 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
13930 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
13940 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
13950 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
13960 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
13970 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70  t */.      u8 op
13980 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f   = 0;       /* O
13990 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
139a0 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
139b0 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
139c0 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
139d0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
139e0 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
139f0 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
13a00 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
13a10 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
13a20 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
13a30 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
13a40 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
13a50 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
13a60 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
13a70 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
13a80 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
13a90 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
13aa0 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  PT );.      test
13ab0 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
13ac0 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  UNION );.      p
13ad0 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69  riorOp = SRT_Uni
13ae0 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65  on;.      if( de
13af0 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  st.eDest==priorO
13b00 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  p ){.        /* 
13b10 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
13b20 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
13b30 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
13b40 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
13b50 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
13b60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13b70 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
13b80 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  it==0 );      /*
13b90 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
13ba0 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
13bb0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
13bc0 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
13bd0 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  =0 );     /* Not
13be0 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
13bf0 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
13c00 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
13c10 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  b = dest.iSDParm
13c20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13c30 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
13c40 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
13c50 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
13c60 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
13c70 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
13c80 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
13c90 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
13ca0 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
13cb0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
13cc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
13cd0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
13ce0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  =0 );.        ad
13cf0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13d00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
13d10 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
13d20 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
13d30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
13d40 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
13d50 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
13d60 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
13d70 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
13d80 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
13d90 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
13da0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
13db0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13dc0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
13dd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13de0 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
13df0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
13e00 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
13e10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
13e20 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
13e30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13e40 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
13e50 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
13e60 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
13e70 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
13e80 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
13e90 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
13ea0 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
13eb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13ec0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
13ed0 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
13ee0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
13ef0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
13f00 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
13f10 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
13f20 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
13f30 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
13f40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13f50 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
13f60 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  PT ){.        op
13f70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20   = SRT_Except;. 
13f80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13f90 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
13fa0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
13fb0 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
13fc0 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  Union;.      }. 
13fd0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
13fe0 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
13ff0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
14000 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
14010 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
14020 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
14030 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
14040 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e  = 0;.      union
14050 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
14060 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
14070 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
14080 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
14090 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
140a0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
140b0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
140c0 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ondest);.      t
140d0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
140e0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
140f0 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
14100 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
14110 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
14120 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
14130 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72  .      ** Be sur
14140 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70  e to delete p->p
14150 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f  OrderBy, therefo
14160 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  re, to avoid a m
14170 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20  emory leak. */. 
14180 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14190 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
141a0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
141b0 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
141c0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
141d0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
141e0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
141f0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rBy = 0;.      i
14200 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
14210 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ON ) p->nSelectR
14220 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
14230 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
14240 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14250 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
14260 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14270 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
14280 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
14290 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
142a0 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
142b0 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
142c0 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  0;..      /* Con
142d0 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
142e0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
142f0 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
14300 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
14310 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
14320 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
14330 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
14340 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
14350 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
14360 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
14370 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  rOp );.      if(
14380 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
14390 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
143a0 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
143b0 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
143c0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
143d0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
143e0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
143f0 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
14400 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
14410 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
14420 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
14430 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
14440 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
14450 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
14460 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
14470 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
14480 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
14490 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
144a0 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
144b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
144c0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
144d0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
144e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
144f0 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
14500 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
14510 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
14520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14530 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14540 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
14550 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
14560 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14570 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
14580 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
14590 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
145a0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
145b0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
145c0 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a  List, unionTab,.
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
145f0 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
14600 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
14610 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
14620 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
14630 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14640 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14650 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
14660 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
14670 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
14680 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14690 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
146a0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
146b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
146c0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
146d0 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
146e0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
146f0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
14700 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  t: assert( p->op
14710 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
14720 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  ; {.      int ta
14730 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
14740 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
14750 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
14760 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
14770 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
14780 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
14790 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
147a0 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
147b0 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
147c0 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
147d0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
147e0 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
147f0 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
14800 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
14810 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
14820 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
14830 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
14840 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
14850 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
14860 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
14870 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
14880 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14890 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
148a0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
148b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
148c0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
148d0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
148e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
148f0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
14900 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
14910 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
14920 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14930 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
14940 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
14950 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66   = addr;.      f
14960 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
14970 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
14980 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
14990 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
149a0 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
149b0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
149c0 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
149d0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
149e0 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
149f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
14a00 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
14a10 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
14a20 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
14a30 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  b1);.      expla
14a40 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14a50 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
14a60 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14a70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14a80 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
14a90 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64  ior, &intersectd
14aa0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
14ab0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
14ac0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
14ad0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
14ae0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
14af0 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
14b00 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
14b10 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
14b20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
14b30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14b40 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14b50 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
14b60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14b70 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14b80 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
14b90 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
14ba0 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
14bb0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
14bc0 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
14bd0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
14be0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
14bf0 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
14c00 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
14c10 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
14c20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65  0;.      interse
14c30 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
14c40 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70   tab2;.      exp
14c50 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14c60 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
14c70 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
14c80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14c90 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14ca0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
14cb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14cc0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
14cd0 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
14ce0 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
14cf0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
14d00 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
14d10 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
14d20 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
14d30 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
14d40 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
14d50 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
14d60 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14d70 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
14d80 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14d90 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
14da0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
14db0 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f  Offset;..      /
14dc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14dd0 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
14de0 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
14df0 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
14e00 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
14e10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
14e20 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
14e30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
14e40 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
14e50 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53  put ){.        S
14e60 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
14e70 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  p;.        while
14e80 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
14e90 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
14ea0 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
14eb0 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
14ec0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
14ed0 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
14ee0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
14ef0 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
14f00 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14f10 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
14f20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14f30 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
14f40 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
14f50 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
14f60 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
14f70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f80 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
14f90 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20   tab1, iBreak); 
14fa0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14fb0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
14fc0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
14fd0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74  arse);.      iSt
14fe0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
14ff0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
15000 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b  wKey, tab1, r1);
15010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15020 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
15030 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
15040 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b  , iCont, r1, 0);
15050 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
15070 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15080 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
15090 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
150a0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
150b0 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20  EList, tab1,.   
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
150e0 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
150f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15100 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15110 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
15120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15130 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
15140 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  1, iStart); Vdbe
15150 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
15160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
15170 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
15180 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
15190 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
151a0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
151b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
151c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
151d0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
151e0 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
151f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
15200 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
15210 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
15220 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
15230 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
15240 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
15250 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
15260 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
15270 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
15280 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
15290 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
152a0 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
152b0 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
152c0 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
152d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
152e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
152f0 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
15300 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
15310 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
15320 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
15330 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
15340 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
15350 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
15360 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
15370 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
15380 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
15390 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
153a0 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
153b0 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
153c0 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
153d0 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
153e0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
153f0 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
15400 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
15410 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
15420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15430 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15440 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
15450 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
15460 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
15470 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
15480 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
15490 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
154b0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
154c0 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
154d0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
154e0 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
154f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15500 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
15510 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
15520 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
15530 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
15540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15550 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
15560 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
15570 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15580 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
15590 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
155a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
155b0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
155c0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
155d0 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
155e0 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
155f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15600 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
15610 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
15620 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  end;.    }.    f
15630 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
15640 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
15650 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
15660 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
15670 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
15680 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
15690 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
156a0 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
156b0 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
156c0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
156d0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
156e0 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
156f0 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
15700 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
15710 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15720 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
15730 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
15740 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
15750 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
15760 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
15770 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
15780 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
15790 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
157a0 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
157b0 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
157c0 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
157d0 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
157e0 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
157f0 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
15800 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
15810 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
15820 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
15830 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15840 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
15850 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
15860 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
15870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15880 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
15890 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  ddr, (char*)sqli
158a0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
158b0 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  eyInfo),.       
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
158e0 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
158f0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
15900 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
15910 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
15920 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
15930 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
15940 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
15950 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
15960 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44  dest.iSdst;.  pD
15970 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73  est->nSdst = des
15980 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74  t.nSdst;.  sqlit
15990 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
159a0 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
159b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
159c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
159d0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
159e0 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  T */../*.** Code
159f0 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f   an output subro
15a00 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f  utine for a coro
15a10 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
15a20 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  tion of a.** SEL
15a30 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a  ECT statment..**
15a40 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20  .** The data to 
15a50 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e  be output is con
15a60 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69  tained in pIn->i
15a70 53 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65  Sdst.  There are
15a80 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63  .** pIn->nSdst c
15a90 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74  olumns to be out
15aa0 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77  put.  pDest is w
15ab0 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20  here the output 
15ac0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e  should.** be sen
15ad0 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75  t..**.** regRetu
15ae0 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  rn is the number
15af0 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72   of the register
15b00 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62   holding the sub
15b10 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
15b20 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  n address..**.**
15b30 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
15b40 65 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72  en it is the fir
15b50 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61  st register in a
15b60 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20   vector that.** 
15b70 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76  records the prev
15b80 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65  ious output.  me
15b90 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20  m[regPrev] is a 
15ba0 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c  flag that is fal
15bb0 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68  se.** if there h
15bc0 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69  as been no previ
15bd0 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20  ous output.  If 
15be0 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63  regPrev>0 then c
15bf0 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61  ode is.** genera
15c00 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20  ted to suppress 
15c10 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65  duplicates.  pKe
15c20 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f  yInfo is used fo
15c30 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b  r comparing.** k
15c40 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eys..**.** If th
15c50 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e  e LIMIT found in
15c60 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65   p->iLimit is re
15c70 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65  ached, jump imme
15c80 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42  diately to.** iB
15c90 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reak..*/.static 
15ca0 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70  int generateOutp
15cb0 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20  utSubroutine(.  
15cc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15cd0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
15ce0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
15cf0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
15d00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
15d10 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
15d20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
15d30 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pIn,        /* 
15d40 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79  Coroutine supply
15d50 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65  ing data */.  Se
15d60 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
15d70 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
15d80 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20  o send the data 
15d90 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
15da0 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rn,          /* 
15db0 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  The return addre
15dc0 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ss register */. 
15dd0 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20   int regPrev,   
15de0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
15df0 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69  ious result regi
15e00 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65  ster.  No unique
15e10 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b  ness if 0 */.  K
15e20 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
15e30 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f  ,      /* For co
15e40 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65  mparing with pre
15e50 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20  vious entry */. 
15e60 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
15e70 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
15e80 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20   here if we hit 
15e90 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a  the LIMIT */.){.
15ea0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
15eb0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
15ec0 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e   iContinue;.  in
15ed0 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20  t addr;..  addr 
15ee0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
15ef0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
15f00 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
15f10 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15f20 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65  v);..  /* Suppre
15f30 73 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f  ss duplicates fo
15f40 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  r UNION, EXCEPT,
15f50 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a   and INTERSECT .
15f60 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72    */.  if( regPr
15f70 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31  ev ){.    int j1
15f80 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73  , j2;.    j1 = s
15f90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
15fa0 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
15fb0 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65  gPrev); VdbeCove
15fc0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 6a 32 20  rage(v);.    j2 
15fd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15fe0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
15ff0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72  e, pIn->iSdst, r
16000 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
16010 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Sdst,.          
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
16040 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
16050 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
16060 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
16070 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16080 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f  _Jump, j2+2, iCo
16090 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56  ntinue, j2+2); V
160a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
160b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
160c0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
160d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
160e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
160f0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
16100 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
16110 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  dst-1);.    sqli
16120 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16130 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
16140 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20  regPrev);.  }.  
16150 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
16160 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
16170 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53  eturn 0;..  /* S
16180 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73  uppress the firs
16190 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
161a0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
161b0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
161c0 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
161d0 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
161e0 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77  Continue);..  sw
161f0 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
16200 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
16210 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
16220 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
16230 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
16240 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
16250 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
16260 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
16270 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
16280 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16290 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
162a0 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
162b0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
162c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
162d0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
162e0 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
162f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
16300 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
16310 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
16320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16330 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
16340 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
16350 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
16360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16370 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16380 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
16390 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
163a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
163b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
163c0 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
163d0 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
163e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
163f0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
16400 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
16410 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16420 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16430 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
16440 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16450 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
16460 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16480 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
16490 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
164a0 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
164b0 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
164c0 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
164d0 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
164e0 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
164f0 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
16500 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
16510 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
16520 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
16530 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
16540 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
16550 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
16560 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
16570 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
16580 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
16590 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
165a0 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20  affSdst = .     
165b0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
165c0 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45  reAffinity(p->pE
165d0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
165e0 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
165f0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
16600 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16610 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
16620 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16630 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
16640 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  d, pIn->iSdst, 1
16650 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  , r1, &pDest->af
16660 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20  fSdst,1);.      
16670 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16680 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
16690 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
166a0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
166b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
166c0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
166d0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
166e0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
166f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16700 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
16710 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16720 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65  ..#if 0  /* Neve
16730 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f  r occurs on an O
16740 52 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f  RDER BY query */
16750 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
16760 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
16770 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
16780 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
16790 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
167a0 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
167b0 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
167c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
167d0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
167e0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
167f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
16800 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
16810 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
16820 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
16830 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16840 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
16850 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
16860 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
16870 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
16880 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
16890 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
168a0 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
168b0 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
168c0 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
168d0 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
168e0 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
168f0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
16900 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
16910 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
16920 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==1 || pParse->n
16930 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61  Err>0 );  testca
16940 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d  se( pIn->nSdst!=
16950 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
16960 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
16970 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
16980 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
16990 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
169a0 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
169b0 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
169c0 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
169d0 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
169e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
169f0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
16a00 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
16a10 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  /..    /* The re
16a20 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
16a30 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
16a40 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
16a50 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
16a60 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68  Dest->iSdst.  Th
16a70 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  en the co-routin
16a80 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f  e yields..    */
16a90 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
16aa0 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
16ab0 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
16ac0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
16ad0 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73  pDest->iSdst = s
16ae0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
16af0 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
16b00 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nSdst);.        
16b10 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70  pDest->nSdst = p
16b20 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20  In->nSdst;.     
16b30 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
16b40 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
16b50 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
16b60 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70   pDest->iSdst, p
16b70 44 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20  Dest->nSdst);.  
16b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16b90 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
16ba0 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
16bb0 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
16bc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
16bd0 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62  f none of the ab
16be0 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
16bf0 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e  sult destination
16c00 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20   must be.    ** 
16c10 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69  SRT_Output.  Thi
16c20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
16c30 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  er called with a
16c40 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ny other.    ** 
16c50 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65  destination othe
16c60 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20  r than the ones 
16c70 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72  handled above or
16c80 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20   SRT_Output..   
16c90 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53   **.    ** For S
16ca0 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c  RT_Output, resul
16cb0 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
16cc0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
16cd0 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20  egisters.  .    
16ce0 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52  ** Then the OP_R
16cf0 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20  esultRow opcode 
16d00 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65  is used to cause
16d10 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
16d20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  to.    ** return
16d30 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
16d40 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a   result..    */.
16d50 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
16d60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
16d70 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
16d80 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73  utput );.      s
16d90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16da0 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
16db0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
16dc0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
16dd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
16de0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
16df0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
16e00 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
16e10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16e20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
16e30 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
16e40 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
16e50 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
16e60 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
16e70 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
16e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16e90 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
16ea0 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
16eb0 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
16ec0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
16ed0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
16ee0 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
16ef0 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
16f00 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16f10 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
16f20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16f30 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
16f40 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  n, regReturn);..
16f50 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
16f60 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ../*.** Alternat
16f70 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  ive compound sel
16f80 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ect code generat
16f90 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  or for cases whe
16fa0 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e  n there.** is an
16fb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16fc0 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
16fd0 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  e a query of the
16fe0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
16ff0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c  .**.**      <sel
17000 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72  ectA>  <operator
17010 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52  >  <selectB>  OR
17020 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c  DER BY <orderbyl
17030 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72  ist>.**.** <oper
17040 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20  ator> is one of 
17050 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e  UNION ALL, UNION
17060 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
17070 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65  ERSECT.  The ide
17080 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20  a.** is to code 
17090 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61  both <selectA> a
170a0 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74  nd <selectB> wit
170b0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
170c0 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72  lause as.** co-r
170d0 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72  outines.  Then r
170e0 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  un the co-routin
170f0 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61  es in parallel a
17100 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73  nd merge the res
17110 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ults.** into the
17120 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64   output.  In add
17130 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f  ition to the two
17140 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c   coroutines (cal
17150 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a  led selectA and.
17160 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72  ** selectB) ther
17170 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69  e are 7 subrouti
17180 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  nes:.**.**    ou
17190 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tA:    Move the 
171a0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
171b0 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20  lectA coroutine 
171c0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
171d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
171e0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
171f0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  uery..**.**    o
17200 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utB:    Move the
17210 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
17220 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65  electB coroutine
17230 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
17240 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17250 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
17260 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65  query.  (Only ge
17270 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f  nerated for UNIO
17280 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  N and.**        
17290 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20       UNION ALL. 
172a0 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45   EXCEPT and INSE
172b0 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74  RTSECT never out
172c0 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a  put a row that.*
172d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70  *             ap
172e0 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e  pears only in B.
172f0 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a  ).**.**    AltB:
17300 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
17310 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
17320 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
17330 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a  es and A<B..**.*
17340 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61  *    AeqB:    Ca
17350 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
17360 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
17370 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
17380 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   A==B..**.**    
17390 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AgtB:    Called 
173a0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
173b0 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
173c0 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e  outines and A>B.
173d0 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  .**.**    EofA: 
173e0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
173f0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
17400 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a   from selectA..*
17410 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20  *.**    EofB:   
17420 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
17430 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
17440 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a  rom selectB..**.
17450 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
17460 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74  ation of the lat
17470 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74  ter five subrout
17480 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77  ines depend on w
17490 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74  hich .** <operat
174a0 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a  or> is used:.**.
174b0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
174c0 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20    UNION ALL     
174d0 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20      UNION       
174e0 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20       EXCEPT     
174f0 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a       INTERSECT.*
17500 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  *          -----
17510 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
17520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
17530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
17540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
17550 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41  *   AltB:   outA
17560 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
17570 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
17580 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
17590 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20     nextA.**.**  
175a0 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AeqB:   outA, n
175b0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
175c0 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  tA             n
175d0 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74  extA         out
175e0 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20  A, nextA.**.**  
175f0 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e   AgtB:   outB, n
17600 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
17610 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e  nextB          n
17620 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20  extB            
17630 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f  nextB.**.**   Eo
17640 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  fA:   outB, next
17650 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
17660 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74  tB          halt
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c               hal
17680 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20  t.**.**   EofB: 
17690 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
176a0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
176b0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
176c0 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
176d0 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c  .** In the AltB,
176e0 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20   AeqB, and AgtB 
176f0 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20  subroutines, an 
17700 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69  EOF on A followi
17710 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73  ng nextA.** caus
17720 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
17730 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64  jump to EofA and
17740 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c   an EOF on B fol
17750 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75  lowing nextB cau
17760 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69  ses.** an immedi
17770 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42  ate jump to EofB
17780 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61  .  Within EofA a
17790 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46  nd EofB, and EOF
177a0 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20   on entry or.** 
177b0 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20  following nextX 
177c0 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f  causes a jump to
177d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
177e0 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
177f0 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  g..**.** Duplica
17800 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68  te removal in th
17810 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  e UNION, EXCEPT,
17820 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63   and INTERSECT c
17830 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ases is handled.
17840 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75  ** within the ou
17850 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  tput subroutine.
17860 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65    The regPrev re
17870 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73  gister set holds
17880 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a   the previously.
17890 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e  ** output value.
178a0 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69    A comparison i
178b0 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74  s made against t
178c0 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68  his value and th
178d0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73  e output.** is s
178e0 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65  kipped if the ne
178f0 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64  xt results would
17900 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
17910 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a  the previous..**
17920 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
17930 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74  tation plan is t
17940 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
17950 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  two coroutines a
17960 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72  nd seven.** subr
17970 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74  outines first, t
17980 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74  hen put the cont
17990 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65  rol logic at the
179a0 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74   bottom.  Like t
179b0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
179c0 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a      goto Init.**
179d0 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74       coA: corout
179e0 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65  ine for left que
179f0 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f  ry (A).**     co
17a00 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  B: coroutine for
17a10 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29   right query (B)
17a20 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74  .**    outA: out
17a30 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41  put one row of A
17a40 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74  .**    outB: out
17a50 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42  put one row of B
17a60 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f   (UNION and UNIO
17a70 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20  N ALL only).**  
17a80 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofA: ....**  
17a90 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofB: ....**  
17aa0 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AltB: ....**  
17ab0 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AeqB: ....**  
17ac0 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AgtB: ....**  
17ad0 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69    Init: initiali
17ae0 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67  ze coroutine reg
17af0 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  isters.**       
17b00 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20     yield coA.** 
17b10 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
17b20 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20  A) goto EofA.** 
17b30 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
17b40 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oB.**          i
17b50 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f  f eof(B) goto Eo
17b60 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43  fB.**    Cmpr: C
17b70 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20  ompare A, B.**  
17b80 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74          Jump Alt
17b90 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a  B, AeqB, AgtB.**
17ba0 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a       End: ....**
17bb0 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42  .** We call AltB
17bc0 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f  , AeqB, AgtB, Eo
17bd0 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75  fA, and EofB "su
17be0 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74  broutines" but t
17bf0 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  hey are not.** a
17c00 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75  ctually called u
17c10 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74  sing Gosub and t
17c20 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72  hey do not Retur
17c30 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  n.  EofA and Eof
17c40 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20  B loop.** until 
17c50 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61  all data is exha
17c60 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20  usted then jump 
17c70 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62  to the "end" lab
17c80 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a  e.  AltB, AeqB,.
17c90 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70  ** and AgtB jump
17ca0 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72   to either L2 or
17cb0 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20   to one of EofA 
17cc0 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e  or EofB..*/.#ifn
17cd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17ce0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
17cf0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
17d00 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
17d10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
17d20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17d30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
17d40 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
17d50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
17d60 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
17d70 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
17d80 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
17d90 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
17da0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
17db0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
17dc0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
17dd0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
17de0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65  counters */.  Se
17df0 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
17e00 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
17e10 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
17e20 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
17e30 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
17e40 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
17e50 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
17e60 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
17e70 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20  ctDest destA;   
17e80 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
17e90 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41   for coroutine A
17ea0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
17eb0 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44   destB;     /* D
17ec0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
17ed0 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20  oroutine B */.  
17ee0 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20  int regAddrA;   
17ef0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17f00 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
17f10 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
17f20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
17f30 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
17f40 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
17f50 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
17f60 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17f70 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20  addrSelectA;    
17f80 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17f90 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  the select-A cor
17fa0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17fb0 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20  addrSelectB;    
17fc0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17fd0 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  the select-B cor
17fe0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17ff0 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20  regOutA;        
18000 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
18010 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
18020 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
18030 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
18040 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tB;          /* 
18050 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
18060 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
18070 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
18080 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20    int addrOutA; 
18090 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
180a0 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
180b0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
180c0 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20  .  int addrOutB 
180d0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  = 0;     /* Addr
180e0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
180f0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
18100 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
18110 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18120 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
18130 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73  ct-A-exhausted s
18140 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18150 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b  nt addrEofA_noB;
18160 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
18170 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42 20  e addrEofA if B 
18180 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  is uninitialized
18190 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
181a0 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fB;         /* A
181b0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
181c0 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64  lect-B-exhausted
181d0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
181e0 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20   int addrAltB;  
181f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18200 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62  s of the A<B sub
18210 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18220 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20   addrAeqB;      
18230 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
18240 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75   the A==B subrou
18250 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
18260 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20  drAgtB;         
18270 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18280 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65  e A>B subroutine
18290 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
182a0 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itA;        /* L
182b0 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
182c0 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
182d0 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20  int regLimitB;  
182e0 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
182f0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
18300 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
18310 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  gPrev;          
18320 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65  /* A range of re
18330 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
18340 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20  previous output 
18350 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69  */.  int savedLi
18360 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  mit;       /* Sa
18370 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
18380 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  iLimit */.  int 
18390 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20  savedOffset;    
183a0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
183b0 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a   of p->iOffset *
183c0 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70  /.  int labelCmp
183d0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  r;        /* Lab
183e0 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  el for the start
183f0 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c   of the merge al
18400 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74  gorithm */.  int
18410 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20   labelEnd;      
18420 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
18430 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
18440 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74  verall SELECT st
18450 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20  mt */.  int j1; 
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18470 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   Jump instructio
18480 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61  ns that get reta
18490 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74  rgetted */.  int
184a0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
184b0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
184c0 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  ALL, TK_UNION, T
184d0 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54  K_EXCEPT, TK_INT
184e0 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49  ERSECT */.  KeyI
184f0 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30  nfo *pKeyDup = 0
18500 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ; /* Comparison 
18510 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
18520 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  duplicate remova
18530 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  l */.  KeyInfo *
18540 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20  pKeyMerge;   /* 
18550 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
18560 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69  mation for mergi
18570 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c  ng rows */.  sql
18580 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
18590 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
185a0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
185b0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
185c0 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
185d0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
185e0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
185f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18600 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
18610 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18620 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
18630 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  ute;        /* M
18640 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45  apping from ORDE
18650 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65  R BY terms to re
18660 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
18670 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
18680 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
18690 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20    int iSub1;    
186a0 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
186b0 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
186c0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
186d0 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub2;            
186e0 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
186f0 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
18700 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
18710 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d  t( p->pOrderBy!=
18720 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
18730 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20  KeyDup==0 ); /* 
18740 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e  "Managed" code n
18750 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b  eeds this.  Tick
18760 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64  et #3382. */.  d
18770 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18780 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
18790 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
187a0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
187b0 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74  Already thrown t
187c0 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42 45  he error if VDBE
187d0 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f   alloc failed */
187e0 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71  .  labelEnd = sq
187f0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
18800 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d  el(v);.  labelCm
18810 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pr = sqlite3Vdbe
18820 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a  MakeLabel(v);...
18830 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68    /* Patch up th
18840 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18850 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d  e.  */.  op = p-
18860 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20  >op;  .  pPrior 
18870 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
18880 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
18890 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
188a0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
188b0 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
188c0 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ( pOrderBy );.  
188d0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
188e0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f  rBy->nExpr;..  /
188f0 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20  * For operators 
18900 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
18910 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20   ALL we have to 
18920 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20  make sure that. 
18930 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
18940 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65   clause covers e
18950 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
18960 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64   result set.  Ad
18970 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20  d.  ** terms to 
18980 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
18990 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  use as necessary
189a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21  ..  */.  if( op!
189b0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66  =TK_ALL ){.    f
189c0 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c  or(i=1; db->mall
189d0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69  ocFailed==0 && i
189e0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
189f0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
18a00 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
18a10 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
18a20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
18a30 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
18a40 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20  <nOrderBy; j++, 
18a50 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
18a60 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
18a70 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
18a80 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
18a90 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18aa0 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72  derByCol==i ) br
18ab0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18ac0 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72     if( j==nOrder
18ad0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  By ){.        Ex
18ae0 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
18af0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e  e3Expr(db, TK_IN
18b00 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20  TEGER, 0);.     
18b10 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
18b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
18b30 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e  OMEM;.        pN
18b40 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
18b50 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
18b60 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
18b70 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f   = i;.        pO
18b80 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
18b90 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
18ba0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
18bb0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
18bc0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
18bd0 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65  OrderBy->a[nOrde
18be0 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65  rBy++].u.x.iOrde
18bf0 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b  rByCol = (u16)i;
18c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18c10 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
18c20 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
18c30 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20  permutation and 
18c40 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20  keyinfo that is 
18c50 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  used with.  ** t
18c60 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75  he permutation u
18c70 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
18c80 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a   if the next.  *
18c90 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73  * row of results
18ca0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65   comes from sele
18cb0 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20  ctA or selectB. 
18cc0 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63   Also add explic
18cd0 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  it.  ** collatio
18ce0 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ns to the ORDER 
18cf0 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
18d00 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
18d10 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a   subqueries.  **
18d20 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e   to the right an
18d30 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65  d the left are e
18d40 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75  valuated, they u
18d50 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  se the correct. 
18d60 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20   ** collation.. 
18d70 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   */.  aPermute =
18d80 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
18d90 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69  Raw(db, sizeof(i
18da0 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20  nt)*nOrderBy);. 
18db0 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b   if( aPermute ){
18dc0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
18dd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
18de0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
18df0 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
18e00 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
18e10 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
18e20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
18e30 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
18e40 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  l>0 );.      /* 
18e50 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
18e60 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d  .x.iOrderByCol<=
18e70 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
18e80 20 29 20 69 73 20 61 6c 73 6f 20 74 72 75 65 0a   ) is also true.
18e90 20 20 20 20 20 20 2a 2a 20 62 75 74 20 6f 6e 6c        ** but onl
18ea0 79 20 66 6f 72 20 77 65 6c 6c 2d 66 6f 72 6d 65  y for well-forme
18eb0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
18ec0 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 74 65  nts. */.      te
18ed0 73 74 63 61 73 65 28 20 70 49 74 65 6d 2d 3e 75  stcase( pItem->u
18ee0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3e  .x.iOrderByCol >
18ef0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
18f00 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d  r );.      aPerm
18f10 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  ute[i] = pItem->
18f20 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
18f30 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  - 1;.    }.    p
18f40 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69  KeyMerge = multi
18f50 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
18f60 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
18f70 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
18f80 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a   pKeyMerge = 0;.
18f90 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61    }..  /* Reatta
18fa0 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
18fb0 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75  clause to the qu
18fc0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ery..  */.  p->p
18fd0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
18fe0 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f  By;.  pPrior->pO
18ff0 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
19000 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72  ExprListDup(pPar
19010 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79  se->db, pOrderBy
19020 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  , 0);..  /* Allo
19030 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20  cate a range of 
19040 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
19050 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49  ers and the KeyI
19060 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20  nfo needed.  ** 
19070 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68  for the logic th
19080 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69  at removes dupli
19090 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73  cate result rows
190a0 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   when the.  ** o
190b0 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
190c0 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
190d0 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20  ERSECT (but not 
190e0 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f  UNION ALL)..  */
190f0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
19100 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76  L ){.    regPrev
19110 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
19120 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
19130 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
19140 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72  .    assert( nOr
19150 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20  derBy>=nExpr || 
19160 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19170 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20   );.    regPrev 
19180 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
19190 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
191a0 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20  em += nExpr+1;. 
191b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
191c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
191d0 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b  er, 0, regPrev);
191e0 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73  .    pKeyDup = s
191f0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
19200 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29  oc(db, nExpr, 1)
19210 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75  ;.    if( pKeyDu
19220 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
19230 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
19240 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
19250 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66  yDup) );.      f
19260 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
19270 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
19280 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d  KeyDup->aColl[i]
19290 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
192a0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
192b0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
192c0 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
192d0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
192e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f  .    }.  }. .  /
192f0 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c  * Separate the l
19300 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68  eft and the righ
19310 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65  t query from one
19320 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20   another.  */.  
19330 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
19340 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
19350 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73   0;.  sqlite3Res
19360 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
19370 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
19380 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
19390 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  );.  if( pPrior-
193a0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
193b0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
193c0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
193d0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72  rse, pPrior, pPr
193e0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  ior->pOrderBy, "
193f0 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20  ORDER");.  }..  
19400 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
19410 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a  imit registers *
19420 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
19430 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
19440 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  , p, labelEnd);.
19450 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
19460 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  && op==TK_ALL ){
19470 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
19480 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19490 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d  .    regLimitB =
194a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
194b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
194c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
194d0 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20  y, p->iOffset ? 
194e0 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70  p->iOffset+1 : p
194f0 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20  ->iLimit,.      
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c              regL
19520 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  imitA);.    sqli
19530 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19540 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d   OP_Copy, regLim
19550 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b  itA, regLimitB);
19560 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
19570 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d  gLimitA = regLim
19580 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  itB = 0;.  }.  s
19590 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
195a0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
195b0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  .  p->pLimit = 0
195c0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
195d0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
195e0 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66  fset);.  p->pOff
195f0 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41  set = 0;..  regA
19600 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrA = ++pParse-
19610 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
19620 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
19630 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20  em;.  regOutA = 
19640 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19650 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50    regOutB = ++pP
19660 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
19670 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
19680 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f  nit(&destA, SRT_
19690 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
196a0 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  drA);.  sqlite3S
196b0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
196c0 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estB, SRT_Corout
196d0 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
196e0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
196f0 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
19700 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
19710 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
19720 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
19730 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
19740 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
19750 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61  select..  */.  a
19760 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
19770 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19780 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31  ddr(v) + 1;.  j1
19790 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
197a0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
197b0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
197c0 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rA, 0, addrSelec
197d0 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tA);.  VdbeComme
197e0 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c  nt((v, "left SEL
197f0 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72  ECT"));.  pPrior
19800 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
19810 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53  mitA;.  explainS
19820 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
19830 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
19840 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
19850 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
19860 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29   pPrior, &destA)
19870 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19880 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
19890 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
198a0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rA);.  sqlite3Vd
198b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
198c0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
198d0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
198e0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
198f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
19900 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
19910 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
19920 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
19930 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
19940 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19950 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71  ) + 1;.  j1 = sq
19960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19970 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
19980 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30  ine, regAddrB, 0
19990 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a  , addrSelectB);.
199a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
199b0 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22  , "right SELECT"
199c0 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
199d0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
199e0 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
199f0 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
19a00 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
19a10 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
19a20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e  = 0;  .  explain
19a30 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
19a40 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
19a50 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
19a60 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
19a70 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20  , p, &destB);.  
19a80 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65  p->iLimit = save
19a90 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66  dLimit;.  p->iOf
19aa0 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73  fset = savedOffs
19ab0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  et;.  sqlite3Vdb
19ac0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e  eAddOp1(v, OP_En
19ad0 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  dCoroutine, regA
19ae0 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
19af0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
19b00 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
19b10 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
19b20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65  of the A.  ** se
19b30 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
19b40 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
19b50 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
19b60 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
19b70 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
19b80 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
19b90 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f  or A"));.  addrO
19ba0 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utA = generateOu
19bb0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
19bc0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
19bd0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
19be0 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  A, pDest, regOut
19bf0 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  A,.             
19c00 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
19c10 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
19c20 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  .  .  /* Generat
19c30 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
19c40 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
19c50 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
19c60 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he B.  ** select
19c70 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
19c80 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
19c90 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
19ca0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
19cb0 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
19cc0 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62  UNION ){.    Vdb
19cd0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
19ce0 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
19cf0 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61   for B"));.    a
19d00 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61  ddrOutB = genera
19d10 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
19d20 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
19d30 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
19d40 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65  destB, pDest, re
19d50 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20  gOutB,.         
19d60 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
19d70 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
19d80 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nd);.  }.  sqlit
19d90 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
19da0 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47  KeyDup);..  /* G
19db0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
19dc0 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
19dd0 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
19de0 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
19df0 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
19e00 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
19e10 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
19e20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
19e30 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
19e40 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
19e50 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
19e60 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c  B = addrEofA = l
19e70 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65  abelEnd;.  }else
19e80 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
19e90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
19ea0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
19eb0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d  ;.    addrEofA =
19ec0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19ed0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
19ee0 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
19ef0 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41  B);.    addrEofA
19f00 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64  _noB = sqlite3Vd
19f10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19f20 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
19f30 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20  labelEnd);.     
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19f70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19f80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
19f90 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b  o, 0, addrEofA);
19fa0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
19fb0 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
19fc0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20  electRow;.  }.. 
19fd0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
19fe0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
19ff0 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
1a000 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
1a010 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
1a020 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
1a030 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
1a040 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
1a050 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1a060 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1a070 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
1a080 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
1a090 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53  Row > pPrior->nS
1a0a0 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
1a0b0 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
1a0c0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
1a0d0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
1a0e0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a0f0 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74  , "eof-B subrout
1a100 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1a110 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64  EofB = sqlite3Vd
1a120 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a130 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
1a140 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71  ddrOutA);.    sq
1a150 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a160 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a170 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrA, labelEnd)
1a180 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a190 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a1a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a1b0 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42  oto, 0, addrEofB
1a1c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1a1d0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1a1e0 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1a1f0 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
1a200 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1a210 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
1a220 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
1a230 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1a240 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1a250 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1a260 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
1a270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a280 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a290 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1a2a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a2b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a2c0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1a2d0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1a2e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1a2f0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1a300 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
1a310 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1a320 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
1a330 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1a340 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
1a350 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1a360 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1a370 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
1a380 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
1a390 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1a3a0 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
1a3b0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1a3c0 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
1a3d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a3e0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1a3f0 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1a400 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
1a410 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1a420 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a430 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
1a440 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
1a450 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a460 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1a470 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
1a480 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1a490 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
1a4a0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1a4b0 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
1a4c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1a4d0 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
1a4e0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1a4f0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
1a500 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a510 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1a520 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1a530 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1a540 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a550 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1a560 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1a570 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1a580 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a590 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
1a5a0 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54  elCmpr);..  /* T
1a5b0 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e  his code runs on
1a5c0 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
1a5d0 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a   everything..  *
1a5e0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
1a5f0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
1a600 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a610 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1a620 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1a630 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f  ofA_noB); VdbeCo
1a640 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1a650 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a660 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1a670 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  ddrB, addrEofB);
1a680 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a690 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;..  /* Implemen
1a6a0 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65  t the main merge
1a6b0 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
1a6c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1a6d0 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70  abel(v, labelCmp
1a6e0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
1a6f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65  eAddOp4(v, OP_Pe
1a700 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  rmutation, 0, 0,
1a710 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d   0, (char*)aPerm
1a720 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59  ute, P4_INTARRAY
1a730 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a740 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
1a750 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73  pare, destA.iSds
1a760 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20  t, destB.iSdst, 
1a770 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  nOrderBy,.      
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65     (char*)pKeyMe
1a7a0 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  rge, P4_KEYINFO)
1a7b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1a7c0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
1a7d0 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71  G_PERMUTE);.  sq
1a7e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a7f0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
1a800 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
1a810 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43  addrAgtB); VdbeC
1a820 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1a830 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
1a840 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
1a850 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
1a860 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1a870 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a880 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1a890 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  lEnd);..  /* Set
1a8a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
1a8b0 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20  utput columns.  
1a8c0 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
1a8d0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
1a8e0 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  t ){.    Select 
1a8f0 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72  *pFirst = pPrior
1a900 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69  ;.    while( pFi
1a910 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
1a920 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
1a930 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72  Prior;.    gener
1a940 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
1a950 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
1a960 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  ->pEList);.  }..
1a970 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
1a980 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1a990 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
1a9a0 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
1a9b0 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
1a9c0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1a9d0 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
1a9e0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
1a9f0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1aa00 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
1aa10 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
1aa20 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72   = pPrior;.  pPr
1aa30 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  ior->pNext = p;.
1aa40 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
1aa50 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
1aa60 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
1aa70 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
1aa80 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
1aa90 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65  ueries ****/.  e
1aaa0 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
1aab0 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
1aac0 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b  Sub1, iSub2, 0);
1aad0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
1aae0 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e  ->nErr!=0;.}.#en
1aaf0 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
1ab00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1ab10 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1ab20 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1ab30 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64  VIEW)./* Forward
1ab40 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
1ab50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1ab60 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74  stExprList(sqlit
1ab70 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20  e3*, ExprList*, 
1ab80 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b  int, ExprList*);
1ab90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1aba0 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33  stSelect(sqlite3
1abb0 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74  *, Select *, int
1abc0 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a  , ExprList *);..
1abd0 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75  /*.** Scan throu
1abe0 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  gh the expressio
1abf0 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63  n pExpr.  Replac
1ac00 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  e every referenc
1ac10 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e  e to.** a column
1ac20 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72   in table number
1ac30 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63   iTable with a c
1ac40 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75  opy of the iColu
1ac50 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69  mn-th.** entry i
1ac60 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
1ac70 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
1ac80 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
1ac90 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
1aca0 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed.).**.** This 
1acb0 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
1acc0 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
1acd0 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
1ace0 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
1acf0 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
1ad00 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
1ad10 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
1ad20 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
1ad30 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1ad40 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
1ad50 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
1ad60 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
1ad70 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
1ad80 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
1ad90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1ada0 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ke the necessary
1adb0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
1adc0 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
1add0 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
1ade0 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
1adf0 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
1ae00 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
1ae10 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1ae20 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
1ae30 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
1ae40 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69  ubstExpr(.  sqli
1ae50 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1ae60 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
1ae70 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20   errors to this 
1ae80 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1ae90 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1aea0 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
1aeb0 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
1aec0 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e  n occurs */.  in
1aed0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1aee0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
1aef0 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
1af00 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1af10 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  st    /* Substit
1af20 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ute expressions 
1af30 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
1af40 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
1af50 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
1af60 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
1af70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
1af80 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
1af90 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
1afa0 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1afb0 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
1afc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1afd0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
1afe0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
1aff0 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
1b000 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
1b010 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
1b020 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
1b030 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
1b040 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1b050 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1b060 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69  ExprDup(db, pELi
1b070 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
1b080 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b  lumn].pExpr, 0);
1b090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b0a0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1b0b0 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  pr);.      pExpr
1b0c0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
1b0d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70   }else{.    pExp
1b0e0 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74  r->pLeft = subst
1b0f0 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
1b100 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
1b110 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  EList);.    pExp
1b120 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1b130 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
1b140 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
1b150 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66   pEList);.    if
1b160 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1b170 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1b180 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1b190 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
1b1a0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1b1b0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b1c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1b1d0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1b1e0 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
1b1f0 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
1b200 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1b210 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1b220 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1b230 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1b240 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1b250 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
1b260 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
1b270 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1b280 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
1b290 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
1b2a0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1b2b0 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
1b2c0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1b2d0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1b2e0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
1b2f0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1b300 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
1b310 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
1b320 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1b330 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1b340 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
1b350 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1b360 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  pr; i++){.    pL
1b370 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
1b380 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b390 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1b3a0 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
1b3b0 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
1b3c0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1b3d0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
1b3e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
1b3f0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1b400 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
1b410 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1b420 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1b430 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1b440 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1b450 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
1b460 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1b470 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
1b480 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
1b490 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
1b4a0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
1b4b0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  lues */.){.  Src
1b4c0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
1b4d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1b4e0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1b4f0 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
1b500 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70  turn;.  substExp
1b510 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c  rList(db, p->pEL
1b520 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
1b530 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
1b540 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
1b550 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
1b560 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
1b570 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
1b580 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
1b590 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
1b5a0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1b5b0 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  pr(db, p->pHavin
1b5c0 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
1b5d0 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  t);.  p->pWhere 
1b5e0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b5f0 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
1b600 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
1b610 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d  bstSelect(db, p-
1b620 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c  >pPrior, iTable,
1b630 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63   pEList);.  pSrc
1b640 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
1b650 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f  sert( pSrc );  /
1b660 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45  * Even for (SELE
1b670 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70  CT 1) we have: p
1b680 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d  Src!=0 but pSrc-
1b690 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66  >nSrc==0 */.  if
1b6a0 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29  ( ALWAYS(pSrc) )
1b6b0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63  {.    for(i=pSrc
1b6c0 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53  ->nSrc, pItem=pS
1b6d0 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  rc->a; i>0; i--,
1b6e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1b6f0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
1b700 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
1b710 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b720 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
1b730 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1b740 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1b750 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1b760 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1b770 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1b780 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1b790 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1b7a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b7b0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1b7c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1b7d0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1b7e0 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1b7f0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1b800 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1b810 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1b820 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1b830 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1b840 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1b850 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1b860 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1b870 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1b880 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1b890 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1b8a0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1b8b0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1b8c0 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1b8d0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1b8e0 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1b8f0 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1b900 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1b910 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1b920 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1b930 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1b940 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1b950 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1b960 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1b970 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1b980 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1b990 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1b9a0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1b9b0 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1b9c0 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1b9d0 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1b9e0 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1b9f0 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1ba00 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1ba10 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ba20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1ba30 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1ba40 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1ba50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1ba60 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1ba70 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1ba80 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1ba90 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1baa0 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1bab0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1bac0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1bad0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1bae0 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1baf0 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1bb00 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1bb10 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  plification give
1bb20 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1bb30 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1bb40 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1bb50 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1bb60 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1bb70 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1bb80 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1bb90 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1bba0 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1bbb0 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1bbc0 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1bbd0 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
1bbe0 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
1bbf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1bc00 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
1bc10 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1bc20 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1bc30 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1bc40 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
1bc50 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
1bc60 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1bc70 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1bc80 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71  (2a) the outer q
1bc90 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
1bca0 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 64  in.**        and
1bcb0 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72 20   (2b) the outer 
1bcc0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1bcd0 73 65 20 73 75 62 71 75 65 72 69 65 73 20 6f 74  se subqueries ot
1bce0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1bcf0 0a 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d 2d  .**        FROM-
1bd00 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20  clause subquery 
1bd10 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69 64  that is a candid
1bd20 61 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e 69  ate for flatteni
1bd30 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20 20  ng.  (2b is.**  
1bd40 20 20 20 20 20 20 64 75 65 20 74 6f 20 74 69 63        due to tic
1bd50 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1bd60 39 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30 31  9abf80] from 201
1bd70 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20  5-02-09.).**.** 
1bd80 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
1bd90 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
1bda0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1bdb0 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
1bdc0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69  n.**        (Ori
1bdd0 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23  ginally ticket #
1bde0 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e  306.  Strengthen
1bdf0 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33  ed by ticket #33
1be00 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  00).**.**   (4) 
1be10 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1be20 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a   not DISTINCT..*
1be30 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
1be40 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
1be50 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
1be60 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
1be70 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
1be80 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
1be90 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
1bea0 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
1beb0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
1bec0 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
1bed0 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
1bee0 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
1bef0 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
1bf00 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
1bf10 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  eries..**.**   (
1bf20 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
1bf30 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1bf40 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1bf50 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1bf60 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1bf70 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
1bf80 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
1bf90 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
1bfa0 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
1bfb0 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
1bfc0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
1bfd0 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
1bfe0 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
1bff0 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68  OM close with th
1c000 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20  e special.**    
1c010 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65      table sqlite
1c020 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69  _once that consi
1c030 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
1c040 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  row containing a
1c050 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c  .**        singl
1c060 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20  e NULL..**.**   
1c070 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
1c080 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1c090 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1c0a0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1c0b0 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
1c0c0 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
1c0d0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1c0e0 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1c0f0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
1c100 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
1c110 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1c120 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69   (**)  Restricti
1c130 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f  on (10) was remo
1c140 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64  ved from the cod
1c150 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20  e on 2005-02-05 
1c160 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20  but we.**       
1c170 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72   accidently carr
1c180 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  ied the comment 
1c190 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30  forward until 20
1c1a0 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69  14-09-15.  Origi
1c1b0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 65  nal.**        te
1c1c0 78 74 3a 20 22 54 68 65 20 73 75 62 71 75 65 72  xt: "The subquer
1c1d0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
1c1e0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
1c1f0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1c200 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1c210 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a  use LIMIT.".**.*
1c220 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
1c230 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
1c240 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1c250 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
1c260 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
1c270 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d  **  (**)  Not im
1c280 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
1c290 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
1c2a0 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
1c2b0 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
1c2c0 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
1c2d0 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
1c2e0 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
1c2f0 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
1c300 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1c310 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
1c320 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
1c330 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
1c340 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
1c350 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
1c360 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  FFSET..**.**  (1
1c370 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
1c380 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
1c390 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
1c3a0 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
1c3b0 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
1c3c0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
1c3d0 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  IMIT clause..** 
1c3e0 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b         (See tick
1c3f0 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63  et #2339 and tic
1c400 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d  ket [02a8e81d44]
1c410 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20  )..**.**  (16)  
1c420 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1c430 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1c440 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75  ate or the subqu
1c450 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20  ery does.**     
1c460 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f     not contain O
1c470 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
1c480 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
1c490 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
1c4a0 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
1c4b0 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
1c4c0 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
1c4d0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
1c4e0 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20  *.**  (17)  The 
1c4f0 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
1c500 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1c510 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55  ct, or it is a U
1c520 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20  NION ALL .**    
1c530 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61      compound cla
1c540 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69  use made up enti
1c550 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72  rely of non-aggr
1c560 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61  egate queries, a
1c570 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  nd .**        th
1c580 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a  e parent query:.
1c590 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  **.**          *
1c5a0 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70   is not itself p
1c5b0 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
1c5c0 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20  d select,.**    
1c5d0 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
1c5e0 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44  n aggregate or D
1c5f0 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61  ISTINCT query, a
1c600 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  nd.**          *
1c610 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a   is not a join.*
1c620 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
1c630 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
1c640 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
1c650 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
1c660 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
1c670 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
1c680 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
1c690 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
1c6a0 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
1c6b0 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
1c6c0 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
1c6d0 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72  es.  The subquer
1c6e0 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79  y cannot use any
1c6f0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1c700 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68      operator oth
1c710 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
1c720 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  L because all th
1c730 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64  e other compound
1c740 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
1c750 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70  tors have an imp
1c760 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68  lied DISTINCT wh
1c770 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ich is disallowe
1c780 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  d by.**        r
1c790 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a  estriction (4)..
1c7a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73  **.**        Als
1c7b0 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  o, each componen
1c7c0 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  t of the sub-que
1c7d0 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74  ry must return t
1c7e0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
1c7f0 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75  *        of resu
1c800 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73  lt columns. This
1c810 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72   is actually a r
1c820 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61  equirement for a
1c830 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1c840 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61        SELECT sta
1c850 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20  tement, but all 
1c860 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f  the code here do
1c870 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20  es is make sure 
1c880 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20  that no.**      
1c890 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29    such (illegal)
1c8a0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c   sub-query is fl
1c8b0 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c  attened. The cal
1c8c0 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20  ler will detect 
1c8d0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79  the.**        sy
1c8e0 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72  ntax error and r
1c8f0 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64  eturn a detailed
1c900 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
1c910 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
1c920 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1c930 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1c940 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
1c950 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
1c960 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66  DER by clause of
1c970 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
1c980 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
1c990 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
1c9a0 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
1c9b0 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
1c9c0 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73  .**  (19)  The s
1c9d0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c9e0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c9f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1ca00 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
1ca10 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c   have a WHERE cl
1ca20 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30  ause..**.**  (20
1ca30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1ca40 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1ca50 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69  d select, then i
1ca60 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a  t must not use.*
1ca70 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45  *        an ORDE
1ca80 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69  R BY clause.  Ti
1ca90 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20  cket #3773.  We 
1caa0 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73  could relax this
1cab0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20   constraint.**  
1cac0 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62        somewhat b
1cad0 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68  y saying that th
1cae0 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  e terms of the O
1caf0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d  RDER BY clause m
1cb00 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70  ust.**        ap
1cb10 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69  pear as unmodifi
1cb20 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ed result column
1cb30 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
1cb40 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a  uery.  But we.**
1cb50 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68          have oth
1cb60 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1cb70 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c   in mind to deal
1cb80 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e   with that case.
1cb90 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68  .**.**  (21)  Th
1cba0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1cbb0 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
1cbc0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cbd0 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
1cbe0 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
1cbf0 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
1cc00 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  46fc])..**.**  (
1cc10 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  22)  The subquer
1cc20 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  y is not a recur
1cc30 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  sive CTE..**.** 
1cc40 20 28 32 33 29 20 20 54 68 65 20 70 61 72 65 6e   (23)  The paren
1cc50 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  t is not a recur
1cc60 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65  sive CTE, or the
1cc70 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
1cc80 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  t a.**        co
1cc90 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68  mpound query. Th
1cca0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69  is restriction i
1ccb0 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66  s because transf
1ccc0 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  orming the.**   
1ccd0 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61       parent to a
1cce0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1ccf0 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64  confuses the cod
1cd00 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a  e that handles.*
1cd10 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69  *        recursi
1cd20 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75  ve queries in mu
1cd30 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a  ltiSelect()..**.
1cd40 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20 73 75  **  (24)  The su
1cd50 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
1cd60 20 61 67 67 72 65 67 61 74 65 20 74 68 61 74 20   aggregate that 
1cd70 75 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69  uses the built-i
1cd80 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20  n min() or .**  
1cd90 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66        or max() f
1cda0 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68  unctions.  (With
1cdb0 6f 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  out this restric
1cdc0 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69  tion, a query li
1cdd0 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53  ke:.**        "S
1cde0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45  ELECT x FROM (SE
1cdf0 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46  LECT max(y), x F
1ce00 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e  ROM t1)" would n
1ce10 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a  ot necessarily.*
1ce20 2a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  *        return 
1ce30 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20  the value X for 
1ce40 77 68 69 63 68 20 59 20 77 61 73 20 6d 61 78 69  which Y was maxi
1ce50 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49  mal.).**.**.** I
1ce60 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
1ce70 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
1ce80 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
1ce90 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
1cea0 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
1ceb0 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
1cec0 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
1ced0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
1cee0 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
1cef0 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
1cf00 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
1cf10 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
1cf20 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
1cf30 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
1cf40 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1cf50 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
1cf60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1cf70 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
1cf80 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
1cf90 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
1cfa0 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
1cfb0 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
1cfc0 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
1cfd0 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
1cfe0 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
1cff0 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
1d000 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
1d010 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
1d020 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
1d030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d040 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
1d050 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d060 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
1d070 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1d080 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1d090 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
1d0a0 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
1d0b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
1d0c0 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
1d0d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1d0e0 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
1d0f0 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
1d100 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
1d110 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
1d120 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
1d130 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
1d140 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1d150 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
1d160 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
1d170 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1d180 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1d190 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
1d1a0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1d1b0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1d1c0 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
1d1d0 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
1d1e0 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53  ct *pParent;.  S
1d1f0 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
1d200 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
1d210 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
1d220 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
1d230 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
1d240 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
1d250 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
1d260 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
1d270 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1d280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
1d290 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1d2a0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
1d2b0 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
1d2c0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
1d2d0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1d2e0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
1d2f0 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
1d300 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
1d310 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
1d320 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
1d330 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
1d340 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
1d350 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
1d360 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
1d370 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1d380 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1d390 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1d3a0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
1d3b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d3c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1d3d0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
1d3e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d3f0 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
1d400 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
1d410 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1d420 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
1d430 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1d440 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
1d450 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
1d460 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
1d470 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1d480 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1d490 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
1d4a0 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66    /* Unable to f
1d4b0 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20  latten compound 
1d4c0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28  queries */.  if(
1d4d0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
1d4e0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
1d4f0 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
1d500 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1d510 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
1d520 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
1d530 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
1d540 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
1d550 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
1d560 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
1d570 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
1d580 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1d590 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
1d5a0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
1d5b0 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
1d5c0 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
1d5d0 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  gg ){.    if( is
1d5e0 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d610 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1d620 29 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  )   */.    if( p
1d630 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
1d640 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d670 32 61 29 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  2a)  */.    if( 
1d680 28 70 2d 3e 70 57 68 65 72 65 20 26 26 20 45 78  (p->pWhere && Ex
1d690 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d  prHasProperty(p-
1d6a0 3e 70 57 68 65 72 65 2c 45 50 5f 53 75 62 71 75  >pWhere,EP_Subqu
1d6b0 65 72 79 29 29 0a 20 20 20 20 20 7c 7c 20 28 73  ery)).     || (s
1d6c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
1d6d0 61 67 73 28 70 2d 3e 70 45 4c 69 73 74 29 20 26  ags(p->pEList) &
1d6e0 20 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30   EP_Subquery)!=0
1d6f0 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  .     || (sqlite
1d700 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
1d710 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 20 45 50  ->pOrderBy) & EP
1d720 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20  _Subquery)!=0.  
1d730 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1d740 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d770 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 62   Restriction (2b
1d780 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  )  */.    }.  }.
1d790 20 20 20 20 0a 20 20 70 53 75 62 53 72 63 20 3d      .  pSubSrc =
1d7a0 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
1d7b0 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
1d7c0 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
1d7d0 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
1d7e0 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
1d7f0 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
1d800 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
1d810 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
1d820 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
1d830 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
1d840 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
1d850 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1d860 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
1d870 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
1d880 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1d890 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
1d8a0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1d8b0 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
1d8c0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
1d8d0 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
1d8e0 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
1d8f0 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
1d900 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
1d910 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1d920 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
1d930 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d940 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d950 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
1d960 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20  ( pSub->pOffset 
1d970 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d9a0 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
1d9b0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1d9c0 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30   SF_Compound)!=0
1d9d0 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
1d9e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1d9f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
1da30 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
1da40 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
1da50 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1da80 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (7)  */.  if( pS
1da90 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1daa0 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  F_Distinct ) ret
1dab0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1dac0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1dad0 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (5)  */.  if( pS
1dae0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1daf0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
1db00 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
1db10 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1db20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
1db30 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20  (8)(9) */.  }.  
1db40 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1db50 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
1db60 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73  =0 && subqueryIs
1db70 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75  Agg ){.     retu
1db80 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1db90 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
1dba0 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70    */.  }.  if( p
1dbb0 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
1dbc0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1dbd0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dc10 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
1dc20 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
1dc30 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1dc40 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc60 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
1dc70 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1dc80 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68  pLimit && p->pWh
1dc90 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dcb0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29  Restriction (19)
1dcc0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1dcd0 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65  pLimit && (p->se
1dce0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1dcf0 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  inct)!=0 ){.    
1dd00 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1dd10 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dd20 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (21) */.  }.  
1dd30 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e  testcase( pSub->
1dd40 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1dd50 63 75 72 73 69 76 65 20 29 3b 0a 20 20 74 65 73  cursive );.  tes
1dd60 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c  tcase( pSub->sel
1dd70 46 6c 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d 61  Flags & SF_MinMa
1dd80 78 41 67 67 20 29 3b 0a 20 20 69 66 28 20 70 53  xAgg );.  if( pS
1dd90 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  ub->selFlags & (
1dda0 53 46 5f 52 65 63 75 72 73 69 76 65 7c 53 46 5f  SF_Recursive|SF_
1ddb0 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20 20  MinMaxAgg) ){.  
1ddc0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1ddd0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29  estrictions (22)
1dde0 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20 7d   and (24) */.  }
1ddf0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1de00 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
1de10 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72  ve) && pSub->pPr
1de20 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
1de30 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74  n 0; /* Restrict
1de40 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d 0a  ion (23) */.  }.
1de50 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  /* OBSOLETE C
1de60 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52  OMMENT 1:.  ** R
1de70 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
1de80 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1de90 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
1dea0 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
1deb0 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
1dec0 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
1ded0 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
1dee0 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
1def0 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
1df00 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
1df10 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
1df20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
1df30 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
1df40 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
1df50 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
1df60 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
1df70 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
1df80 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
1df90 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
1dfa0 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
1dfb0 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
1dfc0 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
1dfd0 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  thing..  **.  **
1dfe0 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1dff0 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 2:.  ** Restri
1e000 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
1e010 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
1e020 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1e030 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
1e040 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
1e050 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
1e060 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
1e070 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
1e080 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
1e090 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
1e0a0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1e0b0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1e0c0 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
1e0d0 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
1e0e0 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
1e0f0 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
1e100 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
1e110 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
1e120 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
1e130 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
1e140 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
1e150 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
1e160 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
1e170 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
1e180 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
1e190 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
1e1a0 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
1e1b0 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
1e1c0 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
1e1d0 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   JOIN..  **.  **
1e1e0 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20   THIS OVERRIDES 
1e1f0 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
1e200 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a  S 1 AND 2 ABOVE:
1e210 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33  .  ** Ticket #33
1e220 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c  00 shows that fl
1e230 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67  attening the rig
1e240 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
1e250 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66  T JOIN.  ** is f
1e260 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67  raught with dang
1e270 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f  er.  Best to avo
1e280 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  id the whole thi
1e290 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  ng.  If the.  **
1e2a0 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1e2b0 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
1e2c0 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
1e2d0 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
1e2e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75  .  */.  if( (pSu
1e2f0 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
1e300 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
1e310 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1e320 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
1e330 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65  ction 17: If the
1e340 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1e350 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c  compound SELECT,
1e360 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20   then it must.  
1e370 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20  ** use only the 
1e380 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
1e390 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20  or. And none of 
1e3a0 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63  the simple selec
1e3b0 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  t queries.  ** t
1e3c0 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
1e3d0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
1e3e0 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  are allowed to b
1e3f0 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64  e aggregate or d
1e400 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65  istinct.  ** que
1e410 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ries..  */.  if(
1e420 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b   pSub->pPrior ){
1e430 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1e440 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1e450 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52   return 0;  /* R
1e460 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f  estriction 20 */
1e470 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1e480 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  sAgg || (p->selF
1e490 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1e4a0 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e  ct)!=0 || pSrc->
1e4b0 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  nSrc!=1 ){.     
1e4c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1e4d0 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70  .    for(pSub1=p
1e4e0 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62  Sub; pSub1; pSub
1e4f0 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29  1=pSub1->pPrior)
1e500 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e510 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1e520 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1e530 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1e540 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
1e550 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e560 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1e570 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1e580 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1e590 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
1e5a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e5b0 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a  Sub->pSrc!=0 );.
1e5c0 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31        if( (pSub1
1e5d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1e5e0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1e5f0 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20  regate))!=0.    
1e600 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50     || (pSub1->pP
1e610 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f  rior && pSub1->o
1e620 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20  p!=TK_ALL) .    
1e630 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72     || pSub1->pSr
1e640 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20  c->nSrc<1.      
1e650 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74   || pSub->pEList
1e660 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62 31 2d 3e  ->nExpr!=pSub1->
1e670 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20  pEList->nExpr.  
1e680 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
1e690 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1e6a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e6b0 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
1e6c0 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  rc>1 );.    }.. 
1e6d0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e6e0 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28  n 18. */.    if(
1e6f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
1e700 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1e710 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1e720 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
1e730 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
1e740 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1e750 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69  rBy->a[ii].u.x.i
1e760 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
1e770 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1e780 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1e790 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63  ***** If we reac
1e7a0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c  h this point, fl
1e7b0 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
1e7c0 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20  itted. *****/.  
1e7d0 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
1e7e0 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e  arse,p,("flatten
1e7f0 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d   %s.%p from term
1e800 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
1e810 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d             pSub-
1e820 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c  >zSelName, pSub,
1e830 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20   iFrom));..  /* 
1e840 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75  Authorize the su
1e850 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72  bquery */.  pPar
1e860 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1e870 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61   = pSubitem->zNa
1e880 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69  me;.  TESTONLY(i
1e890 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43   =) sqlite3AuthC
1e8a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1e8b0 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
1e8c0 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65  , 0);.  testcase
1e8d0 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59  ( i==SQLITE_DENY
1e8e0 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   );.  pParse->zA
1e8f0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
1e900 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
1e910 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62  .  /* If the sub
1e920 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
1e930 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
1e940 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20  ement, then (by 
1e950 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a  restrictions.  *
1e960 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76  * 17 and 18 abov
1e970 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20  e) it must be a 
1e980 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68  UNION ALL and th
1e990 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d  e parent query m
1e9a0 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20  ust .  ** be of 
1e9b0 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20  the form:.  **. 
1e9c0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c   **     SELECT <
1e9d0 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20  expr-list> FROM 
1e9e0 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77  (<sub-query>) <w
1e9f0 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20  here-clause> .  
1ea00 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64  **.  ** followed
1ea10 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59   by any ORDER BY
1ea20 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f  , LIMIT and/or O
1ea30 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
1ea40 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63  his block.  ** c
1ea50 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65  reates N-1 copie
1ea60 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  s of the parent 
1ea70 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e  query without an
1ea80 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
1ea90 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45  T or .  ** OFFSE
1eaa0 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f  T clauses and jo
1eab0 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ins them to the 
1eac0 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  left-hand-side o
1ead0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  f the original. 
1eae0 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20   ** using UNION 
1eaf0 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49  ALL operators. I
1eb00 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73  n this case N is
1eb10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
1eb20 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63  imple.  ** selec
1eb30 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  t statements in 
1eb40 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
1eb50 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a  -query..  **.  *
1eb60 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
1eb70 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1eb80 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20  a+1 FROM (.  ** 
1eb90 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20         SELECT x 
1eba0 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
1ebb0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1ebc0 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1ebd0 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T y FROM tab.  *
1ebe0 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
1ebf0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
1ec00 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46  ELECT abs(z*2) F
1ec10 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20  ROM tab2.  **   
1ec20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f    ) WHERE a!=5 O
1ec30 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
1ec40 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20   ** Transformed 
1ec50 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  into:.  **.  ** 
1ec60 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46      SELECT x+1 F
1ec70 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b  ROM tab WHERE x+
1ec80 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
1ec90 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1eca0 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d   SELECT y+1 FROM
1ecb0 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d   tab WHERE y+1!=
1ecc0 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
1ecd0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
1ece0 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20  LECT abs(z*2)+1 
1ecf0 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20  FROM tab2 WHERE 
1ed00 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20  abs(z*2)+1!=5.  
1ed10 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
1ed20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63  1.  **.  ** We c
1ed30 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f  all this the "co
1ed40 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
1ed50 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a  flattening"..  *
1ed60 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75  /.  for(pSub=pSu
1ed70 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b  b->pPrior; pSub;
1ed80 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1ed90 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
1eda0 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c  *pNew;.    ExprL
1edb0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
1edc0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
1edd0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
1ede0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45  p->pLimit;.    E
1edf0 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70  xpr *pOffset = p
1ee00 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53  ->pOffset;.    S
1ee10 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20  elect *pPrior = 
1ee20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
1ee30 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1ee40 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b      p->pSrc = 0;
1ee50 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
1ee60 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69   0;.    p->pLimi
1ee70 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f  t = 0;.    p->pO
1ee80 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
1ee90 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  New = sqlite3Sel
1eea0 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29  ectDup(db, p, 0)
1eeb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
1eec0 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c  ectSetName(pNew,
1eed0 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29   pSub->zSelName)
1eee0 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74  ;.    p->pOffset
1eef0 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
1ef00 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
1ef10 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  it;.    p->pOrde
1ef20 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
1ef30 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
1ef40 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20  rc;.    p->op = 
1ef50 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  TK_ALL;.    if( 
1ef60 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1ef70 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
1ef80 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ior;.    }else{.
1ef90 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69        pNew->pPri
1efa0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
1efb0 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20     if( pPrior ) 
1efc0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
1efd0 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  pNew;.      pNew
1efe0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
1eff0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
1f000 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  New;.      SELEC
1f010 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c  TTRACE(2,pParse,
1f020 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f  p,.         ("co
1f030 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
1f040 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74 65  flattener create
1f050 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c  s %s.%p as peer\
1f060 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65  n",.         pNe
1f070 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65  w->zSelName, pNe
1f080 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  w));.    }.    i
1f090 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1f0a0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
1f0b0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
1f0c0 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69  flattening the i
1f0d0 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
1f0e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f0f0 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75   .  ** in the ou
1f100 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
1f110 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d    pSub = pSub1 =
1f120 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1f130 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  ct;..  /* Delete
1f140 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
1f150 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
1f160 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1f170 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1f180 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
1f190 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
1f1a0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
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 4e  db, pSubitem->zN
1f1d0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
1f1e0 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
1f1f0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70  em->zAlias);.  p
1f200 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1f210 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  se = 0;.  pSubit
1f220 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
1f230 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1f240 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  s = 0;.  pSubite
1f250 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  m->pSelect = 0;.
1f260 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65  .  /* Defer dele
1f270 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f  ting the Table o
1f280 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
1f290 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1f2a0 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f  ubquery until co
1f2b0 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73  de generation is
1f2c0 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20  .  ** complete, 
1f2d0 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20  since there may 
1f2e0 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72  still exist Expr
1f2f0 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68  .pTab entries th
1f300 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f  at.  ** refer to
1f310 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76   the subquery ev
1f320 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e  en after flatten
1f330 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33  ing.  Ticket #33
1f340 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53  46..  **.  ** pS
1f350 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20  ubitem->pTab is 
1f360 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  always non-NULL 
1f370 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74  by test restrict
1f380 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61  ions and tests a
1f390 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bove..  */.  if(
1f3a0 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d   ALWAYS(pSubitem
1f3b0 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
1f3c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44    Table *pTabToD
1f3d0 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  el = pSubitem->p
1f3e0 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
1f3f0 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20  bToDel->nRef==1 
1f400 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a  ){.      Parse *
1f410 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1f420 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1f430 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f440 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74  pTabToDel->pNext
1f450 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76  Zombie = pToplev
1f460 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  el->pZombieTab;.
1f470 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1f480 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
1f490 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c  abToDel;.    }el
1f4a0 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  se{.      pTabTo
1f4b0 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  Del->nRef--;.   
1f4c0 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d   }.    pSubitem-
1f4d0 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >pTab = 0;.  }..
1f4e0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1f4f0 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  ng loop runs onc
1f500 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
1f510 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  in a compound-su
1f520 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74  bquery.  ** flat
1f530 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72  tening (as descr
1f540 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66  ibed above).  If
1f550 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1f560 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20  different kind. 
1f570 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e   ** of flattenin
1f580 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67  g - a flattening
1f590 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
1f5a0 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
1f5b0 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a  flattening -.  *
1f5c0 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70  * then this loop
1f5d0 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e   only runs once.
1f5e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
1f5f0 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f  loop moves all o
1f600 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
1f610 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
1f620 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
1f630 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
1f640 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
1f650 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
1f660 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
1f670 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
1f680 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
1f690 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
1f6a0 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
1f6b0 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
1f6c0 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
1f6d0 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
1f6e0 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
1f6f0 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
1f700 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
1f710 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
1f720 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
1f730 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
1f740 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
1f750 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
1f760 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
1f770 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
1f780 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
1f790 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
1f7a0 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
1f7b0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61  ..  */.  for(pPa
1f7c0 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b  rent=p; pParent;
1f7d0 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74   pParent=pParent
1f7e0 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70  ->pPrior, pSub=p
1f7f0 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
1f800 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20    int nSubSrc;. 
1f810 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d     u8 jointype =
1f820 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20   0;.    pSubSrc 
1f830 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20  = pSub->pSrc;   
1f840 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1f850 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a   of subquery */.
1f860 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53      nSubSrc = pS
1f870 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a  ubSrc->nSrc;  /*
1f880 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
1f890 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f   in subquery FRO
1f8a0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
1f8b0 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
1f8c0 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
1f8d0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1f8e0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a  outer query */..
1f8f0 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a      if( pSrc ){.
1f900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1f910 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20  arent==p );  /* 
1f920 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75  First time throu
1f930 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
1f940 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20       jointype = 
1f950 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
1f960 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pe;.    }else{. 
1f970 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1f980 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32  rent!=p );  /* 2
1f990 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
1f9a0 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20  t times through 
1f9b0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
1f9c0 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
1f9d0 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
1f9e0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
1f9f0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1fa00 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
1fa10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fa20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1fa30 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d );.        bre
1fa40 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1fa50 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75  }..    /* The su
1fa60 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69  bquery uses a si
1fa70 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65  ngle slot of the
1fa80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1fa90 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  the outer.    **
1faa0 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20   query.  If the 
1fab0 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72  subquery has mor
1fac0 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65  e than one eleme
1fad0 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  nt in its FROM c
1fae0 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68  lause,.    ** th
1faf0 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  en expand the ou
1fb00 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b  ter query to mak
1fb10 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74  e space for it t
1fb20 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65  o hold all eleme
1fb30 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
1fb40 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
1fb50 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
1fb60 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1fb70 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1fb80 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20  M tabA, (SELECT 
1fb90 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62  * FROM sub1, sub
1fba0 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a  2), tabB;.    **
1fbb0 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65  .    ** The oute
1fbc0 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c  r query has 3 sl
1fbd0 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ots in its FROM 
1fbe0 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f  clause.  One slo
1fbf0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
1fc00 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65  outer query (the
1fc10 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73   middle slot) is
1fc20 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62   used by the sub
1fc30 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74  query.  The next
1fc40 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66  .    ** block of
1fc50 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e   code will expan
1fc60 64 20 74 68 65 20 6f 75 74 20 71 75 65 72 79 20  d the out query 
1fc70 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65  to 4 slots.  The
1fc80 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73   middle.    ** s
1fc90 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20  lot is expanded 
1fca0 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20  to two slots in 
1fcb0 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70  order to make sp
1fcc0 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ace for the.    
1fcd0 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20  ** two elements 
1fce0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1fcf0 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1fd00 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
1fd10 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
1fd20 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1fd30 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c  Src = pSrc = sql
1fd40 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1fd50 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75  ge(db, pSrc, nSu
1fd60 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b  bSrc-1,iFrom+1);
1fd70 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
1fd80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1fd90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1fda0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1fdb0 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
1fdc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1fdd0 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71  ms from the subq
1fde0 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
1fdf0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1fe00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1fe10 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
1fe20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1fe30 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1fe40 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69  (db, pSrc->a[i+i
1fe50 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  From].pUsing);. 
1fe60 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
1fe70 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
1fe80 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
1fe90 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
1fea0 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
1feb0 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
1fec0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
1fed0 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65  [iFrom].jointype
1fee0 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a   = jointype;.  .
1fef0 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e      /* Now begin
1ff00 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
1ff10 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
1ff20 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
1ff30 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  r .    ** refere
1ff40 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72  nces to the iPar
1ff50 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ent in the outer
1ff60 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a   query..    ** .
1ff70 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
1ff80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1ff90 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
1ffa0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
1ffb0 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
1ffc0 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
1ffd0 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c   a>b;.    **   \
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fff0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
20000 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
20010 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
20020 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f    /.    **    \_
20030 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20040 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
20050 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
20060 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
20070 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
20080 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20  e look at every 
20090 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
200a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
200b0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
200c0 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20   see.    ** "a" 
200d0 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
200e0 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
200f0 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
20100 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
20110 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  10"..    */.    
20120 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d  pList = pParent-
20130 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72  >pEList;.    for
20140 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
20150 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
20160 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
20170 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ].zName==0 ){.  
20180 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
20190 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
201a0 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
201b0 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [i].zSpan);.    
201c0 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
201d0 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  te(zName);.     
201e0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
201f0 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
20200 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20210 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
20220 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  , pParent->pELis
20230 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
20240 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  ->pEList);.    i
20250 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
20260 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
20270 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72  db, pParent->pGr
20280 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
20290 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
202a0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
202b0 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
202c0 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
202d0 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
202e0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
202f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
20300 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
20310 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
20320 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
20330 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
20340 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
20350 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
20360 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
20370 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
20380 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
20390 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
203a0 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
203b0 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
203c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
203d0 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
203e0 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
203f0 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
20400 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
20410 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
20420 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
20430 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
20440 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
20450 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
20460 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
20470 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
20480 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
20490 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
204a0 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
204b0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
204c0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
204d0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
204e0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
204f0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
20500 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
20510 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
20520 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
20530 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
20540 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
20550 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
20560 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
20570 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
20580 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
20590 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
205a0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
205b0 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
205c0 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
205d0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
205e0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
205f0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
20600 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
20610 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
20620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20630 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
20640 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
20650 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f  ert( pSub->pPrio
20660 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  r==0 );.      pP
20670 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
20680 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
20690 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
206a0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
206b0 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  if( pParent->pOr
206c0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
206d0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
206e0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
206f0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
20700 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
20710 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
20720 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
20730 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
20740 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
20750 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
20760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20770 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Where = 0;.    }
20780 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72  .    if( subquer
20790 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20  yIsAgg ){.      
207a0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
207b0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
207c0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
207d0 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d  aving = pParent-
207e0 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70  >pWhere;.      p
207f0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
20800 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70   pWhere;.      p
20810 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
20820 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
20830 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20840 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
20850 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
20860 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20870 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
20880 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
20890 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20  Having, .       
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
208c0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
208d0 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29  ub->pHaving, 0))
208e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
208f0 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
20900 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
20910 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20  arent->pGroupBy 
20920 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
20930 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
20940 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20  GroupBy, 0);.   
20950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
20960 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
20970 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
20980 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69  arent->pWhere, i
20990 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
209a0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
209b0 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
209c0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
209d0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
209e0 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20  e, pWhere);.    
209f0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  }.  .    /* The 
20a00 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
20a10 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
20a20 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
20a30 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
20a40 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
20a50 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
20a60 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
20a70 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
20a80 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
20a90 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
20aa0 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
20ab0 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
20ac0 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
20ad0 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
20ae0 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
20af0 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
20b00 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
20b10 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
20b20 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
20b30 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
20b40 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
20b50 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
20b60 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
20b70 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
20b80 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
20b90 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
20ba0 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
20bb0 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
20bc0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
20bd0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
20be0 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
20bf0 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
20c00 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
20c10 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
20c20 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
20c30 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
20c40 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c  pSub1);..#if SEL
20c50 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
20c60 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
20c70 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
20c80 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20c90 44 65 62 75 67 50 72 69 6e 74 66 28 22 41 66 74  DebugPrintf("Aft
20ca0 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e  er flattening:\n
20cb0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ");.    sqlite3T
20cc0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
20cd0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
20ce0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  if..  return 1;.
20cf0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
20d00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
20d10 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
20d20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
20d30 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
20d40 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
20d50 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
20d60 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
20d70 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
20d80 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
20d90 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
20da0 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
20db0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
20dc0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
20dd0 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
20de0 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
20df0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
20e00 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
20e10 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
20e20 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
20e30 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
20e40 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
20e50 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
20e60 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
20e70 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
20e80 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
20e90 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
20ea0 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
20eb0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
20ec0 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
20ed0 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
20ee0 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
20ef0 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
20f00 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
20f10 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
20f20 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
20f30 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
20f40 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
20f50 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
20f60 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
20f70 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
20f80 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
20f90 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
20fa0 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
20fb0 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
20fc0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
20fd0 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
20fe0 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
20ff0 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
21000 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
21010 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
21020 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
21030 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
21040 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
21050 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
21060 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
21070 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
21080 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
21090 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
210a0 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
210b0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
210c0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
210d0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
210e0 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
210f0 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
21100 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
21110 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
21120 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
21130 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
21140 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
21150 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
21160 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
21170 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
21180 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
21190 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
211a0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
211b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
211c0 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
211d0 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
211e0 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
211f0 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
21200 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
21210 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
21220 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
21230 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
21240 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
21250 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
21260 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
21270 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
21280 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
21290 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
212a0 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
212b0 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
212c0 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
212d0 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
212e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
212f0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
21300 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
21310 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
21320 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
21330 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
21340 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61  rgument is the a
21350 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
21360 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
21370 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
21380 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
21390 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
213a0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
213b0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
213c0 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
213d0 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
213e0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
213f0 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
21400 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
21410 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
21420 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
21430 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
21440 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
21450 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
21460 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
21470 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
21480 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
21490 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
214a0 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
214b0 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
214c0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
214d0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
214e0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
214f0 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
21500 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
21510 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
21520 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
21530 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
21540 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
21550 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
21560 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
21570 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
21580 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
21590 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
215a0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
215b0 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
215c0 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
215d0 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
215e0 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
215f0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
21600 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
21610 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
21620 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
21630 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
21640 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
21650 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
21660 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
21670 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
21680 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
21690 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
216a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
216b0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
216c0 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
216d0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
216e0 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
216f0 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
21700 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
21710 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
21720 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
21730 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
21740 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
21750 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
21760 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
21770 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
21780 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
21790 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
217a0 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
217b0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
217c0 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
217d0 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
217e0 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
217f0 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
21800 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
21810 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
21820 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
21830 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
21840 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
21850 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
21860 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
21870 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
21880 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
21890 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61  zIndex ){.    Ta
218a0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
218b0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61  m->pTab;.    cha
218c0 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f  r *zIndex = pFro
218d0 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49  m->zIndex;.    I
218e0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
218f0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
21900 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
21910 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
21920 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
21930 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20  me, zIndex); .  
21940 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
21950 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
21960 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
21970 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
21980 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
21990 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
219a0 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20  , zIndex, 0);.  
219b0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
219c0 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
219d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
219e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
219f0 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20    pFrom->pIndex 
21a00 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
21a10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21a20 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63  }./*.** Detect c
21a30 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
21a40 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
21a50 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  se an ORDER BY c
21a60 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61  lause with .** a
21a70 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  n alternative co
21a80 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
21a90 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
21aa0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
21ab0 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
21ac0 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
21ad0 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a   .. COLLATE ....
21ae0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  **.** These are 
21af0 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73  rewritten as a s
21b00 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  ubquery:.**.**  
21b10 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
21b20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
21b30 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
21b40 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a  T ... FROM t2).*
21b50 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e  *     ORDER BY .
21b60 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
21b70 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
21b80 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  ormation is nece
21b90 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68  ssary because th
21ba0 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  e multiSelectOrd
21bb0 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a  erBy() routine.*
21bc0 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e  * above that gen
21bd0 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
21be0 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  for a compound S
21bf0 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52  ELECT with an OR
21c00 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
21c10 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c   uses a merge al
21c20 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71  gorithm that req
21c30 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63  uires the same c
21c40 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
21c50 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  e on the.** resu
21c60 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e  lt columns as on
21c70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
21c80 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65  ause.  See ticke
21c90 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  t.** http://www.
21ca0 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
21cb0 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a  nfo/6709574d2a.*
21cc0 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
21cd0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
21ce0 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45   needed for EXCE
21cf0 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61  PT, INTERSECT, a
21d00 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65  nd UNION..** The
21d10 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
21d20 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77  tor works fine w
21d30 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  ith multiSelectO
21d40 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68  rderBy() even wh
21d50 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  en.** there are 
21d60 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e  COLLATE terms in
21d70 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
21d80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
21d90 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
21da0 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c  ctToSubquery(Wal
21db0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
21dc0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
21dd0 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  i;.  Select *pNe
21de0 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  w;.  Select *pX;
21df0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
21e00 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
21e10 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63  t_item *a;.  Src
21e20 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20  List *pNewSrc;. 
21e30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
21e40 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a    Token dummy;..
21e50 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
21e60 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
21e70 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
21e80 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
21e90 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
21ea0 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70  inue;.  for(pX=p
21eb0 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d  ; pX && (pX->op=
21ec0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f  =TK_ALL || pX->o
21ed0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70  p==TK_SELECT); p
21ee0 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a  X=pX->pPrior){}.
21ef0 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65    if( pX==0 ) re
21f00 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
21f10 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64  e;.  a = p->pOrd
21f20 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  erBy->a;.  for(i
21f30 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  =p->pOrderBy->nE
21f40 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  xpr-1; i>=0; i--
21f50 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e  ){.    if( a[i].
21f60 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
21f70 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61  P_Collate ) brea
21f80 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30  k;.  }.  if( i<0
21f90 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
21fa0 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66  ntinue;..  /* If
21fb0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
21fc0 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
21fd0 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
21fe0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
21ff0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
22000 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
22010 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
22020 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  db;.  pNew = sql
22030 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
22040 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
22050 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
22060 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
22070 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74  _Abort;.  memset
22080 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65  (&dummy, 0, size
22090 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e  of(dummy));.  pN
220a0 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ewSrc = sqlite3S
220b0 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
220c0 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c  Term(pParse,0,0,
220d0 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c  0,&dummy,pNew,0,
220e0 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72  0);.  if( pNewSr
220f0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  c==0 ) return WR
22100 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77  C_Abort;.  *pNew
22110 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63   = *p;.  p->pSrc
22120 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d   = pNewSrc;.  p-
22130 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
22140 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
22150 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
22160 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c  e3Expr(db, TK_AL
22170 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  L, 0));.  p->op 
22180 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
22190 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
221a0 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
221b0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
221c0 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
221d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
221e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
221f0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
22200 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a    p->pWith = 0;.
22210 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
22220 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
22230 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
22240 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
22250 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  rted)==0 );.  p-
22260 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
22270 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73  Converted;.  ass
22280 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f  ert( pNew->pPrio
22290 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  r!=0 );.  pNew->
222a0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
222b0 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  pNew;.  pNew->pL
222c0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
222d0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
222e0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
222f0 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  inue;.}..#ifndef
22300 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
22310 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
22320 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79  pWith (which may
22330 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73   be NULL) points
22340 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   to a linked lis
22350 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20  t of nested .** 
22360 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66  WITH contexts, f
22370 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74  rom inner to out
22380 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74  ermost. If the t
22390 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  able identified 
223a0 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  by .** FROM clau
223b0 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d  se element pItem
223c0 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d   is really a com
223d0 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73  mon-table-expres
223e0 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74  sion (CTE) .** t
223f0 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
22400 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20  nter to the CTE 
22410 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74  definition for t
22420 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72  hat table. Other
22430 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e  wise.** return N
22440 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
22450 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
22460 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20  s returned, set 
22470 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f  *ppContext to po
22480 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a  int to the With.
22490 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74  ** object that t
224a0 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20  he returned CTE 
224b0 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73  belongs to..*/.s
224c0 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65  tatic struct Cte
224d0 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20   *searchWith(.  
224e0 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22500 2f 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72  /* Current outer
22510 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
22520 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
22530 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
22540 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ,     /* FROM cl
22550 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20  ause element to 
22560 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74  resolve */.  Wit
22570 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20  h **ppContext   
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22590 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65  OUT: WITH clause
225a0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65   return value be
225b0 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20  longs to */.){. 
225c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
225d0 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d  me;.  if( pItem-
225e0 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26  >zDatabase==0 &&
225f0 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d   (zName = pItem-
22600 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
22610 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66    With *p;.    f
22620 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70  or(p=pWith; p; p
22630 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20  =p->pOuter){.   
22640 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
22650 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
22660 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
22670 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
22680 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61  ICmp(zName, p->a
22690 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
226a0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f  .          *ppCo
226b0 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  ntext = p;.     
226c0 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e       return &p->
226d0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
226e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
226f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
22700 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  ./* The code gen
22710 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73  erator maintains
22720 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69   a stack of acti
22730 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a  ve WITH clauses.
22740 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65  ** with the inne
22750 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  r-most WITH clau
22760 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20  se being at the 
22770 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
22780 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22790 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20  tine pushes the 
227a0 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73  WITH clause pass
227b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
227c0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74   argument.** ont
227d0 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  o the top of the
227e0 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d   stack. If argum
227f0 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75  ent bFree is tru
22800 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
22810 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c  WITH clause will
22820 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64   never be popped
22830 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
22840 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
22850 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72  .** should be fr
22860 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
22870 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
22880 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c   In other cases,
22890 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d   when.** bFree==
228a0 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  0, the With obje
228b0 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  ct will be freed
228c0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
228d0 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
228e0 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20  ment with which 
228f0 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  it is associated
22900 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22910 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20  3WithPush(Parse 
22920 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70  *pParse, With *p
22930 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b  With, u8 bFree){
22940 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65  .  assert( bFree
22950 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  ==0 || pParse->p
22960 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28  With==0 );.  if(
22970 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57   pWith ){.    pW
22980 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50  ith->pOuter = pP
22990 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
229a0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
229b0 20 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72   pWith;.    pPar
229c0 73 65 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20  se->bFreeWith = 
229d0 62 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  bFree;.  }.}../*
229e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
229f0 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
22a00 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
22a10 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
22a20 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
22a30 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
22a40 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
22a50 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
22a60 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
22a70 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
22a80 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
22a90 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
22aa0 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
22ab0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
22ac0 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
22ad0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
22ae0 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
22af0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
22b00 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
22b10 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
22b20 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
22b30 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
22b40 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
22b50 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
22b60 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
22b70 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
22b80 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
22b90 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
22ba0 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
22bb0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
22bc0 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
22bd0 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
22be0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
22bf0 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
22c00 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
22c10 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
22c20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
22c30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
22c40 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
22c50 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
22c60 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
22c70 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
22c80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
22c90 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
22ca0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
22cb0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22cc0 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
22cd0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
22ce0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
22cf0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
22d00 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
22d10 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22d30 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
22d40 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
22d50 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
22d60 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
22d70 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
22d80 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
22d90 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
22da0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
22db0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
22dc0 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
22dd0 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
22de0 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
22df0 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
22e00 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
22e10 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
22e20 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
22e30 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
22e40 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
22e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
22e60 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
22e70 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
22e80 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
22e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22ea0 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
22eb0 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
22ec0 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
22ed0 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
22ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
22ef0 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
22f00 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
22f10 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
22f20 3e 7a 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  >zErr is non-NUL
22f30 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
22f40 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
22f50 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
22f60 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
22f70 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
22f80 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
22f90 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
22fa0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
22fb0 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72  y. If pCte->zErr
22fc0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
22fd0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63  his is not a rec
22fe0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
22ff0 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
23000 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20   case, proceed. 
23010 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65   */.    if( pCte
23020 2d 3e 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->zErr ){.      
23030 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23040 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45  pParse, pCte->zE
23050 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  rr, pCte->zName)
23060 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
23070 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
23080 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
23090 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
230a0 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61  ;.    pFrom->pTa
230b0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
230c0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
230d0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
230e0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
230f0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23100 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d  Abort;.    pTab-
23110 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
23120 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
23130 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
23140 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
23150 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
23160 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e   -1;.    pTab->n
23170 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
23180 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
23190 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
231a0 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62  576) );.    pTab
231b0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
231c0 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  _Ephemeral;.    
231d0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
231e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
231f0 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  p(db, pCte->pSel
23200 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ect, 0);.    if(
23210 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23220 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
23230 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73  E_NOMEM;.    ass
23240 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
23250 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ect );..    /* C
23260 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
23270 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
23280 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70   */.    pSel = p
23290 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
232a0 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65     bMayRecursive
232b0 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54   = ( pSel->op==T
232c0 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f  K_ALL || pSel->o
232d0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
232e0 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
232f0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  sive ){.      in
23300 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69  t i;.      SrcLi
23310 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d  st *pSrc = pFrom
23320 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  ->pSelect->pSrc;
23330 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
23340 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
23350 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  +){.        stru
23360 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
23370 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  *pItem = &pSrc->
23380 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[i];.        if
23390 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
233a0 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  se==0 .         
233b0 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
233c0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
233d0 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
233e0 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  p(pItem->zName, 
233f0 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20  pCte->zName).   
23400 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
23410 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20      pItem->pTab 
23420 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
23430 20 20 70 49 74 65 6d 2d 3e 69 73 52 65 63 75 72    pItem->isRecur
23440 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
23450 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
23460 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c  ;.          pSel
23470 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
23480 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  _Recursive;.    
23490 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
234a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79    }..    /* Only
234b0 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72   one recursive r
234c0 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d  eference is perm
234d0 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69  itted. */ .    i
234e0 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20  f( pTab->nRef>2 
234f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23500 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
23510 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
23520 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
23530 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
23540 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
23550 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
23560 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23570 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
23580 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
23590 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70  ->nRef==1 || ((p
235a0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
235b0 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
235c0 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b  Tab->nRef==2 ));
235d0 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72  ..    pCte->zErr
235e0 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
235f0 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
23600 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
23610 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
23620 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
23630 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c 69   pWith;.    sqli
23640 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
23650 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75 72  alker, bMayRecur
23660 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50 72  sive ? pSel->pPr
23670 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 0a 20 20  ior : pSel);..  
23680 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c    for(pLeft=pSel
23690 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b  ; pLeft->pPrior;
236a0 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50   pLeft=pLeft->pP
236b0 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73  rior);.    pELis
236c0 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73  t = pLeft->pELis
236d0 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  t;.    if( pCte-
236e0 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20  >pCols ){.      
236f0 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
23700 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74  List->nExpr!=pCt
23710 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20  e->pCols->nExpr 
23720 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23730 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
23740 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
23750 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25   %d values for %
23760 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20  d columns",.    
23770 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e          pCte->zN
23780 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ame, pEList->nEx
23790 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr, pCte->pCols-
237a0 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29  >nExpr.        )
237b0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
237c0 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64  ->pWith = pSaved
237d0 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65  With;.        re
237e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
237f0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
23800 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e   pEList = pCte->
23810 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  pCols;.    }..  
23820 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
23830 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
23840 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61  se, pEList, &pTa
23850 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
23860 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  aCol);.    if( b
23870 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
23880 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e        if( pSel->
23890 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
238a0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
238b0 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20     pCte->zErr = 
238c0 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
238d0 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
238e0 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
238f0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
23900 7a 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76  zErr = "recursiv
23910 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61  e reference in a
23920 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a   subquery: %s";.
23930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
23940 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
23950 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
23960 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e      }.    pCte->
23970 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  zErr = 0;.    pP
23980 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
23990 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20  avedWith;.  }.. 
239a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
239b0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
239c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
239d0 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  _CTE./*.** If th
239e0 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20  e SELECT passed 
239f0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
23a00 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73  gument has an as
23a10 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a  sociated WITH .*
23a20 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74  * clause, pop it
23a30 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
23a40 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
23a50 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  f the Parse obje
23a60 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ct..**.** This f
23a70 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
23a80 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61  as the xSelectCa
23a90 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61  llback2() callba
23aa0 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33  ck by.** sqlite3
23ab0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77  SelectExpand() w
23ac0 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45  hen walking a SE
23ad0 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73  LECT tree to res
23ae0 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  olve table.** na
23af0 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52  mes and other FR
23b00 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
23b10 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ts. .*/.static v
23b20 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74  oid selectPopWit
23b30 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  h(Walker *pWalke
23b40 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
23b50 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
23b60 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
23b70 3b 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 20  ;.  With *pWith 
23b80 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28  = findRightmost(
23b90 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66 28  p)->pWith;.  if(
23ba0 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20   pWith!=0 ){.   
23bb0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
23bc0 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b  >pWith==pWith );
23bd0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
23be0 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74  th = pWith->pOut
23bf0 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  er;.  }.}.#else.
23c00 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f  #define selectPo
23c10 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a  pWith 0.#endif..
23c20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
23c30 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63  ne is a Walker c
23c40 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70  allback for "exp
23c50 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54  anding" a SELECT
23c60 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22   statement..** "
23c70 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73  Expanding" means
23c80 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f   to do the follo
23c90 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  wing:.**.**    (
23ca0 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
23cb0 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
23cc0 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
23cd0 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
23ce0 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
23cf0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
23d00 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
23d10 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
23d20 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
23d30 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
23d40 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
23d50 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
23d60 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
23d70 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
23d80 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23d90 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
23da0 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
23db0 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
23dc0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
23dd0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
23de0 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
23df0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
23e00 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
23e10 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
23e20 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
23e30 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
23e40 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
23e50 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
23e60 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
23e70 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
23e80 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
23e90 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
23ea0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
23eb0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
23ec0 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
23ed0 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
23ee0 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
23ef0 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
23f00 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  se to accommodat
23f10 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
23f20 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
23f30 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
23f40 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
23f50 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
23f60 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
23f70 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
23f80 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
23f90 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
23fa0 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
23fb0 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
23fc0 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
23fd0 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
23fe0 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
23ff0 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
24000 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
24010 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
24020 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
24030 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
24040 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
24050 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
24060 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f   in TABLE..**.*/
24070 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
24080 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65  ctExpander(Walke
24090 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
240a0 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
240b0 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
240c0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  r->pParse;.  int
240d0 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c   i, j, k;.  SrcL
240e0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
240f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
24100 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
24110 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
24120 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
24130 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
24140 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74  xpr *pE, *pRight
24150 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20  , *pExpr;.  u16 
24160 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
24170 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65  lFlags;..  p->se
24180 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
24190 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d  anded;.  if( db-
241a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
241b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
241c0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66  _Abort;.  }.  if
241d0 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d  ( NEVER(p->pSrc=
241e0 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73  =0) || (selFlags
241f0 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21   & SF_Expanded)!
24200 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
24210 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
24220 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
24230 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
24240 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
24250 28 20 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65  ( pWalker->xSele
24260 63 74 43 61 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c  ctCallback2==sel
24270 65 63 74 50 6f 70 57 69 74 68 20 29 7b 0a 20 20  ectPopWith ){.  
24280 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73    sqlite3WithPus
24290 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69  h(pParse, findRi
242a0 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
242b0 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  h, 0);.  }..  /*
242c0 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
242d0 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
242e0 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
242f0 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
24300 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
24310 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
24320 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
24330 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
24340 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
24350 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
24360 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
24370 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
24380 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
24390 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
243a0 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
243b0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
243c0 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
243d0 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
243e0 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
243f0 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
24400 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
24410 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
24420 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
24430 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
24440 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
24450 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
24460 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
24470 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
24480 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
24490 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
244a0 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d  m->isRecursive==
244b0 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  0 || pFrom->pTab
244c0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f   );.    if( pFro
244d0 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29  m->isRecursive )
244e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
244f0 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
24500 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
24510 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
24520 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
24530 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
24540 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
24550 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
24560 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
24570 74 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  t( i==0 );.#ifnd
24580 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
24590 54 45 0a 20 20 20 20 20 20 73 65 6c 65 63 74 50  TE.      selectP
245a0 6f 70 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20  opWith(pWalker, 
245b0 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  p);.#endif.     
245c0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
245d0 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  e;.    }.#ifndef
245e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
245f0 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70  .    if( withExp
24600 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  and(pWalker, pFr
24610 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  om) ) return WRC
24620 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20  _Abort;.    if( 
24630 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d  pFrom->pTab ) {}
24640 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20   else.#endif.   
24650 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
24660 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
24670 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
24680 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63  UERY.      Selec
24690 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
246a0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
246b0 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
246c0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
246d0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
246e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
246f0 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sel!=0 );.      
24700 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
24710 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
24720 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  if( sqlite3WalkS
24730 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
24740 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52  Sel) ) return WR
24750 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
24760 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
24770 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
24780 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
24790 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
247a0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
247b0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
247c0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
247d0 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54  ef = 1;.      pT
247e0 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
247f0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
24800 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28  sqlite_sq_%p", (
24810 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20  void*)pTab);.   
24820 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
24830 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d  pPrior ){ pSel =
24840 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d   pSel->pPrior; }
24850 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c  .      selectCol
24860 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
24870 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
24880 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
24890 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
248a0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
248b0 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Key = -1;.      
248c0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
248d0 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
248e0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
248f0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
24900 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
24910 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
24920 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
24930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
24940 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
24950 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
24960 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
24970 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
24980 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
24990 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
249a0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
249b0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
249c0 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
249d0 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
249e0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
249f0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
24a00 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
24a10 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a  nRef==0xffff ){.
24a20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24a30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
24a40 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65  "too many refere
24a50 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20  nces to \"%s\": 
24a60 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20  max 65535",.    
24a70 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
24a80 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  me);.        pFr
24a90 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  om->pTab = 0;.  
24aa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
24ab0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
24ac0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
24ad0 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ++;.#if !defined
24ae0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
24af0 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
24b00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
24b10 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
24b20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
24b30 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  t || IsVirtual(p
24b40 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
24b50 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
24b60 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
24b70 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
24b80 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
24b90 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
24ba0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
24bb0 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20  pParse, pTab) ) 
24bc0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
24bd0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
24be0 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
24bf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
24c00 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
24c10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
24c20 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
24c30 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ct, 0);.        
24c40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
24c50 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c  Name(pFrom->pSel
24c60 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ect, pTab->zName
24c70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
24c80 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
24c90 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
24ca0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  lect);.      }.#
24cb0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
24cc0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
24cd0 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
24ce0 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
24cf0 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
24d00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
24d10 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
24d20 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
24d30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
24d40 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
24d50 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
24d60 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
24d70 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
24d80 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
24d90 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
24da0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
24db0 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
24dc0 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
24dd0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
24de0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
24df0 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
24e00 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
24e10 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
24e20 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
24e30 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
24e40 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
24e50 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
24e60 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
24e70 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
24e80 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
24e90 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
24ea0 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
24eb0 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
24ec0 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
24ed0 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72   the TK_ALL oper
24ee0 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
24ef0 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
24f00 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
24f10 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  st..  ** The fol
24f20 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
24f30 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
24f40 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73  he TK_ALL expres
24f50 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
24f60 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74  .  ** each one t
24f70 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
24f80 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
24f90 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
24fa0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
24fb0 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
24fc0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
24fd0 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
24fe0 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
24ff0 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
25000 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
25010 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
25020 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45  ++){.    pE = pE
25030 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
25040 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
25050 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
25060 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
25070 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
25080 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pE->pRight!=0 );
25090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
250a0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28  >op!=TK_DOT || (
250b0 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20  pE->pLeft!=0 && 
250c0 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pE->pLeft->op==T
250d0 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28  K_ID) );.    if(
250e0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
250f0 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
25100 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
25110 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70  k;.  }.  if( k<p
25120 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
25130 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
25140 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
25150 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
25160 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
25170 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
25180 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
25190 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
251a0 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
251b0 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
251c0 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
251d0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
251e0 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
251f0 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
25200 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
25210 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
25220 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
25230 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
25240 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   0;.    int flag
25250 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  s = pParse->db->
25260 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c  flags;.    int l
25270 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67  ongNames = (flag
25280 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
25290 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20  olNames)!=0.    
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51    && (flags & SQ
252c0 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
252d0 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  es)==0;..    /* 
252e0 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  When processing 
252f0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
25300 75 65 72 69 65 73 2c 20 69 74 20 69 73 20 61 6c  ueries, it is al
25310 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20  ways the case.  
25320 20 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63    ** that full_c
25330 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20  olumn_names=OFF 
25340 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e  and short_column
25350 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a  _names=ON.  The.
25360 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65      ** sqlite3Re
25370 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
25380 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  ) routine makes 
25390 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73  it so. */.    as
253a0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
253b0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
253c0 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  om)==0.         
253d0 20 7c 7c 20 28 28 66 6c 61 67 73 20 26 20 53 51   || ((flags & SQ
253e0 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
253f0 73 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20  s)==0 &&.       
25400 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26 20         (flags & 
25410 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
25420 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20  ames)!=0) );..  
25430 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
25440 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
25450 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b  {.      pE = a[k
25460 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ].pExpr;.      p
25470 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67  Right = pE->pRig
25480 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
25490 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
254a0 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b   || pRight!=0 );
254b0 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
254c0 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45  p!=TK_ALL && (pE
254d0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
254e0 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
254f0 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
25500 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
25510 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
25520 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
25530 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
25540 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
25550 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
25560 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
25570 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
25580 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
25590 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
255a0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
255b0 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
255c0 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
255d0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
255e0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
255f0 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
25600 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
25610 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
25620 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
25630 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
25640 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
25650 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
25660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
25670 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
25680 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
25690 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
256a0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
256b0 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
256c0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
256d0 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
256e0 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
256f0 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
25700 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
25710 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20   *zTName = 0;   
25720 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
25730 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
25740 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
25750 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
25760 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25770 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a  pE->pLeft!=0 );.
25780 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
25790 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
257a0 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50  ty(pE->pLeft, EP
257b0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
257c0 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
257d0 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54   pE->pLeft->u.zT
257e0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oken;.        }.
257f0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
25800 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
25810 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
25820 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
25830 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
25840 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
25850 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
25860 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
25870 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
25880 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  t;.          cha
25890 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
258a0 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
258b0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
258c0 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d  r *zSchemaName =
258d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
258e0 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
258f0 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
25900 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25910 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
25920 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
25930 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
25940 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
25950 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ed ) break;.    
25960 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d        if( pSub==
25970 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46  0 || (pSub->selF
25980 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
25990 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  From)==0 ){.    
259a0 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30          pSub = 0
259b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
259c0 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69  ( zTName && sqli
259d0 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
259e0 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20  e, zTabName)!=0 
259f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25a00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
25a10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25a20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
25a30 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
25a40 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
25a50 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
25a60 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44  zSchemaName = iD
25a70 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69  b>=0 ? db->aDb[i
25a80 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b  Db].zName : "*";
25a90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25aa0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
25ab0 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
25ac0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
25ad0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
25ae0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
25af0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
25b00 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
25b10 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
25b20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
25b30 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
25b40 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
25b50 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
25b60 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
25b70 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
25b80 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
25b90 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
25ba0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
25bb0 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
25bc0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25bd0 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20   zName );.      
25be0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
25bf0 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20   && pSub.       
25c00 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
25c10 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53  MatchSpanName(pS
25c20 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
25c30 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d  .zSpan, 0, zTNam
25c40 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  e, 0)==0.       
25c50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
25c60 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
25c70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
25c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
25c90 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
25ca0 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20  ked as 'hidden' 
25cb0 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20  (currently only 
25cc0 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
25cd0 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74       ** for virt
25ce0 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20  ual tables), do 
25cf0 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69  not include it i
25d00 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20  n the expanded. 
25d10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
25d20 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20  sult-set list.. 
25d30 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
25d40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
25d50 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
25d60 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a  ab->aCol[j]) ){.
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
25d80 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70  sert(IsVirtual(p
25d90 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab));.         
25da0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
25db0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
25dc0 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
25dd0 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  en = 1;..       
25de0 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
25df0 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  zTName==0 ){.   
25e00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
25e10 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  pFrom->jointype 
25e20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
25e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25e40 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75   && tableAndColu
25e50 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
25e60 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30  , i, zName, 0, 0
25e70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
25e80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25e90 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
25ea0 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
25eb0 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
25ec0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
25ed0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
25ee0 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  e to the right o
25ef0 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
25f10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
25f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25f30 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
25f40 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72  3IdListIndex(pFr
25f50 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  om->pUsing, zNam
25f60 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
25f70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
25f80 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
25f90 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
25fa0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
25fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
25fc0 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
25fd0 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
25fe0 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
26000 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
26010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26030 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
26040 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
26050 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
26060 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
26070 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
26080 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
26090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
260a0 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
260b0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
260c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
260d0 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
260e0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
260f0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
26100 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
26110 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
26120 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
26130 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
26140 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
26150 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
26160 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
26170 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
26190 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
261a0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
261b0 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
261c0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
261d0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
261e0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
261f0 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b  Left, pExpr, 0);
26200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26220 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
26250 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
26260 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
26270 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
26280 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
26290 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
262a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
262b0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
262c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
262d0 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
262e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
262f0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
26300 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
26310 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
26320 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
26330 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
26340 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  z = zColname;.  
26350 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
26360 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  me.n = sqlite3St
26370 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29  rlen30(zColname)
26380 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
26390 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
263a0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65  Name(pParse, pNe
263b0 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29  w, &sColname, 0)
263c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
263d0 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65  ( pNew && (p->se
263e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
263f0 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20  edFrom)!=0 ){.  
26400 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
26410 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
26420 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b   *pX = &pNew->a[
26430 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  pNew->nExpr-1];.
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
26450 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ( pSub ){.      
26460 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
26470 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
26480 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  trDup(db, pSub->
26490 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
264a0 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  an);.           
264b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
264c0 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
264e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
264f0 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
26500 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
26510 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20  b, "%s.%s.%s",. 
26520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26540 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
26550 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c  aName, zTabName,
26560 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
26570 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
26580 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
26590 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
265a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
265b0 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54      pX->bSpanIsT
265c0 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ab = 1;.        
265d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
265e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
265f0 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20  db, zToFree);.  
26600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26610 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
26620 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
26630 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
26640 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
26650 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
26660 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
26670 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
26680 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
26690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
266a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
266b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
266c0 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
266d0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
266e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
266f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
26700 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
26710 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a  te(db, pEList);.
26720 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
26730 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51  pNew;.  }.#if SQ
26740 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
26750 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20    if( p->pEList 
26760 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  && p->pEList->nE
26770 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
26780 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
26790 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
267a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
267b0 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
267c0 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
267d0 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  et");.  }.#endif
267e0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
267f0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
26800 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
26810 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
26820 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20  e walker..**.** 
26830 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
26840 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e  e is the Walker.
26850 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
26860 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  en expression tr
26870 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65  ees.** are walke
26880 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63  d without any ac
26890 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65  tions being take
268a0 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20  n at each node. 
268b0 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20   Presumably,.** 
268c0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
268d0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61  e is used for Wa
268e0 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
268f0 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b  ck then .** Walk
26900 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
26910 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20  ck is set to do 
26920 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c  something useful
26930 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73   for every .** s
26940 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
26950 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73  arser tree..*/.s
26960 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61  tatic int exprWa
26970 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
26980 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f  otUsed, Expr *No
26990 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
269a0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
269b0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
269c0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
269d0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
269e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65   This routine "e
269f0 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54  xpands" a SELECT
26a00 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61   statement and a
26a10 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65  ll of its subque
26a20 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64  ries..** For add
26a30 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
26a40 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d  ion on what it m
26a50 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22  eans to "expand"
26a60 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61   a SELECT.** sta
26a70 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20  tement, see the 
26a80 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73  comment on the s
26a90 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b  electExpand work
26aa0 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76  er callback abov
26ab0 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69  e..**.** Expandi
26ac0 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ng a SELECT stat
26ad0 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ement is the fir
26ae0 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65  st step in proce
26af0 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43  ssing a.** SELEC
26b00 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  T statement.  Th
26b10 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
26b20 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e  nt must be expan
26b30 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61  ded before.** na
26b40 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  me resolution is
26b50 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a   performed..**.*
26b60 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
26b70 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72  es wrong, an err
26b80 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
26b90 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73  itten into pPars
26ba0 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  e..** The callin
26bb0 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64  g function can d
26bc0 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65  etect the proble
26bd0 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  m by looking at 
26be0 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20  pParse->nErr.** 
26bf0 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64  and/or pParse->d
26c00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e  b->mallocFailed.
26c10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26c20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
26c30 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  and(Parse *pPars
26c40 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
26c50 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ct){.  Walker w;
26c60 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
26c70 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
26c80 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
26c90 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
26ca0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
26cb0 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  se;.  if( pParse
26cc0 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b  ->hasCompound ){
26cd0 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
26ce0 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74  llback = convert
26cf0 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
26d00 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71  Subquery;.    sq
26d10 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
26d20 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  &w, pSelect);.  
26d30 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  }.  w.xSelectCal
26d40 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
26d50 70 61 6e 64 65 72 3b 0a 20 20 69 66 28 20 28 70  pander;.  if( (p
26d60 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
26d70 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
26d80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 77 2e 78 53  )==0 ){.    w.xS
26d90 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
26da0 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
26db0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 57 61 6c    }.  sqlite3Wal
26dc0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
26dd0 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
26de0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
26df0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
26e00 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
26e10 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
26e20 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
26e30 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
26e40 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
26e50 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
26e60 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
26e70 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
26e80 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
26e90 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
26ea0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
26eb0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
26ec0 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
26ed0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
26ee0 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
26ef0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
26f00 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
26f10 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
26f20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
26f30 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
26f40 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
26f50 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
26f60 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
26f70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
26f80 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
26f90 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
26fa0 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
26fb0 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
26fc0 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
26fd0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
26fe0 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
26ff0 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
27000 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27010 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
27020 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
27030 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
27040 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
27050 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
27060 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
27070 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
27080 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
27090 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
270a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
270b0 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66  Resolved );.  if
270c0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
270d0 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29   SF_HasTypeInfo)
270e0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  ==0 ){.    p->se
270f0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73  lFlags |= SF_Has
27100 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50  TypeInfo;.    pP
27110 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
27120 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62  pParse;.    pTab
27130 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
27140 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
27150 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
27160 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
27170 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
27180 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
27190 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
271a0 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
271b0 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20 28  YS(pTab!=0) && (
271c0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
271d0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
271e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
271f0 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
27200 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
27210 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
27220 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
27230 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
27240 65 63 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ect;.        if(
27250 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
27260 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
27270 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20  pPrior ) pSel = 
27280 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
27290 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41 64          selectAd
272a0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
272b0 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
272c0 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  pTab, pSel);.   
272d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
272e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
272f0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
27300 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
27310 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
27320 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
27330 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
27340 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
27350 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
27360 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
27370 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
27380 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
27390 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
273a0 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
273b0 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
273c0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
273d0 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
273e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
273f0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
27400 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
27410 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
27420 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
27430 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
27440 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65  f(w));.  w.xSele
27450 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
27460 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
27470 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
27480 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
27490 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
274a0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
274b0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
274c0 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
274d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
274e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
274f0 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
27500 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
27510 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
27520 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
27530 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
27540 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
27550 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
27560 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
27570 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
27580 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
27590 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
275a0 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
275b0 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
275c0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
275d0 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
275e0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
275f0 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
27600 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
27610 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
27620 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
27630 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
27640 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
27650 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
27660 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
27670 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
27680 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
27690 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
276a0 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
276b0 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
276c0 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
276d0 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
276e0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
276f0 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
27700 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
27710 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
27720 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
27730 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
27740 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
27750 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
27760 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
27770 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
27780 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
27790 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
277a0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
277b0 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45   *db;.  if( NEVE
277c0 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
277d0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
277e0 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  >db;.  if( db->m
277f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
27800 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73  turn;.  if( p->s
27810 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
27820 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
27830 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
27840 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c  ctExpand(pParse,
27850 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   p);.  if( pPars
27860 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
27870 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
27880 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
27890 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
278a0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
278b0 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
278c0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
278d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
278e0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
278f0 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
27900 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  nfo(pParse, p);.
27910 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
27920 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
27930 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
27940 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
27950 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
27960 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
27970 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
27980 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
27990 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
279a0 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
279b0 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
279c0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
279d0 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73  code that stores
279e0 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
279f0 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a   those memory.**
27a00 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
27a10 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
27a20 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
27a30 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
27a40 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
27a50 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
27a60 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
27a70 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
27a80 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
27a90 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e  nt nReg = pAggIn
27aa0 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67  fo->nFunc + pAgg
27ab0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  Info->nColumn;. 
27ac0 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72   if( nReg==0 ) r
27ad0 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51  eturn;.#ifdef SQ
27ae0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
27af0 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  Verify that all 
27b00 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72  AggInfo register
27b10 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65  s are within the
27b20 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64   range specified
27b30 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f   by.  ** AggInfo
27b40 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e  .mnReg..AggInfo.
27b50 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72  mxReg */.  asser
27b60 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66  t( nReg==pAggInf
27b70 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66  o->mxReg-pAggInf
27b80 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20  o->mnReg+1 );.  
27b90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
27ba0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
27bb0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
27bc0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
27bd0 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
27be0 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
27bf0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   && pAggInfo->aC
27c00 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  ol[i].iMem<=pAgg
27c10 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
27c20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
27c30 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
27c40 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
27c50 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  t( pAggInfo->aFu
27c60 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  nc[i].iMem>=pAgg
27c70 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
27c80 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
27c90 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c  ->aFunc[i].iMem<
27ca0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
27cb0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
27cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27cd0 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
27ce0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  , pAggInfo->mnRe
27cf0 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g, pAggInfo->mxR
27d00 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63  eg);.  for(pFunc
27d10 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
27d20 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
27d30 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
27d40 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Func++){.    if(
27d50 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
27d60 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
27d70 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
27d80 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
27d90 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
27da0 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73  perty(pE, EP_xIs
27db0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
27dc0 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74   if( pE->x.pList
27dd0 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69  ==0 || pE->x.pLi
27de0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
27df0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27e00 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
27e10 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67  "DISTINCT aggreg
27e20 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65  ates must have e
27e30 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20  xactly one ".   
27e40 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e          "argumen
27e50 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  t");.        pFu
27e60 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
27e70 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
27e80 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
27e90 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
27ea0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
27eb0 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
27ec0 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  List, 0, 0);.   
27ed0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27ee0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
27ef0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
27f00 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
27f10 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
27f30 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
27f40 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
27f50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
27f60 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
27f70 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65  e OP_AggFinalize
27f80 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72   opcode for ever
27f90 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
27fa0 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41  tion.** in the A
27fb0 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
27fc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27fd0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
27fe0 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61  tions(Parse *pPa
27ff0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
28000 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
28010 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
28020 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
28030 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
28040 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d  nc *pF;.  for(i=
28050 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
28060 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
28070 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
28080 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  F++){.    ExprLi
28090 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
280a0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
280b0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
280c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
280d0 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
280e0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c  lect) );.    sql
280f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
28100 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
28110 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
28120 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
28130 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
28140 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
28150 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
28160 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
28170 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
28180 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
28190 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
281a0 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
281b0 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
281c0 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
281d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
281e0 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
281f0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
28200 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
28210 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
28220 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
28230 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
28240 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
28250 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
28260 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
28270 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
28280 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
28290 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
282a0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
282b0 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
282c0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
282d0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
282e0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
282f0 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
28300 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
28310 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
28320 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
28330 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
28340 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
28350 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
28360 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
28370 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
28380 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
28390 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
283a0 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
283b0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
283c0 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
283d0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
283e0 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
283f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
28400 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
28410 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
28420 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
28430 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
28440 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
28450 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
28460 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
28470 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
28480 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
28490 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
284a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
284b0 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
284c0 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
284d0 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
284e0 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
284f0 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
28500 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
28510 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75  f( pF->pFunc->fu
28520 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
28530 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
28540 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
28550 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
28560 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
28570 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
28580 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
28590 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
285a0 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
285b0 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
285c0 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
285d0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
285e0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
285f0 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
28600 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
28610 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
28620 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
28630 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
28640 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
28650 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
28660 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
28670 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
28680 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
28690 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
286a0 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
286b0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
286c0 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
286d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
286e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
286f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
28700 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
28710 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
28720 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
28730 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
28740 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
28750 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67  _AggStep, 0, reg
28760 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20  Agg, pF->iMem,. 
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28780 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
28790 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
287a0 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
287b0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
287c0 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
287d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
287e0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
287f0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
28800 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
28810 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
28820 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
28830 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
28840 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
28850 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
28860 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
28870 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
28880 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
28890 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
288a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
288b0 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
288c0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
288d0 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
288e0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
288f0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
28900 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
28910 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
28920 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
28930 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
28940 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
28950 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
28960 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
28970 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
28980 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
28990 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
289a0 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
289b0 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
289c0 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
289d0 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
289e0 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
289f0 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
28a00 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
28a10 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
28a20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
28a30 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
28a40 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
28a50 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
28a60 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
28a70 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
28a80 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
28a90 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
28aa0 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
28ab0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
28ac0 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
28ad0 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
28ae0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
28af0 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
28b00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
28b10 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
28b20 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
28b30 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
28b40 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
28b50 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
28b60 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
28b70 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
28b80 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
28b90 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
28ba0 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
28bb0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
28bc0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
28bd0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
28be0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
28bf0 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
28c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
28c10 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
28c20 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
28c30 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
28c40 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
28c50 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
28c60 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
28c70 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
28c80 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
28c90 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
28ca0 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
28cb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28cc0 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
28cd0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
28ce0 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
28cf0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
28d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28d10 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
28d20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
28d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d40 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
28d50 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
28d60 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28d80 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
28d90 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
28da0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
28db0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
28dc0 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
28dd0 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
28de0 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
28df0 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
28e00 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
28e10 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ));.    char *zE
28e20 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
28e30 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
28e40 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
28e50 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
28e60 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
28e70 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
28e80 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
28e90 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
28ea0 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
28eb0 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
28ec0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
28ed0 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
28ee0 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
28ef0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
28f00 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
28f10 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
28f20 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
28f30 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
28f40 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
28f50 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
28f60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
28f70 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
28f80 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28f90 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
28fa0 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
28fb0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
28fc0 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f  re returned acco
28fd0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c  rding to the Sel
28fe0 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
28ff0 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
29000 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ts in sqliteInt.
29010 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e  h for further in
29020 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
29030 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
29040 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
29050 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
29060 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
29070 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
29080 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
29090 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
290a0 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
290b0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
290c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
290d0 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
290e0 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
290f0 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
29100 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
29110 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
29120 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
29130 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
29140 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
29150 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
29160 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
29170 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29190 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
291a0 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
291b0 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
291c0 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
291d0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
291e0 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
291f0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
29200 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
29210 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
29220 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
29230 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
29240 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
29250 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
29260 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29280 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
29290 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
292a0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
292b0 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
292c0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
292d0 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
292e0 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
292f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
29300 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
29310 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
29320 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
29330 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
29340 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
29350 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
29360 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
29370 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
29380 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
29390 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
293a0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
293b0 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
293c0 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
293d0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
293e0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
293f0 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
29400 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
29410 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
29420 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LL */.  int rc =
29430 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
29440 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
29450 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
29460 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e  tion */.  Distin
29470 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b  ctCtx sDistinct;
29480 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
29490 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54  to code the DIST
294a0 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  INCT keyword */.
294b0 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b    SortCtx sSort;
294c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
294d0 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
294e0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
294f0 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  use */.  AggInfo
29500 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
29510 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
29520 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
29530 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
29540 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
29550 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
29560 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
29570 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
29580 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
29590 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
295a0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
295b0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
295c0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
295d0 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c   int iRestoreSel
295e0 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
295f0 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61  iSelectId;.  pPa
29600 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d  rse->iSelectId =
29610 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
29620 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  lectId++;.#endif
29630 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
29640 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
29650 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
29660 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
29670 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
29680 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
29690 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
296a0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
296b0 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
296c0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
296d0 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
296e0 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
296f0 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  fo));.#if SELECT
29700 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
29710 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
29720 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43  ndent++;.  SELEC
29730 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
29740 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65  p, ("begin proce
29750 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69  ssing:\n"));.  i
29760 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
29770 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
29780 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
29790 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
297a0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
297b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
297c0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
297d0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
297e0 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
297f0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
29800 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
29810 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
29820 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
29830 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
29840 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
29850 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
29860 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
29870 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
29880 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
29890 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
298a0 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
298b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
298c0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
298d0 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
298e0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
298f0 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
29900 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
29910 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
29920 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
29930 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
29940 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
29950 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
29960 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
29970 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
29980 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
29990 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
299a0 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
299b0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
299c0 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
299d0 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
299e0 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
299f0 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
29a00 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
29a10 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
29a20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
29a30 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
29a40 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
29a50 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
29a60 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
29a70 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
29a80 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
29a90 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
29aa0 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
29ab0 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
29ac0 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
29ad0 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
29ae0 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
29af0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
29b00 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  By;.  pTabList =
29b10 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
29b20 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
29b30 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
29b40 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
29b50 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
29b60 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
29b70 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d   }.  isAgg = (p-
29b80 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
29b90 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
29ba0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
29bb0 30 20 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  0 );.#if SELECTT
29bc0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
29bd0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
29be0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
29bf0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
29c00 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
29c10 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65   ("after name re
29c20 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  solution:\n"));.
29c30 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
29c40 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
29c50 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
29c60 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
29c70 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
29c80 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
29c90 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
29ca0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
29cb0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
29cc0 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
29cd0 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
29ce0 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
29cf0 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
29d00 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
29d10 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tput..  */.#ifnd
29d20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
29d30 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68  UBQUERY.  if( ch
29d40 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
29d50 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  nSelectError(pPa
29d60 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69  rse, pDest, pELi
29d70 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
29d80 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
29d90 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
29da0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
29db0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
29dc0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
29dd0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
29de0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
29df0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
29e00 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
29e10 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
29e20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
29e30 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
29e40 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
29e50 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
29e60 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
29e70 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
29e80 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
29e90 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
29ea0 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
29eb0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
29ec0 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20  t isAggSub;..   
29ed0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
29ee0 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
29ef0 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63   Sometimes the c
29f00 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65  ode for a subque
29f10 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ry will be gener
29f20 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ated more than. 
29f30 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74     ** once, if t
29f40 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
29f50 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
29f60 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46   clause in a LEF
29f70 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66  T JOIN,.    ** f
29f80 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20  or example.  In 
29f90 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f  that case, do no
29fa0 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65  t regenerate the
29fb0 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73   code to manifes
29fc0 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20  t.    ** a view 
29fd0 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  or the co-routin
29fe0 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
29ff0 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73   view.  The firs
2a000 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a  t instance.    *
2a010 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  * is sufficient,
2a020 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72   though the subr
2a030 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65  outine to manife
2a040 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73  st the view does
2a050 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
2a060 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  be invoked again
2a070 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
2a080 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2a090 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
2a0a0 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
2a0b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2a0c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a0d0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
2a0e0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
2a0f0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2a100 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
2a110 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2a120 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
2a130 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
2a140 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
2a150 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
2a160 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
2a170 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
2a180 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
2a190 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
2a1a0 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
2a1b0 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
2a1c0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
2a1d0 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
2a1e0 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
2a1f0 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
2a200 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
2a210 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
2a220 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
2a230 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
2a240 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
2a250 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
2a260 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
2a270 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
2a280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
2a290 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
2a2a0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2a2b0 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
2a2c0 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62  isAggSub = (pSub
2a2d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2a2e0 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
2a2f0 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
2a300 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
2a310 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67  , i, isAgg, isAg
2a320 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  gSub) ){.      /
2a330 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
2a340 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
2a350 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
2a360 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
2a370 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
2a380 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
2a390 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
2a3a0 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
2a3b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a3c0 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  i = -1;.    }els
2a3d0 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e  e if( pTabList->
2a3e0 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
2a3f0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2a400 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2a410 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
2a420 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ne).    ){.     
2a430 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
2a440 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
2a450 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
2a460 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2a470 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
2a480 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
2a490 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
2a4a0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2a4b0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2a4c0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
2a4d0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2a4e0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2a4f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2a500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a510 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
2a520 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2a530 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
2a540 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
2a550 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2a560 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2a570 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
2a580 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2a590 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
2a5a0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2a5b0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2a5c0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
2a5d0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2a5e0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2a5f0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2a600 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2a610 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2a620 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
2a630 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2a640 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2a650 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
2a660 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2a670 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
2a680 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2a690 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2a6a0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
2a6b0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2a6c0 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
2a6d0 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
2a6e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2a6f0 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
2a700 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
2a710 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
2a720 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2a730 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
2a740 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2a750 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2a760 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
2a770 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
2a780 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
2a790 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
2a7a0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
2a7b0 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
2a7c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2a7d0 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
2a7e0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2a7f0 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
2a800 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
2a810 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
2a820 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
2a830 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
2a840 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
2a850 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
2a860 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
2a870 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
2a880 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
2a890 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
2a8a0 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
2a8b0 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
2a8c0 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
2a8d0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
2a8e0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2a8f0 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sub==0 );.      
2a900 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2a910 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2a920 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72  m;.      topAddr
2a930 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2a940 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2a950 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65  er, 0, pItem->re
2a960 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2a970 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2a980 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
2a990 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2a9a0 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  >isCorrelated==0
2a9b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2a9c0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2a9d0 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
2a9e0 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
2a9f0 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
2aa00 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
2aa10 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
2aa20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
2aa30 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2aa40 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
2aa50 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
2aa60 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
2aa70 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
2aa80 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
2aa90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2aaa0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2aab0 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
2aac0 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
2aad0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2aae0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2aaf0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
2ab00 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
2ab10 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
2ab20 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2ab30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2ab40 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2ab50 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2ab60 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
2ab70 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2ab80 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2ab90 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2aba0 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2abb0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2abc0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2abd0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2abe0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2abf0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2ac00 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
2ac10 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62  lite3LogEst(pSub
2ac20 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
2ac30 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
2ac40 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
2ac50 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
2ac60 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
2ac70 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2ac80 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2ac90 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
2aca0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
2acb0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2acc0 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
2acd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2ace0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2acf0 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
2ad00 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
2ad10 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2ad20 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2ad30 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
2ad40 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e   if( /*pParse->n
2ad50 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c  Err ||*/ db->mal
2ad60 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2ad70 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
2ad80 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  nd;.    }.    pP
2ad90 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
2ada0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2adb0 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
2adc0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2add0 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67  Src;.    if( !Ig
2ade0 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
2adf0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73  Dest) ){.      s
2ae00 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2ae10 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
2ae20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
2ae30 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
2ae40 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
2ae50 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
2ae60 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
2ae70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
2ae80 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
2ae90 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
2aea0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2aeb0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
2aec0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2aed0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2aee0 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
2aef0 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
2af00 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
2af10 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
2af20 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
2af30 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
2af40 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
2af50 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
2af60 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , p, pDest);.   
2af70 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2af80 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
2af90 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
2afa0 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c  lectId);.#if SEL
2afb0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2afc0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2afd0 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
2afe0 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  d compound-selec
2aff0 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  t processing\n")
2b000 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
2b010 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a  SelectIndent--;.
2b020 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2b030 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2b040 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75  ..  /* If the qu
2b050 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
2b060 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
2b070 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61   but is not an a
2b080 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20  ggregate, and . 
2b090 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63   ** if the selec
2b0a0 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61  t-list is the sa
2b0b0 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20  me as the ORDER 
2b0c0 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68  BY list, then th
2b0d0 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61  is query.  ** ca
2b0e0 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
2b0f0 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e  s a GROUP BY. In
2b100 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
2b110 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
2b120 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
2b130 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  T xyz FROM ... O
2b140 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
2b150 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f  .  ** is transfo
2b160 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  rmed to:.  **.  
2b170 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79  **     SELECT xy
2b180 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50  z FROM ... GROUP
2b190 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59   BY xyz ORDER BY
2b1a0 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   xyz.  **.  ** T
2b1b0 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
2b1c0 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61  s preferred as a
2b1d0 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f   single index (o
2b1e0 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61  r temp-table) ma
2b1f0 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20  y be .  ** used 
2b200 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44  for both the ORD
2b210 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ER BY and DISTIN
2b220 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41  CT processing. A
2b230 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20  s originally .  
2b240 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71  ** written the q
2b250 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20  uery must use a 
2b260 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61  temp-table for a
2b270 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
2b280 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42  he ORDER .  ** B
2b290 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20  Y and DISTINCT, 
2b2a0 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  and an index or 
2b2b0 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61  separate temp-ta
2b2c0 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65  ble for the othe
2b2d0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
2b2e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
2b2f0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
2b300 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
2b310 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c  tinct .   && sql
2b320 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2b330 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72  are(sSort.pOrder
2b340 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d  By, p->pEList, -
2b350 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  1)==0.  ){.    p
2b360 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2b370 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
2b380 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
2b390 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
2b3a0 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
2b3b0 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  0);.    pGroupBy
2b3c0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
2b3d0 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
2b3e0 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
2b3f0 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
2b400 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
2b410 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
2b420 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
2b430 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
2b440 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
2b450 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
2b460 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
2b470 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
2b480 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
2b490 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
2b4a0 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
2b4b0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
2b4c0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2b4d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2b4e0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
2b4f0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2b500 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20  n this sorting. 
2b510 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20   ** index might 
2b520 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75  end up being unu
2b530 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
2b540 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74  can be .  ** ext
2b550 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
2b560 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20  rted order.  If 
2b570 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
2b580 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
2b590 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2b5a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
2b5b0 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  l be changed to 
2b5c0 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a  an OP_Noop once.
2b5d0 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f    ** we figure o
2b5e0 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
2b5f0 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  ing index is not
2b600 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64   needed.  The ad
2b610 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a  drSortIndex.  **
2b620 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
2b630 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  d to facilitate 
2b640 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
2b650 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
2b660 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
2b670 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
2b680 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
2b690 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2b6a0 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72  ist(pParse, sSor
2b6b0 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70  t.pOrderBy, 0, p
2b6c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
2b6d0 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
2b6e0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2b6f0 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  ++;.    sSort.ad
2b700 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
2b710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b720 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2b730 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
2b740 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72       sSort.iECur
2b750 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sor, sSort.pOrde
2b760 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c  rBy->nExpr+1+pEL
2b770 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20  ist->nExpr, 0,. 
2b780 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2b790 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2b7a0 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20  INFO.      );.  
2b7b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
2b7c0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2b7d0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
2b7e0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
2b7f0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
2b800 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
2b810 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
2b820 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
2b830 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
2b840 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
2b850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2b860 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2b870 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
2b880 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
2b890 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
2b8a0 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
2b8b0 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
2b8c0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2b8d0 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
2b8e0 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54  ectRow = LARGEST
2b8f0 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
2b900 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
2b910 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
2b920 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
2b930 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
2b940 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
2b950 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2b960 65 47 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e  eGetOp(v, sSort.
2b970 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e  addrSortIndex)->
2b980 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74  opcode = OP_Sort
2b990 65 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72  erOpen;.    sSor
2b9a0 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53  t.sortFlags |= S
2b9b0 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
2b9c0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
2b9d0 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
2b9e0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
2b9f0 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
2ba00 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
2ba10 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2ba20 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
2ba30 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
2ba40 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2ba50 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
2ba60 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
2ba70 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2ba80 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2bab0 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
2bac0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bae0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
2baf0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2bb00 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
2bb10 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb30 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
2bb40 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
2bb50 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2bb60 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
2bb70 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
2bb80 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2bb90 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2bba0 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
2bbb0 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2bbc0 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2bbd0 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
2bbe0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
2bbf0 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
2bc00 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
2bc10 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2bc20 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
2bc30 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
2bc40 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
2bc50 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
2bc60 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
2bc70 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
2bc80 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
2bc90 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
2bca0 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
2bcb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2bcc0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2bcd0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
2bce0 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd00 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
2bd10 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
2bd20 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  s, 0);.    if( p
2bd30 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2bd40 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2bd50 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2bd60 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
2bd70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
2bd80 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
2bd90 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2bda0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2bdb0 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2bdc0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2bdd0 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2bde0 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
2bdf0 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2be00 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
2be10 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2be20 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
2be30 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2be40 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2be50 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2be60 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
2be70 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
2be80 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2be90 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
2bea0 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
2beb0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
2bec0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2bed0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2bee0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2bef0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
2bf00 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
2bf10 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
2bf20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
2bf30 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
2bf40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
2bf50 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
2bf60 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
2bf70 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
2bf80 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
2bf90 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
2bfa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2bfb0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2bfc0 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
2bfd0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2bfe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bff0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2c000 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2c010 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
2c020 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
2c030 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
2c040 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e   */.    selectIn
2c050 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2c060 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p, pEList, -1, &
2c070 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63  sSort, &sDistinc
2c080 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2c0a0 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
2c0b0 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
2c0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c0d0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2c0e0 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
2c0f0 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  fo));..    /* En
2c100 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2c110 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
2c120 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
2c130 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2c140 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2c150 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
2c160 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
2c170 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
2c180 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2c190 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
2c1a0 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
2c1b0 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
2c1c0 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
2c1d0 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
2c1e0 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
2c1f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
2c200 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
2c210 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
2c220 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
2c230 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
2c240 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
2c250 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2c260 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
2c270 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
2c280 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2c290 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
2c2a0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
2c2b0 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
2c2c0 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
2c2d0 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
2c2f0 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
2c300 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
2c310 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
2c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c330 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
2c340 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
2c350 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
2c360 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
2c370 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
2c380 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
2c390 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
2c3a0 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
2c3b0 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
2c3c0 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
2c3d0 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
2c3e0 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
2c3f0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
2c400 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
2c410 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
2c420 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
2c430 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
2c440 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
2c450 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
2c460 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
2c470 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
2c480 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
2c490 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
2c4a0 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72  */.    int order
2c4b0 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72  ByGrp = 0; /* Tr
2c4c0 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20  ue if the GROUP 
2c4d0 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
2c4e0 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a  are the same */.
2c4f0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
2c500 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
2c510 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
2c520 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
2c530 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
2c540 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
2c550 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2c560 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
2c570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c580 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2c590 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
2c5a0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2c5b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
2c5c0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2c5d0 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
2c5e0 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
2c5f0 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
2c600 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
2c610 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
2c620 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2c630 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2c640 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2c650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c660 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
2c670 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
2c680 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
2c690 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
2c6a0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
2c6b0 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
2c6c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2c6d0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30  ->nSelectRow>100
2c6e0 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
2c6f0 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73   = 100;.    }els
2c700 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  e{.      p->nSel
2c710 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ectRow = 1;.    
2c720 7d 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  }...    /* If th
2c730 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
2c740 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
2c750 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2c760 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a  d they are.    *
2c770 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
2c780 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  n it may be poss
2c790 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20  ible to disable 
2c7a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2c7b0 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  use .    ** on t
2c7c0 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20  he grounds that 
2c7d0 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c  the GROUP BY wil
2c7e0 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73  l cause elements
2c7f0 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20   to come out .  
2c800 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72    ** in the corr
2c810 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c  ect order. It al
2c820 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65  so may not - the
2c830 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73   GROUP BY may us
2c840 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
2c850 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
2c860 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
2c870 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2c880 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
2c890 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
2c8a0 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
2c8b0 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
2c8c0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
2c8d0 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
2c8e0 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
2c8f0 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
2c900 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
2c910 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
2c920 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
2c930 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2c940 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2c950 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
2c960 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
2c970 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
2c980 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
2c990 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
2c9a0 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
2c9b0 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
2c9c0 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
2c9d0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
2c9e0 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
2c9f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2ca00 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
2ca10 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
2ca20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2ca30 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
2ca40 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
2ca50 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
2ca60 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
2ca70 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
2ca80 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
2ca90 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2caa0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
2cab0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
2cac0 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
2cad0 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
2cae0 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
2caf0 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
2cb00 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
2cb10 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
2cb20 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
2cb30 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2cb40 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
2cb50 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2cb60 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
2cb70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
2cb80 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
2cb90 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2cba0 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
2cbb0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2cbc0 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
2cbd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2cbe0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2cbf0 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
2cc00 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
2cc10 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
2cc20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2cc30 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
2cc40 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
2cc50 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2cc60 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
2cc70 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2cc80 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2cc90 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
2cca0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
2ccb0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2ccc0 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
2ccd0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
2cce0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2ccf0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2cd00 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
2cd10 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2cd20 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2cd30 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
2cd40 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2cd50 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
2cd60 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
2cd70 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
2cd80 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2cd90 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
2cda0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
2cdb0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2cdc0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2cdd0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
2cde0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
2cdf0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
2ce00 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
2ce10 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
2ce20 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
2ce30 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
2ce40 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
2ce50 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
2ce60 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2ce70 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
2ce80 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
2ce90 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
2cea0 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
2ceb0 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
2cec0 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20      int j1;     
2ced0 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
2cee0 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
2cef0 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
2cf00 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
2cf10 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
2cf20 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2cf30 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
2cf40 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2cf50 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
2cf60 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2cf70 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
2cf80 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
2cf90 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2cfa0 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
2cfb0 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
2cfc0 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
2cfd0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2cfe0 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
2cff0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
2d000 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
2d010 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
2d020 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
2d030 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
2d040 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
2d050 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
2d060 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
2d070 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
2d080 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
2d090 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
2d0a0 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
2d0b0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
2d0c0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2d0d0 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
2d0e0 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
2d0f0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
2d100 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
2d110 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
2d120 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
2d130 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
2d140 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
2d150 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
2d160 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
2d170 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
2d180 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
2d190 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
2d1a0 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
2d1b0 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
2d1c0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
2d1d0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2d1e0 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
2d1f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
2d200 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
2d210 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2d220 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
2d230 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2d240 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2d250 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67  GroupBy, 0, sAgg
2d260 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Info.nColumn);. 
2d270 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
2d280 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
2d290 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
2d2a0 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
2d2b0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2d2c0 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
2d2d0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2d2e0 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
2d2f0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2d300 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
2d310 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2d320 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
2d330 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
2d340 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
2d350 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
2d360 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
2d370 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2d380 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
2d390 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
2d3a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
2d3b0 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
2d3c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2d3d0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2d3e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2d3f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2d400 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
2d410 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2d420 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
2d430 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2d440 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
2d450 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
2d460 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
2d470 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
2d480 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
2d490 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
2d4a0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2d4b0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2d4c0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2d4d0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
2d4e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d4f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2d500 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
2d510 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2d520 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
2d530 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2d540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2d550 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2d560 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
2d570 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d580 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
2d590 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
2d5a0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2d5b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2d5c0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
2d5d0 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
2d5e0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
2d5f0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
2d600 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
2d610 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
2d620 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
2d630 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
2d640 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
2d650 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
2d660 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
2d670 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
2d680 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
2d690 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
2d6a0 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
2d6b0 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
2d6c0 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
2d6d0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
2d6e0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
2d6f0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
2d700 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2d710 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d720 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
2d730 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
2d740 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
2d750 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2d760 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2d770 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
2d780 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
2d790 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
2d7a0 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
2d7b0 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
2d7c0 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
2d7d0 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
2d7e0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2d7f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2d800 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2d810 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2d820 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
2d830 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2d840 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
2d850 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
2d860 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
2d870 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
2d880 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
2d890 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
2d8a0 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
2d8b0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
2d8c0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
2d8d0 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
2d8e0 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
2d8f0 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
2d900 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
2d910 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
2d920 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
2d930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d940 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
2d950 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
2d960 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
2d970 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
2d980 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
2d990 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
2d9a0 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
2d9b0 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
2d9c0 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
2d9d0 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
2d9e0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2d9f0 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
2da00 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
2da10 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
2da20 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
2da30 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
2da40 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2da50 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
2da60 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
2da70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
2da80 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
2da90 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2daa0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
2dab0 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
2dac0 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
2dad0 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
2dae0 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
2daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2db00 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
2db10 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
2db20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
2db30 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
2db40 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
2db50 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
2db60 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
2db70 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
2db80 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
2db90 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2dba0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
2dbb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2dbc0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
2dbd0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
2dbe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dbf0 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
2dc00 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
2dc10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2dc20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
2dc30 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2dc40 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
2dc50 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2dc60 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2dc70 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
2dc80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2dc90 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2dca0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
2dcb0 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Base, 0);.      
2dcc0 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2dcd0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2dce0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2dcf0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2dd00 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2dd10 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
2dd20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
2dd30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
2dd40 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2dd50 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2dd60 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
2dd70 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
2dd80 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
2dd90 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
2dda0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2ddb0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
2ddc0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dde0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
2ddf0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
2de00 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c  Col->iTable, r1,
2de10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2de20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
2de30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2de40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2de50 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
2de60 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
2de70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
2de80 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
2de90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dea0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
2deb0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2dec0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
2ded0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2dee0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
2def0 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
2df00 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
2df10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2df20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2df30 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
2df40 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2df50 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
2df60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
2df70 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2df80 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
2df90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2dfa0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2dfb0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
2dfc0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
2dfd0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2dfe0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2dff0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2e000 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
2e010 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
2e020 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
2e030 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
2e040 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
2e050 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2e060 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2e070 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
2e080 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
2e090 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
2e0a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e0b0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2e0c0 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
2e0d0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
2e0e0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
2e0f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
2e100 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20  OUP BY sort")); 
2e110 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2e120 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2e130 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
2e140 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
2e150 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2e160 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  ar(pParse);..   
2e170 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2e180 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74  f the index or t
2e190 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75  emporary table u
2e1a0 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50  sed by the GROUP
2e1b0 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a   BY sort.      *
2e1c0 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79  * will naturally
2e1d0 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
2e1e0 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69   the order requi
2e1f0 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52  red by the ORDER
2e200 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61   BY.      ** cla
2e210 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20  use, cancel the 
2e220 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
2e230 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69  open coded earli
2e240 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
2e250 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e     ** This is an
2e260 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
2e270 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
2e280 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74  er should result
2e290 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20   regardless..   
2e2a0 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51     ** Use the SQ
2e2b0 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
2e2c0 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
2e2d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2e2e0 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20  MIZER to .      
2e2f0 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  ** disable this 
2e300 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
2e310 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
2e320 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  s.  */.      if(
2e330 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f   orderByGrp && O
2e340 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2e350 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72  ed(db, SQLITE_Gr
2e360 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20  oupByOrder) .   
2e370 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53      && (groupByS
2e380 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68  ort || sqlite3Wh
2e390 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e  ereIsSorted(pWIn
2e3a0 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  fo)).      ){.  
2e3b0 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2e3c0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2e3d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2e3e0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f  ngeToNoop(v, sSo
2e3f0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2e400 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2e410 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
2e420 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
2e430 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
2e440 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
2e450 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
2e460 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
2e470 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
2e480 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
2e490 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
2e4a0 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
2e4b0 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
2e4c0 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
2e4d0 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
2e4e0 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
2e4f0 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
2e500 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
2e510 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
2e520 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
2e530 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
2e540 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
2e550 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2e560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2e570 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2e580 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
2e590 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
2e5a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2e5b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
2e5c0 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49  orterData, sAggI
2e5d0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2e5e0 73 6f 72 74 4f 75 74 2c 73 6f 72 74 50 54 61 62  sortOut,sortPTab
2e5f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2e600 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
2e610 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
2e620 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
2e630 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
2e640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e650 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2e660 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62  Column, sortPTab
2e670 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
2e680 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e690 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2e6a0 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
2e6b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2e6c0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2e6d0 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
2e6e0 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
2e6f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e700 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2e710 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2e720 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
2e730 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
2e740 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
2e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e760 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
2e770 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
2e780 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
2e790 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
2e7a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2e7b0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2e7c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e7d0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
2e7e0 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20  j1+1, 0, j1+1); 
2e7f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2e800 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
2e810 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
2e820 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
2e830 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
2e840 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
2e850 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
2e860 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
2e870 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
2e880 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
2e890 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
2e8a0 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
2e8b0 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
2e8c0 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
2e8d0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
2e8e0 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
2e8f0 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
2e900 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
2e910 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
2e920 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
2e930 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
2e940 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
2e950 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
2e960 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
2e970 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
2e980 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
2e990 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
2e9a0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
2e9b0 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
2e9c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2e9d0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
2e9e0 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
2e9f0 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
2ea00 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      s
2ea10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2ea20 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2ea30 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
2ea40 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2ea50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2ea60 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
2ea70 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
2ea80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ea90 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
2eaa0 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
2eab0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2eac0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2ead0 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
2eae0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
2eaf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2eb00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2eb10 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
2eb20 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
2eb30 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2eb40 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
2eb50 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
2eb60 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
2eb70 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2eb80 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
2eb90 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
2eba0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
2ebb0 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
2ebc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2ebd0 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
2ebe0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
2ebf0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2ec00 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2ec10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ec20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2ec30 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
2ec40 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2ec50 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
2ec60 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
2ec70 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
2ec80 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
2ec90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2eca0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
2ecb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2ecc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ecd0 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
2ece0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2ecf0 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
2ed00 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  p);.        Vdbe
2ed10 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2ed20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ed30 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2ed40 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2ed50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2ed60 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
2ed70 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
2ed80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2ed90 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
2eda0 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
2edb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2edc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2edd0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2ede0 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
2edf0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2ee00 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2ee10 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
2ee20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
2ee30 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
2ee40 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
2ee50 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2ee60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ee70 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
2ee80 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
2ee90 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2eea0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
2eeb0 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
2eec0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
2eed0 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
2eee0 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
2eef0 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
2ef00 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
2ef10 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
2ef20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
2ef30 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
2ef40 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
2ef50 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
2ef60 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
2ef70 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
2ef80 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
2ef90 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
2efa0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
2efb0 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
2efc0 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
2efd0 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
2efe0 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
2eff0 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
2f000 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
2f010 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
2f020 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
2f030 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
2f040 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2f050 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f060 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2f070 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
2f080 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
2f090 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2f0a0 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
2f0b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f0c0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2f0d0 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2f0e0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
2f0f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2f100 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
2f110 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
2f120 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
2f130 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f140 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2f150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f160 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
2f170 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
2f180 70 75 74 52 6f 77 2b 32 29 3b 20 56 64 62 65 43  putRow+2); VdbeC
2f190 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2f1a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2f1b0 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
2f1c0 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
2f1d0 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
2f1e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f1f0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2f200 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
2f210 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
2f220 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
2f230 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2f240 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f250 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
2f260 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
2f270 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
2f280 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
2f290 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
2f2a0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
2f2b0 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p->pEList, -1, &
2f2c0 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20  sSort,.         
2f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44               &sD
2f2e0 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
2f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f300 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2f310 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
2f320 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
2f330 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2f340 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2f350 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2f360 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2f370 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
2f380 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
2f390 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
2f3a0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
2f3b0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
2f3c0 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
2f3d0 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
2f3e0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2f3f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2f400 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
2f410 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
2f420 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
2f430 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2f440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f450 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2f460 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
2f470 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
2f480 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65  if pGroupBy.  Be
2f490 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75  gin aggregate qu
2f4a0 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52  eries without GR
2f4b0 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65  OUP BY: */.    e
2f4c0 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72  lse {.      Expr
2f4d0 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  List *pDel = 0;.
2f4e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f4f0 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20  MIT_BTREECOUNT. 
2f500 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
2f510 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  ;.      if( (pTa
2f520 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e  b = isSimpleCoun
2f530 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29  t(p, &sAggInfo))
2f540 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
2f550 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75  * If isSimpleCou
2f560 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70  nt() returns a p
2f570 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c  ointer to a Tabl
2f580 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  e structure, the
2f590 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
2f5a0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
2f5b0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
2f5c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2f5d0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f    **   SELECT co
2f5e0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
2f5f0 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  >.        **.   
2f600 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68       ** where th
2f610 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
2f620 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65  e returned repre
2f630 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c  sents table <tbl
2f640 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  >..        **.  
2f650 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74        ** This st
2f660 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f  atement is so co
2f670 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20  mmon that it is 
2f680 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61  optimized specia
2f690 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20  lly. The.       
2f6a0 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73   ** OP_Count ins
2f6b0 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63  truction is exec
2f6c0 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74  uted either on t
2f6d0 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  he intkey table 
2f6e0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2f6f0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
2f700 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c  a for table <tbl
2f710 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69  > or on one of i
2f720 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20  ts indexes. It. 
2f730 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74         ** is bet
2f740 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74  ter to execute t
2f750 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65  he op on an inde
2f760 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72  x, as indexes ar
2f770 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20  e almost.       
2f780 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61   ** always sprea
2f790 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61  d across less pa
2f7a0 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63  ges than their c
2f7b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
2f7c0 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  les..        */.
2f7d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
2f7e0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
2f7f0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
2f800 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
2f810 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
2f820 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20   const int iCsr 
2f830 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2f840 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ;     /* Cursor 
2f850 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a  to scan b-tree *
2f860 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
2f870 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
2f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f890 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
2f8a0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b  ble */.        K
2f8b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2f8c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f8d0 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66      /* Keyinfo f
2f8e0 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78  or scanned index
2f8f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
2f900 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20  x *pBest = 0;   
2f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f920 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66   /* Best index f
2f930 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ound so far */. 
2f940 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74         int iRoot
2f950 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20   = pTab->tnum;  
2f960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2f970 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e  oot page of scan
2f980 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20  ned b-tree */.. 
2f990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
2f9a0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
2f9b0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
2f9c0 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
2f9d0 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
2f9e0 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
2f9f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
2fa00 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
2fa10 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ch for the index
2fa20 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f   that has the lo
2fa30 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a  west scan cost..
2fa40 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2fa50 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31     ** (2011-04-1
2fa60 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66  5) Do not do a f
2fa70 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75  ull scan of an u
2fa80 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a  nordered index..
2fa90 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2faa0 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30     ** (2013-10-0
2fab0 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20  3) Do not count 
2fac0 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61  the entries in a
2fad0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a   partial index..
2fae0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2faf0 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63     ** In practic
2fb00 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  e the KeyInfo st
2fb10 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74  ructure will not
2fb20 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20   be used. It is 
2fb30 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  only .        **
2fb40 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20   passed to keep 
2fb50 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70  OP_OpenRead happ
2fb60 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
2fb70 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
2fb80 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73  wid(pTab) ) pBes
2fb90 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  t = sqlite3Prima
2fba0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
2fbb0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  ;.        for(pI
2fbc0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
2fbd0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
2fbe0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
2fbf0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55      if( pIdx->bU
2fc00 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
2fc10 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
2fc20 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
2fc30 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20  zTabRow.        
2fc40 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72     && pIdx->pPar
2fc50 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20  tIdxWhere==0.   
2fc60 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65          && (!pBe
2fc70 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64  st || pIdx->szId
2fc80 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64  xRow<pBest->szId
2fc90 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20  xRow).          
2fca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2fcb0 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  Best = pIdx;.   
2fcc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fcd0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
2fce0 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
2fcf0 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d    iRoot = pBest-
2fd00 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  >tnum;.         
2fd10 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
2fd20 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
2fd30 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  x(pParse, pBest)
2fd40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2fd50 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
2fd60 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
2fd70 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
2fd80 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
2fd90 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
2fda0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fdb0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f  ddOp4Int(v, OP_O
2fdc0 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69  penRead, iCsr, i
2fdd0 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20  Root, iDb, 1);. 
2fde0 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
2fdf0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
2fe00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2fe10 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
2fe20 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  r *)pKeyInfo, P4
2fe30 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
2fe40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2fe50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2fe60 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72  , OP_Count, iCsr
2fe70 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
2fe80 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  [0].iMem);.     
2fe90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2fea0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
2feb0 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20  , iCsr);.       
2fec0 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
2fed0 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  unt(pParse, pTab
2fee0 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
2fef0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
2ff00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
2ff10 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
2ff20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
2ff30 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ck if the query 
2ff40 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
2ff50 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
2ff60 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
2ff70 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
2ff80 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   min(x) FROM ...
2ff90 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
2ffa0 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
2ffb0 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   ....        **.
2ffc0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74          ** If it
2ffd0 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
2ffe0 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
2fff0 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
30000 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
30010 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
30020 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
30030 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
30040 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
30050 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  use. .        **
30060 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
30070 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
30080 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
30090 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
300a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  n.        ** add
300b0 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72   vdbe code to br
300c0 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70  eak out of the p
300d0 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61  rocessing loop a
300e0 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
300f0 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
30100 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
30110 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
30120 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
30130 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
30140 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65  nteed to operate
30150 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68   on the row with
30160 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20   the minimum or 
30170 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20  maximum .       
30180 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20   ** value of x, 
30190 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71  the only row req
301a0 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20  uired)..        
301b0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20  **.        ** A 
301c0 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
301d0 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
301e0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
301f0 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
30200 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
30210 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c   behavior as fol
30220 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  lows:.        **
30230 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
30240 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
30250 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
30260 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
30270 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
30280 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
30290 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
302a0 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
302b0 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
302c0 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
302d0 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20       for x..    
302e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
302f0 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
30300 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
30310 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
30320 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
30330 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  h.        **    
30340 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
30350 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
30360 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
30370 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
30380 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73          **     s
30390 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
303a0 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
303b0 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
303c0 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
303d0 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
303e0 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
303f0 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
30400 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
30410 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30420 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
30430 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Max = 0;.       
30440 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45   u8 flag = WHERE
30450 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
30460 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
30470 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
30480 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
30490 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
304a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
304b0 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  f( p->pHaving==0
304c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
304d0 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
304e0 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69  (&sAggInfo, &pMi
304f0 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  nMax);.        }
30500 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30510 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69   flag==0 || (pMi
30520 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d  nMax!=0 && pMinM
30530 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b  ax->nExpr==1) );
30540 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  ..        if( fl
30550 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
30560 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
30570 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
30580 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20   pMinMax, 0);.  
30590 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
305a0 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20  MinMax;.        
305b0 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26    if( pMinMax &&
305c0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
305d0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
305e0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
305f0 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
30600 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
30610 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20  MIN ?1:0;.      
30620 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
30630 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
30640 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
30650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
30660 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  .  .        /* T
30670 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
30680 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
30690 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
306a0 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
306b0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
306c0 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
306d0 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
306e0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
306f0 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ow.        ** of
30700 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20   output..       
30710 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
30720 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
30730 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
30740 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20  .        pWInfo 
30750 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
30760 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
30770 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d  List, pWhere, pM
30780 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b  inMax,0,flag,0);
30790 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
307a0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
307b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
307c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
307d0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  el);.          g
307e0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
307f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30800 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
30810 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
30820 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
30830 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d  assert( pMinMax=
30840 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 || pMinMax->n
30850 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
30860 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
30870 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
30880 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  nfo)>0 ){.      
30890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
308a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
308b0 2c 20 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72  , 0, sqlite3Wher
308c0 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
308d0 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  fo));.          
308e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
308f0 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c  "%s() by index",
30900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30910 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52   (flag==WHERE_OR
30920 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a  DERBY_MIN?"min":
30930 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20  "max")));.      
30940 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
30950 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
30960 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e  fo);.        fin
30970 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
30980 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
30990 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nfo);.      }.. 
309a0 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
309b0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
309c0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
309d0 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
309e0 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49  g, addrEnd, SQLI
309f0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
30a00 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
30a10 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
30a20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p->pEList, -1, 
30a30 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
30a40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
30a50 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
30a60 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rEnd);.      sql
30a70 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
30a80 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
30a90 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
30aa0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
30ab0 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
30ac0 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
30ad0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
30ae0 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e  /..  if( sDistin
30af0 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  ct.eTnctType==WH
30b00 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
30b10 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78  RDERED ){.    ex
30b20 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
30b30 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
30b40 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ");.  }..  /* If
30b50 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
30b60 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
30b70 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
30b80 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
30b90 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
30ba0 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
30bb0 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
30bc0 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
30bd0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65  OrderBy ){.    e
30be0 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
30bf0 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 6e 4f  pParse, sSort.nO
30c00 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20  BSat>0 ? "RIGHT 
30c10 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59  PART OF ORDER BY
30c20 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20  ":"ORDER BY");. 
30c30 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
30c40 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ail(pParse, p, &
30c50 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  sSort, pEList->n
30c60 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20  Expr, pDest);.  
30c70 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  }..  /* Jump her
30c80 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71  e to skip this q
30c90 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
30ca0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
30cb0 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20  bel(v, iEnd);.. 
30cc0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68   /* The SELECT h
30cd0 61 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49  as been coded. I
30ce0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72  f there is an er
30cf0 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65  ror in the Parse
30d00 20 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a   structure,.  **
30d10 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   set the return 
30d20 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72  code to 1. Other
30d30 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20  wise 0. */.  rc 
30d40 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  = (pParse->nErr>
30d50 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f  0);..  /* Contro
30d60 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
30d70 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
30d80 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
30d90 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
30da0 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
30db0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
30dc0 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
30dd0 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
30de0 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
30df0 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
30e00 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a  SelectId);..  /*
30e10 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
30e20 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74   names if result
30e30 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
30e40 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74  are to be output
30e50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
30e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
30e70 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
30e80 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
30e90 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
30ea0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
30eb0 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
30ec0 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
30ed0 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
30ee0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Col);.  sqlite3D
30ef0 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
30f00 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53  fo.aFunc);.#if S
30f10 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
30f20 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  ED.  SELECTTRACE
30f30 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
30f40 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  d processing\n")
30f50 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  );.  pParse->nSe
30f60 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65  lectIndent--;.#e
30f70 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
30f80 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
30f90 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 47  TE_DEBUG./*.** G
30fa0 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
30fb0 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70  readable descrip
30fc0 74 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65  tion of a the Se
30fd0 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  lect object..*/.
30fe0 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65 65  void sqlite3Tree
30ff0 56 69 65 77 53 65 6c 65 63 74 28 54 72 65 65 56  ViewSelect(TreeV
31000 69 65 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73  iew *pView, cons
31010 74 20 53 65 6c 65 63 74 20 2a 70 2c 20 75 38 20  t Select *p, u8 
31020 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a 20  moreToFollow){. 
31030 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 70 56   int n = 0;.  pV
31040 69 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72 65  iew = sqlite3Tre
31050 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77 2c  eViewPush(pView,
31060 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a   moreToFollow);.
31070 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31080 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 53 45  wLine(pView, "SE
31090 4c 45 43 54 25 73 25 73 20 28 30 78 25 70 29 22  LECT%s%s (0x%p)"
310a0 2c 0a 20 20 20 20 28 28 70 2d 3e 73 65 6c 46 6c  ,.    ((p->selFl
310b0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
310c0 74 29 20 3f 20 22 20 44 49 53 54 49 4e 43 54 22  t) ? " DISTINCT"
310d0 20 3a 20 22 22 29 2c 0a 20 20 20 20 28 28 70 2d   : ""),.    ((p-
310e0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
310f0 67 67 72 65 67 61 74 65 29 20 3f 20 22 20 61 67  ggregate) ? " ag
31100 67 5f 66 6c 61 67 22 20 3a 20 22 22 29 2c 20 70  g_flag" : ""), p
31110 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  .  );.  if( p->p
31120 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e  Src && p->pSrc->
31130 6e 53 72 63 20 29 20 6e 2b 2b 3b 0a 20 20 69 66  nSrc ) n++;.  if
31140 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 6e 2b  ( p->pWhere ) n+
31150 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  +;.  if( p->pGro
31160 75 70 42 79 20 29 20 6e 2b 2b 3b 0a 20 20 69 66  upBy ) n++;.  if
31170 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 20 6e  ( p->pHaving ) n
31180 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ++;.  if( p->pOr
31190 64 65 72 42 79 20 29 20 6e 2b 2b 3b 0a 20 20 69  derBy ) n++;.  i
311a0 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 6e  f( p->pLimit ) n
311b0 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66  ++;.  if( p->pOf
311c0 66 73 65 74 20 29 20 6e 2b 2b 3b 0a 20 20 69 66  fset ) n++;.  if
311d0 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 6e 2b  ( p->pPrior ) n+
311e0 2b 3b 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65  +;.  sqlite3Tree
311f0 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56 69  ViewExprList(pVi
31200 65 77 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 28  ew, p->pEList, (
31210 6e 2d 2d 29 3e 30 2c 20 22 72 65 73 75 6c 74 2d  n--)>0, "result-
31220 73 65 74 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e  set");.  if( p->
31230 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d  pSrc && p->pSrc-
31240 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74  >nSrc ){.    int
31250 20 69 3b 0a 20 20 20 20 70 56 69 65 77 20 3d 20   i;.    pView = 
31260 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
31270 75 73 68 28 70 56 69 65 77 2c 20 28 6e 2d 2d 29  ush(pView, (n--)
31280 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >0);.    sqlite3
31290 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
312a0 65 77 2c 20 22 46 52 4f 4d 22 29 3b 0a 20 20 20  ew, "FROM");.   
312b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
312c0 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
312d0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
312e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
312f0 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b  m = &p->pSrc->a[
31300 69 5d 3b 0a 20 20 20 20 20 20 53 74 72 41 63 63  i];.      StrAcc
31310 75 6d 20 78 3b 0a 20 20 20 20 20 20 63 68 61 72  um x;.      char
31320 20 7a 4c 69 6e 65 5b 31 30 30 5d 3b 0a 20 20 20   zLine[100];.   
31330 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
31340 75 6d 49 6e 69 74 28 26 78 2c 20 7a 4c 69 6e 65  umInit(&x, zLine
31350 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  , sizeof(zLine),
31360 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
31370 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c  e3XPrintf(&x, 0,
31380 20 22 7b 25 64 2c 2a 7d 22 2c 20 70 49 74 65 6d   "{%d,*}", pItem
31390 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
313a0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
313b0 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  tabase ){.      
313c0 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
313d0 28 26 78 2c 20 30 2c 20 22 20 25 73 2e 25 73 22  (&x, 0, " %s.%s"
313e0 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
313f0 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  se, pItem->zName
31400 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
31410 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  f( pItem->zName 
31420 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31430 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c  e3XPrintf(&x, 0,
31440 20 22 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a   " %s", pItem->z
31450 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
31460 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
31470 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
31480 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
31490 78 2c 20 30 2c 20 22 20 74 61 62 6e 61 6d 65 3d  x, 0, " tabname=
314a0 25 51 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %Q", pItem->pTab
314b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
314c0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
314d0 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
314e0 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
314f0 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 28 41 53  ntf(&x, 0, " (AS
31500 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41   %s)", pItem->zA
31510 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
31520 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
31530 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
31540 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  FT ){.        sq
31550 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
31560 20 30 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22   0, " LEFT-JOIN"
31570 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
31580 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
31590 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 20 20  Finish(&x);.    
315a0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
315b0 77 49 74 65 6d 28 70 56 69 65 77 2c 20 7a 4c 69  wItem(pView, zLi
315c0 6e 65 2c 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  ne, i<p->pSrc->n
315d0 53 72 63 2d 31 29 3b 20 0a 20 20 20 20 20 20 69  Src-1); .      i
315e0 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
315f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
31600 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
31610 63 74 28 70 56 69 65 77 2c 20 70 49 74 65 6d 2d  ct(pView, pItem-
31620 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
31630 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
31640 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
31650 56 69 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20  View);.    }.   
31660 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31670 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a  Pop(pView);.  }.
31680 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
31690 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
316a0 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
316b0 2c 20 22 57 48 45 52 45 22 2c 20 28 6e 2d 2d 29  , "WHERE", (n--)
316c0 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >0);.    sqlite3
316d0 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
316e0 65 77 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 30  ew, p->pWhere, 0
316f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
31700 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
31710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
31720 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
31730 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
31740 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d  prList(pView, p-
31750 3e 70 47 72 6f 75 70 42 79 2c 20 28 6e 2d 2d 29  >pGroupBy, (n--)
31760 3e 30 2c 20 22 47 52 4f 55 50 42 59 22 29 3b 0a  >0, "GROUPBY");.
31770 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
31780 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
31790 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
317a0 70 56 69 65 77 2c 20 22 48 41 56 49 4e 47 22 2c  pView, "HAVING",
317b0 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73   (n--)>0);.    s
317c0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
317d0 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 48 61  pr(pView, p->pHa
317e0 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 73 71  ving, 0);.    sq
317f0 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
31800 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69  (pView);.  }.  i
31810 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
31820 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
31830 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56  eViewExprList(pV
31840 69 65 77 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  iew, p->pOrderBy
31850 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 4f 52 44 45  , (n--)>0, "ORDE
31860 52 42 59 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  RBY");.  }.  if(
31870 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
31880 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31890 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 4c 49  wItem(pView, "LI
318a0 4d 49 54 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a  MIT", (n--)>0);.
318b0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
318c0 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
318d0 2d 3e 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  ->pLimit, 0);.  
318e0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
318f0 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d  wPop(pView);.  }
31900 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65  .  if( p->pOffse
31910 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
31920 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
31930 65 77 2c 20 22 4f 46 46 53 45 54 22 2c 20 28 6e  ew, "OFFSET", (n
31940 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69  --)>0);.    sqli
31950 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
31960 70 56 69 65 77 2c 20 70 2d 3e 70 4f 66 66 73 65  pView, p->pOffse
31970 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
31980 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
31990 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  iew);.  }.  if( 
319a0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
319b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
319c0 20 3d 20 22 55 4e 49 4f 4e 22 3b 0a 20 20 20 20   = "UNION";.    
319d0 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
319e0 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41  .      case TK_A
319f0 4c 4c 3a 20 20 20 20 20 20 20 20 20 7a 4f 70 20  LL:         zOp 
31a00 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
31a10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
31a20 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
31a30 20 20 7a 4f 70 20 3d 20 22 49 4e 54 45 52 53 45    zOp = "INTERSE
31a40 43 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  CT";  break;.   
31a50 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
31a60 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45  T:      zOp = "E
31a70 58 43 45 50 54 22 3b 20 20 20 20 20 62 72 65 61  XCEPT";     brea
31a80 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  k;.    }.    sql
31a90 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d  ite3TreeViewItem
31aa0 28 70 56 69 65 77 2c 20 7a 4f 70 2c 20 28 6e 2d  (pView, zOp, (n-
31ab0 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  -)>0);.    sqlit
31ac0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
31ad0 28 70 56 69 65 77 2c 20 70 2d 3e 70 50 72 69 6f  (pView, p->pPrio
31ae0 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
31af0 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
31b00 69 65 77 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  iew);.  }.  sqli
31b10 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
31b20 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  View);.}.#endif 
31b30 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
31b40 2a 2f 0a                                         */.