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

Artifact 1f2087523007c42900ffcbdeaef06a23ad9329fc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 28 53 29 2d 3e 7a 53 65 6c  2-2,"",(S)->zSel
02e0: 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20 20 20 20  Name,(S)),\.    
02f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0300: 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66  tf X.#else.# def
0310: 69 6e 65 20 53 45 4c 45 43 54 54 52 41 43 45 28  ine SELECTTRACE(
0320: 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64 69 66 0a  K,P,S,X).#endif.
0330: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0340: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0350: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0370: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0380: 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  ** how to proces
0390: 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  s the DISTINCT k
03a0: 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c  eyword, to simpl
03b0: 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61 74  ify passing that
03c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
03d0: 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49  into the selectI
03e0: 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69  nnerLoop() routi
03f0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
0400: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0410: 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73  x DistinctCtx;.s
0420: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0430: 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b  x {.  u8 isTnct;
0440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0450: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0460: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0470: 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79   */.  u8 eTnctTy
0480: 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  pe;   /* One of 
0490: 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  the WHERE_DISTIN
04a0: 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a  CT_* operators *
04b0: 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b  /.  int tabTnct;
04c0: 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c      /* Ephemeral
04d0: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
04e0: 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
04f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ing */.  int add
0500: 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72  rTnct;   /* Addr
0510: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
0520: 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66  hemeral opcode f
0530: 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b  or tabTnct */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0550: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0560: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0570: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0580: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0590: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
05a0: 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
05b0: 61 75 73 65 20 6f 66 20 71 75 65 72 79 20 69 73  ause of query is
05c0: 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f   being coded..*/
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 53 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b  SortCtx SortCtx;
05f0: 0a 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20  .struct SortCtx 
0600: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
0610: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
0620: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
0630: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a  OUP BY clause) *
0640: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20  /.  int nOBSat; 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0660: 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
0670: 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
0680: 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  by indices */.  
0690: 69 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20  int iECursor;   
06a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
06b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73  number for the s
06c0: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  orter */.  int r
06d0: 65 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20  egReturn;       
06e0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
06f0: 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75  ding block-outpu
0700: 74 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  t return address
0710: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42   */.  int labelB
0720: 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  kOut;       /* S
0730: 74 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74  tart label for t
0740: 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  he block-output 
0750: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
0760: 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
0770: 78 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  x;    /* Address
0780: 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65   of the OP_Sorte
0790: 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e  rOpen or OP_Open
07a0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75  Ephemeral */.  u
07b0: 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20  8 sortFlags;    
07c0: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
07d0: 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20  more SORTFLAG_* 
07e0: 62 69 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  bits */.};.#defi
07f0: 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  ne SORTFLAG_UseS
0800: 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a  orter  0x01   /*
0810: 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20   Use SorterOpen 
0820: 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45  instead of OpenE
0830: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a  phemeral */../*.
0840: 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68  ** Delete all th
0850: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53  e content of a S
0860: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e  elect structure.
0870: 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Deallocate the
0880: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
0890: 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72  self only if bFr
08a0: 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ee is true..*/.s
08b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
08c0: 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Select(sqlite3 *
08d0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
08e0: 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69  nt bFree){.  whi
08f0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c  le( p ){.    Sel
0900: 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
0910: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c  >pPrior;.    sql
0920: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
0930: 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  te(db, p->pEList
0940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  );.    sqlite3Sr
0950: 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
0960: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71  p->pSrc);.    sq
0970: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0980: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  db, p->pWhere);.
0990: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
09a0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
09b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
09c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
09d0: 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  e(db, p->pHaving
09e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
09f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0a00: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
0a10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a20: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
0a30: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
0a40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0a50: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
0a60: 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
0a70: 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  e(db, p->pWith);
0a80: 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
0a90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0aa0: 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  b, p);.    p = p
0ab0: 50 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65  Prior;.    bFree
0ac0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
0ad0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0ae0: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0af0: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0b00: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0b10: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0b20: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0b30: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0b40: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
0b50: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
0b60: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
0b70: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
0b80: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
0b90: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
0ba0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0bb0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0bc0: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0bd0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0be0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0bf0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0c00: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0c10: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0c20: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0c30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0c40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0c50: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
0c60: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
0c70: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
0c80: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
0c90: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
0ca0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0cb0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0cc0: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0cd0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0ce0: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0cf0: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0d00: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0d10: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0d20: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0d30: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0d40: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
0d60: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
0d70: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0d80: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
0d90: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
0da0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0db0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0dc0: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0dd0: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0df0: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0e00: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0e10: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0e20: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0e30: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0e40: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
0e50: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
0e60: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
0e70: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
0e80: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
0e90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0ea0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0eb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0ec0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ed0: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0ee0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0ef0: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0f00: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0f10: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0f20: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0f30: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0f40: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
0f50: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0f60: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
0f70: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
0f80: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
0f90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
0fa0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0fb0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0fc0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0fd0: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0fe0: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0ff0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
1000: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
1010: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1020: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1030: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1040: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
1050: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
1060: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
1070: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
1080: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
1090: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
10a0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
10b0: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
10c0: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
10d0: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
10e0: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
10f0: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
1100: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
1110: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1120: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
1130: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
1140: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
1150: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
1160: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1170: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1180: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1190: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [1] = -1;.  if( 
11a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11b0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
11c0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 2c 20 70  lect(db, pNew, p
11d0: 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a  New!=&standin);.
11e0: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
11f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1200: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
1210: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1220: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
1230: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
1240: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
1250: 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45  New;.}..#if SELE
1260: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1270: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
1280: 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f  me of a Select o
1290: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
12a0: 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
12b0: 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f  me(Select *p, co
12c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
12d0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61  {.  if( p && zNa
12e0: 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  me ){.    sqlite
12f0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1300: 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20  f(p->zSelName), 
1310: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73  p->zSelName, "%s
1320: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  ", zName);.  }.}
1330: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1340: 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e  Delete the given
1350: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
1360: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
1370: 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a   substructures..
1380: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1390: 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69  electDelete(sqli
13a0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
13b0: 2a 70 29 7b 0a 20 20 63 6c 65 61 72 53 65 6c 65  *p){.  clearSele
13c0: 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a  ct(db, p, 1);.}.
13d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
13e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  pointer to the r
13f0: 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
1400: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 61 20   statement in a 
1410: 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  compound..*/.sta
1420: 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69 6e 64  tic Select *find
1430: 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65 63 74  Rightmost(Select
1440: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
1450: 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20 70 2d  ->pNext ) p = p-
1460: 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  >pNext;.  return
1470: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
1480: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
1490: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
14a0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
14b0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
14c0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
14d0: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
14e0: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
14f0: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
1500: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
1510: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
1520: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
1530: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
1540: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
1550: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
1560: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
1570: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
1580: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
1590: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
15a0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
15b0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
15c0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
15d0: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
15e0: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
15f0: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
1600: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
1610: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
1620: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
1630: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
1640: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
1650: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
1660: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
1670: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1680: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
1690: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
16a0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
16b0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
16c0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
16d0: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
1700: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
1710: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
1720: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1730: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
1740: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
1750: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
1760: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1770: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
1780: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
1790: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
17a0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
17b0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
17c0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
17d0: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
17e0: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
17f0: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1800: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1810: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1820: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1830: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1840: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1850: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1860: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
1870: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
1880: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
1890: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
18a0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
18b0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
18e0: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
18f0: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1900: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1910: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1920: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1930: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1940: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1950: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1960: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
1970: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1980: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
1990: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
19a0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
19b0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
19c0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
19d0: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
19e0: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
19f0: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1a00: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1a10: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1a20: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1a30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1a40: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1a50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1a60: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
1a70: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
1a80: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1a90: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
1aa0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
1ab0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
1ac0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1ad0: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1ae0: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1af0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b10: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1b20: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1b30: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1b40: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1b50: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1b60: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1b70: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
1b80: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
1b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ba0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
1bb0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
1bc0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1bd0: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1be0: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1bf0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1c00: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1c10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c20: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1c30: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1c40: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1c50: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1c60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c70: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
1c80: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1c90: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
1ca0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
1cb0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
1cc0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1cd0: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1ce0: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1cf0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1d00: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1d10: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1d20: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1d30: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1d40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d50: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1d60: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
1d70: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
1d80: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
1d90: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
1da0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
1db0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
1dc0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1dd0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1de0: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1df0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1e00: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1e10: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1e20: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e40: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1e50: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1e60: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
1e70: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1e80: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
1e90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1ea0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
1eb0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
1ec0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1ed0: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1ee0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1ef0: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1f00: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1f10: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1f20: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1f30: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1f40: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1f50: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1f60: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
1f70: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
1f80: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
1f90: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
1fa0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
1fb0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
1fc0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1fd0: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1fe0: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1ff0: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
2000: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
2010: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
2020: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2030: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
2040: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
2050: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
2060: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2070: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
2080: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
2090: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
20a0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
20b0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
20c0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
20d0: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
20e0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
20f0: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
2100: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
2110: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
2120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2130: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
2140: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
2150: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
2160: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
2180: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
2190: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
21a0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
21b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
21c0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
21d0: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
21e0: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
21f0: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
2200: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
2210: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
2220: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
2230: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
2240: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
2250: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
2260: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
2270: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
2280: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
2290: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
22a0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
22b0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
22c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
22d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
22f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2300: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
2310: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
2320: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
2330: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
2340: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
2350: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2360: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
2370: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
2380: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
2390: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
23a0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
23b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
23c0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
23d0: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
23e0: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
23f0: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
2400: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
2410: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
2420: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
2430: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
2440: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
2450: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
2460: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
2470: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
2480: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
2490: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
24a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
24b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
24c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24d0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
2500: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
2510: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
2520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2530: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2540: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
2550: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
2560: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
2570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2580: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2590: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
25a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
25b0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
25c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25d0: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
25e0: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
25f0: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2620: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
2630: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
2640: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
2650: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2660: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
2670: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
2680: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
26b0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
26c0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
26d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
26e0: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
26f0: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
2700: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
2710: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
2720: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
2730: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
2740: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
2750: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
2760: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
2770: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
2780: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
2790: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
27a0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
27b0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
27c0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
27d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
27e0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
27f0: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2800: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2810: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2820: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2830: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2840: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2850: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2860: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2870: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2880: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2890: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
28a0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
28b0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
28c0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
28d0: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
28e0: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
28f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2900: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2910: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2920: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2930: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2940: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2950: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2960: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
2970: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
2980: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
2990: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
29a0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
29b0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
29c0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
29d0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
29e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
29f0: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2a00: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2a10: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2a20: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2a30: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2a40: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2a50: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2a60: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
2a70: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
2a80: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
2a90: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2aa0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
2ab0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
2ac0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2ad0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2ae0: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2af0: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2b00: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2b10: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2b20: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2b30: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2b40: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2b50: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2b60: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2b70: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
2b80: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2b90: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
2ba0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
2bb0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
2bc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2bd0: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2be0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2bf0: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2c00: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2c10: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2c20: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2c30: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2c40: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2c50: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2c60: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
2c70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2c80: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
2c90: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
2ca0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
2cb0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
2cc0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2cd0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2ce0: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2cf0: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2d00: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2d10: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2d20: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2d30: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2d40: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2d50: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2d60: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
2d70: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
2d80: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
2d90: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
2da0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
2db0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
2dc0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2dd0: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2de0: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2df0: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2e00: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2e10: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2e20: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2e30: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2e40: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2e50: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2e60: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2e70: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2e80: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
2e90: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2ea0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
2eb0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2ec0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2ed0: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2ee0: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2ef0: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2f00: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2f10: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2f20: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2f40: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2f50: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2f60: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
2f70: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
2f80: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2f90: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
2fa0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
2fb0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2fc0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2fd0: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2fe0: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2ff0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
3000: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
3010: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
3020: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
3030: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
3040: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
3050: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
3060: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
3070: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
3080: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
3090: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
30a0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
30b0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
30c0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
30d0: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
30e0: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
30f0: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
3100: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
3110: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
3120: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
3130: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
3140: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
3150: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
3160: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
3170: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
3180: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
3190: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
31a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
31b0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
31c0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
31d0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
31e0: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
31f0: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
3200: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
3210: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
3240: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3250: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
3260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3270: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
3280: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
3290: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32a0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
32b0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
32c0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
32d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32e0: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
32f0: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
3300: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
3310: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
3320: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
3330: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
3340: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
3350: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
3360: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
3370: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
3380: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
3390: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
33a0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
33b0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
33c0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
33d0: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
33e0: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
33f0: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
3400: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
3410: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
3420: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
3430: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3440: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3450: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3460: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3470: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3480: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3490: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
34a0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
34b0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
34c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
34d0: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
34e0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
34f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
3500: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
3510: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
3520: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3530: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
3540: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
3550: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
3560: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
3570: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
3580: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
3590: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
35a0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
35b0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
35c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
35d0: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
35e0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
35f0: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
3600: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3610: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
3620: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
3630: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3640: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
3650: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
3660: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
3670: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
3680: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
3690: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
36a0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
36b0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
36c0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
36d0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
36e0: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
36f0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3700: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3710: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
3720: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3740: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3750: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3760: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3770: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
3780: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
3790: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
37a0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
37b0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
37c0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
37d0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
37e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
37f0: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3800: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3810: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3820: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3830: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3840: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3850: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3860: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
3870: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
3880: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
3890: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
38a0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
38b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
38c0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
38d0: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
38e0: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
38f0: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3900: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3910: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3920: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3930: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3940: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3950: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3960: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
3970: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
3980: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
3990: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
39a0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
39b0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
39c0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
39d0: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
39e0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
39f0: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3a00: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3a10: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3a20: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3a30: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3a40: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3a50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3a60: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
3a70: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
3a80: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
3a90: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
3aa0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
3ab0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
3ac0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3ad0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3ae0: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3af0: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3b00: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3b10: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3b20: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3b30: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3b40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3b50: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3b70: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
3b80: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
3b90: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
3ba0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
3bb0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3bc0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3bd0: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3be0: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3bf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3c00: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3c10: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3c20: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3c30: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3c40: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3c50: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3c60: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
3c70: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
3c80: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
3c90: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
3ca0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
3cb0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
3cc0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3cd0: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3ce0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3cf0: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3d00: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3d10: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3d20: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3d30: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3d40: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3d60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3d70: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
3d80: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
3d90: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
3da0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
3db0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
3dc0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3dd0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3de0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3df0: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3e00: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3e10: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3e20: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3e50: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3e60: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3e70: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
3e80: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3e90: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
3ea0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
3eb0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
3ec0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3ed0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3ee0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
3ef0: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
3f00: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
3f10: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
3f20: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
3f30: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
3f40: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
3f50: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
3f60: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
3f70: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
3f80: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
3f90: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
3fa0: 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a  he end */.);../*
3fb0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
3fc0: 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  e that will push
3fd0: 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 72   the record in r
3fe0: 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74 61  egisters regData
3ff0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67 44  .** through regD
4000: 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f  ata+nData-1 onto
4010: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
4020: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
4030: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
4040: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4050: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
4060: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74  ontext */.  Sort
4070: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
4080: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
4090: 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45  n about the ORDE
40a0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
40b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
40c0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
40d0: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
40e0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
40f0: 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  egData,         
4100: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4110: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4120: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
4130: 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  .  int nData,   
4140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4150: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4160: 69 6e 20 74 68 65 20 64 61 74 61 20 61 72 72 61  in the data arra
4170: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  y */.  int nPref
4180: 69 78 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a  ixReg         /*
4190: 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69 6f   No. of reg prio
41a0: 72 20 74 6f 20 72 65 67 44 61 74 61 20 61 76 61  r to regData ava
41b0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a  ilable for use *
41c0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
41d0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74 20          /* Stmt 
4200: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4210: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71  on */.  int bSeq
4220: 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74   = ((pSort->sort
4230: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
4240: 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b  _UseSorter)==0);
4250: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70  .  int nExpr = p
4260: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
4270: 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
4280: 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52      /* No. of OR
4290: 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
42a0: 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45    int nBase = nE
42b0: 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44 61  xpr + bSeq + nDa
42c0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
42d0: 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20     /* Fields in 
42e0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
42f0: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72 20      /* Regs for 
4330: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
4340: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
4350: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4360: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4370: 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64      /* Assembled
4380: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4390: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d  /.  int nOBSat =
43a0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20   pSort->nOBSat; 
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
43d0: 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a   terms to skip *
43e0: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
4410: 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20 72   to add sorter r
4420: 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72 20  ecord to sorter 
4430: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53  */..  assert( bS
4440: 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31  eq==0 || bSeq==1
4450: 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69   );.  if( nPrefi
4460: 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65  xReg ){.    asse
4470: 72 74 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  rt( nPrefixReg==
4480: 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20  nExpr+bSeq );.  
4490: 20 20 72 65 67 42 61 73 65 20 3d 20 72 65 67 44    regBase = regD
44a0: 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53  ata - nExpr - bS
44b0: 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eq;.  }else{.   
44c0: 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
44d0: 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
44e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
44f0: 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20 73 71   nBase;.  }.  sq
4500: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
4510: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
4520: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72  ort->pOrderBy, r
4530: 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 45  egBase, SQLITE_E
4540: 43 45 4c 5f 44 55 50 29 3b 0a 20 20 69 66 28 20  CEL_DUP);.  if( 
4550: 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69  bSeq ){.    sqli
4560: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4570: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
4580: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4590: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
45a0: 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78   }.  if( nPrefix
45b0: 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Reg==0 ){.    sq
45c0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
45d0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74  e(pParse, regDat
45e0: 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  a, regBase+nExpr
45f0: 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20  +bSeq, nData);. 
4600: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62   }..  sqlite3Vdb
4610: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4620: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
4630: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
4640: 6e 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f 72  nOBSat, regRecor
4650: 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61 74  d);.  if( nOBSat
4660: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  >0 ){.    int re
4670: 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54  gPrevKey;   /* T
4680: 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20  he first nOBSat 
4690: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70  columns of the p
46a0: 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20  revious row */. 
46b0: 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74     int addrFirst
46c0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
46d0: 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20  of the OP_IfNot 
46e0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e  opcode */.    in
46f0: 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20  t addrJmp;      
4700: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
4710: 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65  e OP_Jump opcode
4720: 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   */.    VdbeOp *
4730: 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63  pOp;      /* Opc
4740: 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74  ode that opens t
4750: 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
4760: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20   int nKey;      
4770: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4780: 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75  sorting key colu
4790: 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f  mns, including O
47a0: 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  P_Sequence */.  
47b0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20    KeyInfo *pKI; 
47c0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
47d0: 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73  KeyInfo on the s
47e0: 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a  orter table */..
47f0: 20 20 20 20 72 65 67 50 72 65 76 4b 65 79 20 3d      regPrevKey =
4800: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
4810: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4820: 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  m += pSort->nOBS
4830: 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e  at;.    nKey = n
4840: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f  Expr - pSort->nO
4850: 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20 20  BSat + bSeq;.   
4860: 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20   if( bSeq ){.   
4870: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
4880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4890: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
48a0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20  gBase+nExpr); . 
48b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
48c0: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
48d0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
48e0: 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74   OP_SequenceTest
48f0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
4900: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64  r);.    }.    Vd
4910: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4930: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
4940: 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20  re, regPrevKey, 
4950: 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e  regBase, pSort->
4960: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f 70  nOBSat);.    pOp
4970: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4980: 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64  tOp(v, pSort->ad
4990: 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
49a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
49b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
49c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70   return;.    pOp
49d0: 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44  ->p2 = nKey + nD
49e0: 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70  ata;.    pKI = p
49f0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
4a00: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d  .    memset(pKI-
4a10: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  >aSortOrder, 0, 
4a20: 70 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a  pKI->nField); /*
4a30: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62   Makes OP_Jump b
4a40: 65 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f  elow testable */
4a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4a60: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
4a70: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
4a80: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
4a90: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 58 46 69  tcase( pKI->nXFi
4aa0: 65 6c 64 3e 32 20 29 3b 0a 20 20 20 20 70 4f 70  eld>2 );.    pOp
4ab0: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20  ->p4.pKeyInfo = 
4ac0: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
4ad0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
4ae0: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42  t->pOrderBy, nOB
4af0: 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Sat,.           
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 2d 31 29 3b  pKI->nXField-1);
4b30: 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73  .    addrJmp = s
4b40: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
4b50: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
4b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4b70: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
4b80: 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d  Jmp+1, 0, addrJm
4b90: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
4ba0: 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  ge(v);.    pSort
4bb0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73  ->labelBkOut = s
4bc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4bd0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72  bel(v);.    pSor
4be0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  t->regReturn = +
4bf0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
4c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c10: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
4c20: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
4c30: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
4c40: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
4c50: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4c60: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
4c70: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4c80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4c90: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
4ca0: 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71  drFirst);.    sq
4cb0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
4cc0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
4cd0: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70  e, regPrevKey, p
4ce0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20  Sort->nOBSat);. 
4cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4d00: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d  mpHere(v, addrJm
4d10: 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  p);.  }.  if( pS
4d20: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
4d30: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
4d40: 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ter ){.    op = 
4d50: 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b  OP_SorterInsert;
4d60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
4d70: 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b   = OP_IdxInsert;
4d80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4d90: 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
4da0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
4db0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69   regRecord);.  i
4dc0: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  f( pSelect->iLim
4dd0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
4de0: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20  dr1, addr2;.    
4df0: 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  int iLimit;.    
4e00: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  if( pSelect->iOf
4e10: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c  fset ){.      iL
4e20: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
4e30: 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d  iOffset+1;.    }
4e40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d  else{.      iLim
4e50: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c  it = pSelect->iL
4e60: 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  imit;.    }.    
4e70: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
4e80: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
4e90: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  IfZero, iLimit);
4ea0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4ec0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
4ed0: 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31  dImm, iLimit, -1
4ee0: 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
4ef0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
4f00: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
4f10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4f20: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
4f30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4f40: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
4f50: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
4f60: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
4f70: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4f80: 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e  _Delete, pSort->
4f90: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
4fa0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
4fb0: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
4fc0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
4fd0: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
4fe0: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
4ff0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
5000: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
5010: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
5020: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
5030: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
5040: 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20  t iOffset,      
5050: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5060: 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20 63  ing the offset c
5070: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5080: 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a  iContinue     /*
5090: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
50a0: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
50b0: 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ecord */.){.  if
50c0: 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ( iOffset>0 ){. 
50d0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
50e0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
50f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5100: 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c 20  IfNeg, iOffset, 
5110: 30 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65  0, -1); VdbeCove
5120: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
5130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5140: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
5150: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64  ontinue);.    Vd
5160: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
5170: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
5180: 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ds"));.    sqlit
5190: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
51a0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
51b0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
51c0: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
51d0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
51e0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
51f0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
5200: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
5210: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
5220: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
5230: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
5240: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
5250: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
5260: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
5270: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
5280: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
5290: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
52a0: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
52b0: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
52c0: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
52d0: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
52e0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
52f0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
5300: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
5310: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
5320: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
5330: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
5340: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
5350: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
5360: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
5370: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
5380: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
5390: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
53a0: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
53b0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
53c0: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
53d0: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
53e0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
53f0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
5400: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
5410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5420: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
5430: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
5440: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5450: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
5460: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
5470: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
5480: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
5490: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
54a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
54b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
54c0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
54d0: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
54e0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
54f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
5500: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5510: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5520: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
5530: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5540: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5550: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b  sert, iTab, r1);
5560: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
5570: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5580: 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   r1);.}..#ifndef
5590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
55a0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
55b0: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
55c0: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
55d0: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
55e0: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
55f0: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
5600: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
5610: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
5620: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
5630: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
5640: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
5650: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
5660: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
5670: 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63  error used to oc
5680: 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70  cur.** in multip
5690: 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65  le places.  (The
56a0: 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75   error only occu
56b0: 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20  rs in one place 
56c0: 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72  now, but we.** r
56d0: 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75  etain the subrou
56e0: 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  tine to minimize
56f0: 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e   code disruption
5700: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
5710: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
5720: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
5730: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5740: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  ,       /* Parse
5750: 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53   context. */.  S
5760: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
5770: 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69  ,   /* Destinati
5780: 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73  on of SELECT res
5790: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ults */.  int nE
57a0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
57b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
57c0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  lt columns retur
57d0: 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f  ned by SELECT */
57e0: 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  .){.  int eDest 
57f0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
5800: 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26    if( nExpr>1 &&
5810: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
5820: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
5830: 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  et) ){.    sqlit
5840: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5850: 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
5860: 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
5870: 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
5880: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
5890: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
58a0: 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ssion");.    ret
58b0: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
58c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
58d0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
58e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
58f0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
5900: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
5910: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
5920: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
5930: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
5940: 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ab is negative, 
5950: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
5960: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
5970: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
5980: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
5990: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
59a0: 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20 69  ow.  If srcTab i
59b0: 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  s.** zero or mor
59c0: 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  e, then data is 
59d0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
59e0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
59f0: 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74   used only .** t
5a00: 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c  o get number col
5a10: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74  umns and the dat
5a20: 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 63  atype for each c
5a30: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
5a40: 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65   void selectInne
5a50: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
5a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
5a70: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
5a80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
5a90: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
5aa0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
5ab0: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
5ac0: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
5ad0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5ae0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
5af0: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
5b00: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
5b10: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5b30: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
5b40: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  his table */.  S
5b50: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
5b60: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
5b70: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
5b80: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52  ow to process OR
5b90: 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74  DER BY */.  Dist
5ba0: 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e  inctCtx *pDistin
5bb0: 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55  ct, /* If not NU
5bc0: 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20  LL, info on how 
5bd0: 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49  to process DISTI
5be0: 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  NCT */.  SelectD
5bf0: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
5c00: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
5c10: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
5c20: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  s */.  int iCont
5c30: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
5c40: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
5c50: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
5c60: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
5c70: 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
5c80: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
5c90: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
5ca0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
5cb0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
5cc0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5cd0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
5ce0: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
5cf0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5d00: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5d10: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
5d20: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
5d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5d40: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
5d50: 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  y holding result
5d60: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44   set */.  int eD
5d70: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
5d80: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
5d90: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
5da0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
5db0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
5dc0: 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67  rm; /* First arg
5dd0: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
5de0: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
5df0: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
5e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5e10: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
5e20: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
5e30: 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20  PrefixReg = 0;  
5e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5e50: 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
5e60: 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65  ers before regRe
5e70: 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sult */..  asser
5e80: 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74  t( v );.  assert
5e90: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
5ea0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70   hasDistinct = p
5eb0: 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74  Distinct ? pDist
5ec0: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
5ed0: 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  : WHERE_DISTINCT
5ee0: 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f  _NOOP;.  if( pSo
5ef0: 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72  rt && pSort->pOr
5f00: 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74  derBy==0 ) pSort
5f10: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72   = 0;.  if( pSor
5f20: 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  t==0 && !hasDist
5f30: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
5f40: 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30  rt( iContinue!=0
5f50: 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   );.    codeOffs
5f60: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
5f70: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
5f80: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
5f90: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
5fa0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75  ns..  */.  nResu
5fb0: 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  ltCol = pEList->
5fc0: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
5fd0: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
5fe0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
5ff0: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
6000: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
6010: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
6020: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
6030: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6040: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6050: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6060: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6070: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
6080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
6090: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
60a0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
60b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
60c0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
60d0: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
60e0: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
60f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
6100: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
6110: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
6120: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
6130: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6140: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6150: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6160: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6170: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
6180: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
6190: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
61a0: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
61b0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
61c0: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
61d0: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
61e0: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
61f0: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
6200: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
6210: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
6220: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
6230: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6240: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6250: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6260: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
6270: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
6280: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6290: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
62a0: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
62b0: 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20  ol;.  regResult 
62c0: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
62d0: 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20    if( srcTab>=0 
62e0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
62f0: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
6300: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
6310: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6320: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
6330: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
6340: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
6350: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
6360: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
6370: 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  e));.    }.  }el
6380: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
6390: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
63a0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
63b0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
63c0: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
63d0: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
63e0: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
63f0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
6400: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
6410: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
6420: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6430: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
6440: 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75   pEList, regResu
6450: 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt,.            
6460: 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52        (eDest==SR
6470: 54 5f 4f 75 74 70 75 74 7c 7c 65 44 65 73 74 3d  T_Output||eDest=
6480: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29 3f  =SRT_Coroutine)?
6490: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3a  SQLITE_ECEL_DUP:
64a0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  0);.  }..  /* If
64b0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
64c0: 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e  yword was presen
64d0: 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  t on the SELECT 
64e0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61  statement.  ** a
64f0: 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20  nd this row has 
6500: 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65  been seen before
6510: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61  , then do not ma
6520: 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a  ke this row.  **
6530: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73   part of the res
6540: 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ult..  */.  if( 
6550: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
6560: 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74     switch( pDist
6570: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
6580: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  ){.      case WH
6590: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
65a0: 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
65b0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
65c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f          /* No lo
65d0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70  nger required Op
65e0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
65f0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  r. */.        in
6600: 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20  t iJump;        
6610: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65        /* Jump de
6620: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  stination */.   
6630: 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76       int regPrev
6640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6650: 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e  Previous row con
6660: 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tent */..       
6670: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
6680: 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ce for the previ
6690: 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ous row */.     
66a0: 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
66b0: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
66c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
66d0: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
66e0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ..        /* Cha
66f0: 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
6700: 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65  phemeral coded e
6710: 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f  arlier to an OP_
6720: 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  Null.        ** 
6730: 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65  sets the MEM_Cle
6740: 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20  ared bit on the 
6750: 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f  first register o
6760: 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
6770: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
6780: 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
6790: 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f  e the OP_Ne belo
67a0: 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20  w to always.    
67b0: 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74      ** fail on t
67c0: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
67d0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65  on of the loop e
67e0: 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ven if the first
67f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20  .        ** row 
6800: 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20  is all NULLs..  
6810: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6820: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6830: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73  geToNoop(v, pDis
6840: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
6850: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20  ;.        pOp = 
6860: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
6870: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
6880: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
6890: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
68a0: 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  OP_Null;.       
68b0: 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20   pOp->p1 = 1;.  
68c0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
68d0: 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20  regPrev;..      
68e0: 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65    iJump = sqlite
68f0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6900: 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c  (v) + nResultCol
6910: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
6920: 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b  0; i<nResultCol;
6930: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
6940: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
6950: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
6960: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c  lSeq(pParse, pEL
6970: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
6980: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6990: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29  i<nResultCol-1 )
69a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
69b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
69c0: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
69d0: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
69e0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
69f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
6a00: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
6a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6a20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6a30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
6a40: 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f  regResult+i, iCo
6a50: 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b  ntinue, regPrev+
6a60: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
6a70: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6a80: 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  .           }.  
6a90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6aa0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
6ab0: 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  1, (const char *
6ac0: 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
6ad0: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  EQ);.          s
6ae0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6af0: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  P5(v, SQLITE_NUL
6b00: 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LEQ);.        }.
6b10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6b20: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
6b30: 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70  ntAddr(v)==iJump
6b40: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
6b50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6b60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6b70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b80: 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c  Copy, regResult,
6b90: 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c   regPrev, nResul
6ba0: 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  tCol-1);.       
6bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6bc0: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6bd0: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
6be0: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
6bf0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
6c00: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
6c10: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
6c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6c30: 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61     }..      defa
6c40: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61  ult: {.        a
6c50: 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74  ssert( pDistinct
6c60: 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  ->eTnctType==WHE
6c70: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
6c80: 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20  DERED );.       
6c90: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
6ca0: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d  arse, pDistinct-
6cb0: 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69  >tabTnct, iConti
6cc0: 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  nue, nResultCol,
6cd0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
6ce0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6cf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
6d00: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
6d10: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
6d20: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
6d30: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
6d40: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
6d50: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
6d60: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
6d70: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
6d80: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
6d90: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
6da0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
6db0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
6dc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6dd0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
6de0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
6df0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
6e00: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
6e10: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6e20: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
6e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6e40: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
6e50: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
6e60: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
6e70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6e80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6e90: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
6ea0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
6eb0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6ec0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
6ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6ee0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
6ef0: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
6f00: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
6f10: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
6f20: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
6f30: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
6f40: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
6f50: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
6f60: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
6f70: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
6f80: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
6f90: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
6fa0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
6fb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6fc0: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50  OP_IdxDelete, iP
6fd0: 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  arm, regResult, 
6fe0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
6ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7000: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7010: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7020: 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
7030: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
7040: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
7050: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
7060: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7070: 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65  T_Fifo:.    case
7080: 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20   SRT_DistFifo:. 
7090: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
70a0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
70b0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
70c0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
70d0: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
70e0: 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65  Parse, nPrefixRe
70f0: 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  g+1);.      test
7100: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7110: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
7120: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7130: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
7140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7150: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7160: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7170: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7180: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29  , r1+nPrefixReg)
7190: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
71a0: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20  _OMIT_CTE.      
71b0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
71c0: 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20  istFifo ){.     
71d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
71e0: 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74  tination is Dist
71f0: 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f  Fifo, then curso
7200: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
7210: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
7220: 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  n an ephemeral i
7230: 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75 72  ndex. If the cur
7240: 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65  rent row is alre
7250: 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20  ady present.    
7260: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
7270: 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  dex, do not writ
7280: 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70  e it to the outp
7290: 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20  ut. If not, add 
72a0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
72b0: 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68  urrent row to th
72c0: 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63  e index and proc
72d0: 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e 67  eed with writing
72e0: 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20   it to the.     
72f0: 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62     ** output tab
7300: 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a  le as well.  */.
7310: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
7320: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
7330: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34  rrentAddr(v) + 4
7340: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7350: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
7360: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
7370: 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30  m+1, addr, r1, 0
7380: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
7390: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
73a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
73b0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
73c0: 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20  Parm+1, r1);.   
73d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f       assert( pSo
73e0: 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  rt==0 );.      }
73f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
7400: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
7410: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
7420: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
7430: 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65   p, r1+nPrefixRe
7440: 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67  g, 1, nPrefixReg
7450: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7460: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
7470: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7480: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
7490: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
74a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
74b0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
74c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
74d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
74e0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
74f0: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
7500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7510: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
7520: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
7530: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7540: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7550: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
7560: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7570: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7580: 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67  , r1, nPrefixReg
7590: 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +1);.      break
75a0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
75b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
75c0: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
75d0: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
75e0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
75f0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
7600: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
7610: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
7620: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
7630: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
7640: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
7650: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
7660: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
7670: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
7680: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
7690: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
76a0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
76b0: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
76c0: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
76d0: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
76e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
76f0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
7700: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
7710: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
7720: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
7730: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
7740: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
7750: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
7760: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
7770: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
7780: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
7790: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
77a0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
77b0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
77c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
77d0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
77e0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
77f0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
7800: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
7810: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
7820: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
7830: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
7840: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7850: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7860: 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69  esult, 1, nPrefi
7870: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
7880: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
7890: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
78a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
78b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
78c0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
78d0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
78e0: 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65  esult,1,r1, &pDe
78f0: 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b  st->affSdst, 1);
7900: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7910: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7920: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7930: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
7940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7950: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7960: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7970: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
7980: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7990: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
79a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
79b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
79c0: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
79d0: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
79e0: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
79f0: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
7a00: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
7a10: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
7a20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7a30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7a40: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
7a50: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
7a60: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
7a70: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
7a80: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
7a90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7aa0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
7ab0: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
7ac0: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
7ad0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
7ae0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
7af0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
7b00: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
7b10: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
7b20: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
7b30: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
7b40: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
7b50: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
7b60: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
7b70: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20  ( nResultCol==1 
7b80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7b90: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7ba0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7bb0: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7bc0: 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72  egResult, 1, nPr
7bd0: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
7be0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
7bf0: 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74  ssert( regResult
7c00: 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20  ==iParm );.     
7c10: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
7c20: 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
7c30: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
7c40: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
7c50: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7c60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
7c70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7c80: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
7c90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
7ca0: 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f  routine:       /
7cb0: 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61  * Send data to a
7cc0: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
7cd0: 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70     case SRT_Outp
7ce0: 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  ut: {        /* 
7cf0: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
7d00: 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
7d10: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7d20: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
7d30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7d40: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
7d50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7d60: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7d70: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7d80: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7d90: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7da0: 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67  tCol, nPrefixReg
7db0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7dc0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  f( eDest==SRT_Co
7dd0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
7de0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7df0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
7e00: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
7e10: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7e20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7e30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7e40: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
7e50: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7e60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7e70: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
7e80: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
7e90: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7ea0: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
7eb0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7ec0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
7ed0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7ee0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
7ef0: 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72  esults into a pr
7f00: 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68 61  iority queue tha
7f10: 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72  t is order accor
7f20: 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70  ding to.    ** p
7f30: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28  Dest->pOrderBy (
7f40: 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d  in pSO).  pDest-
7f50: 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61  >iSDParm (in iPa
7f60: 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73 6f  rm) is the curso
7f70: 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  r for an.    ** 
7f80: 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e  index with pSO->
7f90: 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e  nExpr+2 columns.
7fa0: 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73    Build a key us
7fb0: 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20  ing pSO for the 
7fc0: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f  first.    ** pSO
7fd0: 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c  ->nExpr columns,
7fe0: 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
7ff0: 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69  all keys are uni
8000: 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a  que by adding a.
8010: 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f      ** final OP_
8020: 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e  Sequence column.
8030: 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d    The last colum
8040: 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64 20  n is the record 
8050: 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a  as a blob..    *
8060: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  /.    case SRT_D
8070: 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61  istQueue:.    ca
8080: 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a  se SRT_Queue: {.
8090: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a        int nKey;.
80a0: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
80b0: 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  , r3;.      int 
80c0: 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20  addrTest = 0;.  
80d0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
80e0: 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70  O;.      pSO = p
80f0: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Dest->pOrderBy;.
8100: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
8110: 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20  O );.      nKey 
8120: 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pSO->nExpr;.  
8130: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
8140: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
8150: 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  e);.      r2 = s
8160: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
8170: 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b  ge(pParse, nKey+
8180: 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72  2);.      r3 = r
8190: 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20  2+nKey+1;.      
81a0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
81b0: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
81c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
81d0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
81e0: 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72  tQueue, then cur
81f0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
8200: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
8210: 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68   on a second eph
8220: 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61  emeral index tha
8230: 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75  t holds all valu
8240: 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f 75  es every previou
8250: 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  sly.        ** a
8260: 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 75  dded to the queu
8270: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64  e. */.        ad
8280: 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  drTest = sqlite3
8290: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
82a0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d   OP_Found, iParm
82b0: 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  +1, 0, .        
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82e0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
82f0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
8300: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
8310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8330: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8340: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
8350: 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20  esultCol, r3);. 
8360: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
8370: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
8380: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8390: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
83a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
83b0: 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  m+1, r3);.      
83c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
83d0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
83e0: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
83f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
8400: 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69  r(i=0; i<nKey; i
8410: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
8420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8430: 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20  , OP_SCopy,.    
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 20        regResult 
8460: 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  + pSO->a[i].u.x.
8470: 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c  iOrderByCol - 1,
8480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8490: 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69 29             r2+i)
84a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
84b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
84c0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
84d0: 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79  , iParm, r2+nKey
84e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
84f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8500: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c  _MakeRecord, r2,
8510: 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20   nKey+2, r1);.  
8520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8530: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8540: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
8550: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64  );.      if( add
8560: 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33 56  rTest ) sqlite3V
8570: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
8580: 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20  ddrTest);.      
8590: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
85a0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
85b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
85c0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
85d0: 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65  (pParse, r2, nKe
85e0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61  y+2);.      brea
85f0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
8600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
8610: 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65  TE */....#if !de
8620: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8630: 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f  T_TRIGGER).    /
8640: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65  * Discard the re
8650: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
8660: 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20  used for SELECT 
8670: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
8680: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64  e.    ** the bod
8690: 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20  y of a TRIGGER. 
86a0: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
86b0: 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20  such selects is 
86c0: 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75  to call.    ** u
86d0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
86e0: 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
86f0: 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57  side effects.  W
8700: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20  e do not care.  
8710: 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61    ** about the a
8720: 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66  ctual results of
8730: 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20   the select..   
8740: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
8750: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
8760: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63   eDest==SRT_Disc
8770: 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ard );.      bre
8780: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8790: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
87a0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
87b0: 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
87c0: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 20  MIT is reached. 
87d0: 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a   Except, if.  **
87e0: 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72 74   there is a sort
87f0: 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  er, in which cas
8800: 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73  e the sorter has
8810: 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64   already limited
8820: 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  .  ** the output
8830: 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20   for us..  */.  
8840: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20  if( pSort==0 && 
8850: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
8860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8870: 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p3(v, OP_IfZero,
8880: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
8890: 61 6b 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76  ak, -1); VdbeCov
88a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a  erage(v);.  }.}.
88b0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
88c0: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
88d0: 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20   sufficient for 
88e0: 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65  an index of N ke
88f0: 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a  y columns and.**
8900: 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73   X extra columns
8910: 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
8920: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
8930: 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  c(sqlite3 *db, i
8940: 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20  nt N, int X){.  
8950: 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c  KeyInfo *p = sql
8960: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8970: 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (0, .           
8980: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4b          sizeof(K
8990: 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a  eyInfo) + (N+X)*
89a0: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
89b0: 29 2b 31 29 29 3b 0a 20 20 69 66 28 20 70 20 29  )+1));.  if( p )
89c0: 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  {.    p->aSortOr
89d0: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  der = (u8*)&p->a
89e0: 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70  Coll[N+X];.    p
89f0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
8a00: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c  N;.    p->nXFiel
8a10: 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20 20  d = (u16)X;.    
8a20: 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  p->enc = ENC(db)
8a30: 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  ;.    p->db = db
8a40: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
8a50: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8a60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8a70: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
8a80: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
8a90: 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49  eallocate a KeyI
8aa0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  nfo object.*/.vo
8ab0: 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  id sqlite3KeyInf
8ac0: 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a  oUnref(KeyInfo *
8ad0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
8ae0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
8af0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
8b00: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
8b10: 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69  ->nRef==0 ) sqli
8b20: 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 29 3b  te3DbFree(0, p);
8b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
8b40: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
8b50: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
8b60: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
8b70: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
8b80: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
8b90: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
8ba0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
8bb0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
8bc0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
8bd0: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
8be0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
8bf0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
8c00: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
8c10: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
8c20: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
8c30: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
8c40: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
8c50: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
8c60: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
8c70: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
8c80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8c90: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
8ca0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
8cb0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
8cc0: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
8cd0: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
8ce0: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
8cf0: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
8d00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
8d10: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
8d20: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
8d30: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
8d40: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
8d50: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
8d60: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
8d70: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
8d80: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
8d90: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
8da0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
8db0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
8dc0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
8dd0: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
8de0: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
8df0: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
8e00: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
8e10: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
8e20: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
8e30: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
8e40: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
8e50: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
8e60: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
8e70: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
8e80: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
8e90: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
8ea0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
8eb0: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
8ec0: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
8ed0: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
8ee0: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
8ef0: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
8f00: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
8f10: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
8f20: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
8f30: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
8f40: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
8f50: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
8f60: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
8f70: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
8f80: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
8f90: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
8fa0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
8fb0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
8fc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8fd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
8fe0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8ff0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9000: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
9010: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
9020: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
9030: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
9040: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
9050: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
9060: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
9070: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
9080: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
9090: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
90a0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
90b0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
90c0: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
90d0: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
90e0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
90f0: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
9100: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9110: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
9120: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
9130: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
9140: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
9150: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
9160: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
9170: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
9180: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9190: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
91a0: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
91b0: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
91c0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
91d0: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
91e0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
91f0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9200: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  oll;.      pColl
9210: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9220: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
9230: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
9240: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
9250: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
9260: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  tColl;.      pIn
9270: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61  fo->aColl[i-iSta
9280: 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  rt] = pColl;.   
9290: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
92a0: 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d  rder[i-iStart] =
92b0: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
92c0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
92d0: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
92e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
92f0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9300: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
9310: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9320: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
9330: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
9340: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
9350: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
9360: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
9370: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
9380: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
9390: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
93a0: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
93b0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
93c0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
93d0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
93e0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
93f0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
9400: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
9410: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9420: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
9430: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
9440: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9450: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
9460: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9470: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9480: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
9490: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
94a0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
94b0: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
94c0: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
94d0: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
94e0: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
94f0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
9500: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
9510: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
9520: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
9530: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
9540: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
9550: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
9560: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
9570: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
9580: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
9590: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
95a0: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
95b0: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
95c0: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
95d0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
95e0: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
95f0: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
9600: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
9610: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
9620: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
9630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
9640: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
9650: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
9660: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
9670: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
9680: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
9690: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
96a0: 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45  rse->db, "USE TE
96b0: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73  MP B-TREE FOR %s
96c0: 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20  ", zUsage);.    
96d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
96e0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
96f0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
9700: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
9710: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
9720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
9730: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f   expression b to
9740: 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63   lvalue a. A sec
9750: 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73  ond, no-op, vers
9760: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72  ion of this macr
9770: 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64  o.** is provided
9780: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49   when SQLITE_OMI
9790: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66  T_EXPLAIN is def
97a0: 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ined. This allow
97b0: 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e  s the code.** in
97c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
97d0: 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65   to assign value
97e0: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d  s to structure m
97f0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
9800: 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69  that.** only exi
9810: 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  st if SQLITE_OMI
9820: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74  T_EXPLAIN is not
9830: 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74   defined without
9840: 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a   polluting the.*
9850: 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e  * code with #ifn
9860: 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a  def directives..
9870: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9880: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c  ainSetInteger(a,
9890: 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65   b) a = b..#else
98a0: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
98b0: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
98c0: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
98d0: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
98e0: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
98f0: 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23  TempTable(y,z).#
9900: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
9910: 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23  etInteger(y,z).#
9920: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
9930: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9940: 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66  EXPLAIN) && !def
9950: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9960: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
9970: 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  )./*.** Unless a
9980: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
9990: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
99a0: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
99b0: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
99c0: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
99d0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
99e0: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
99f0: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
9a00: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
9a10: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
9a20: 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  n is of one of t
9a30: 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  he two forms:.**
9a40: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
9a50: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
9a60: 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29  1 and iSub2 (op)
9a70: 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  ".**   "COMPOSIT
9a80: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
9a90: 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49  b1 and iSub2 USI
9aa0: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28  NG TEMP B-TREE (
9ab0: 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  op)".**.** where
9ac0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
9ad0: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
9ae0: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
9af0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
9b00: 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
9b10: 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20  ters, and op is 
9b20: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
9b30: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
9b40: 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
9b50: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68  he same name. Th
9b60: 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22  e parameter "op"
9b70: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
9b80: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
9b90: 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52  EPT,.** TK_INTER
9ba0: 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20  SECT or TK_ALL. 
9bb0: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
9bc0: 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65  s used if argume
9bd0: 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a  nt bUseTmp is .*
9be0: 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20  * false, or the 
9bf0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69  second form if i
9c00: 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  t is true..*/.st
9c10: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
9c20: 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61  nComposite(.  Pa
9c30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c50: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
9c60: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
9c90: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
9ca0: 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  T etc. */.  int 
9cb0: 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20  iSub1,          
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9cd0: 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a  ubquery id 1 */.
9ce0: 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20    int iSub2,    
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
9d10: 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65   2 */.  int bUse
9d20: 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Tmp             
9d30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
9d40: 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  if a temp table 
9d50: 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  was used */.){. 
9d60: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
9d70: 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  UNION || op==TK_
9d80: 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
9d90: 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70  _INTERSECT || op
9da0: 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66  ==TK_ALL );.  if
9db0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
9dc0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
9dd0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
9de0: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
9df0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
9e00: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
9e10: 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f  arse->db, "COMPO
9e20: 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25  UND SUBQUERIES %
9e30: 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22  d AND %d %s(%s)"
9e40: 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a  , iSub1, iSub2,.
9e50: 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f          bUseTmp?
9e60: 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52  "USING TEMP B-TR
9e70: 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f  EE ":"", selectO
9e80: 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b  pName(op).    );
9e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9ea0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
9eb0: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
9ec0: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
9ed0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
9ee0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a  ;.  }.}.#else./*
9ef0: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
9f00: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
9f10: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
9f20: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
9f30: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d  efine explainCom
9f40: 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a  posite(v,w,x,y,z
9f50: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
9f60: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
9f70: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
9f80: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
9f90: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
9fa0: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
9fb0: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
9fc0: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
9fd0: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
9fe0: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
9ff0: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
a000: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
a010: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
a020: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
a030: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
a040: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
a050: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
a060: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
a070: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
a080: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
a090: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
a0a0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a0b0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
a0c0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
a0d0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a0e0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
a0f0: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
a100: 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
a110: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
a120: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
a130: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
a140: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
a150: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
a160: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
a170: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
a180: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ere */.){.  Vdbe
a190: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a1a0: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
a1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a1c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a1d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  nt */.  int addr
a1e0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
a1f0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
a200: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
a210: 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a  e to exit loop *
a220: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
a230: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
a240: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
a250: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f   /* Jump here fo
a260: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
a270: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
a280: 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a  t addrOnce = 0;.
a290: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78    int iTab;.  Ex
a2a0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
a2b0: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
a2c0: 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  By;.  int eDest 
a2d0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
a2e0: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
a2f0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20  est->iSDParm;.  
a300: 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e  int regRow;.  in
a310: 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e  t regRowid;.  in
a320: 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53  t nKey;.  int iS
a330: 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20  ortTab;         
a340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
a350: 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65  ter cursor to re
a360: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
a370: 20 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20   nSortData;     
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a390: 54 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20  Trailing values 
a3a0: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72  to read from sor
a3b0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ter */.  int i;.
a3c0: 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20    int bSeq;     
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72    /* True if sor
a3f0: 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75  ter record inclu
a400: 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a  des seq. no. */.
a410: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a420: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
a430: 4d 45 4e 54 53 0a 20 20 73 74 72 75 63 74 20 45  MENTS.  struct E
a440: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f  xprList_item *aO
a450: 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74  utEx = p->pEList
a460: 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ->a;.#endif..  i
a470: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
a480: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  kOut ){.    sqli
a490: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a4a0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
a4b0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
a4c0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
a4d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a4e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
a4f0: 6f 2c 20 30 2c 20 61 64 64 72 42 72 65 61 6b 29  o, 0, addrBreak)
a500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a510: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
a520: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a530: 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20  ut);.  }.  iTab 
a540: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
a550: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
a560: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
a570: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
a580: 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77  ne ){.    regRow
a590: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52  id = 0;.    regR
a5a0: 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  ow = pDest->iSds
a5b0: 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  t;.    nSortData
a5c0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
a5d0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
a5e0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
a5f0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a600: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
a610: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a620: 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74  arse);.    nSort
a630: 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Data = 1;.  }.  
a640: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
a650: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
a660: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
a670: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
a680: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
a690: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
a6a0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
a6b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
a6c0: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
a6d0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
a6e0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
a6f0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
a700: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
a710: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
a720: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
a730: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
a740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a750: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
a760: 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f   iSortTab, regSo
a770: 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53  rtOut, nKey+1+nS
a780: 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ortData);.    if
a790: 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c  ( addrOnce ) sql
a7a0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
a7b0: 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
a7c0: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
a7d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a7e0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
a7f0: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
a800: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
a810: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
a820: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
a830: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
a840: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
a850: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a860: 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54  P_SorterData, iT
a870: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
a880: 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62  iSortTab);.    b
a890: 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Seq = 0;.  }else
a8a0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  {.    addr = 1 +
a8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a8c0: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
a8d0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
a8e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a8f0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
a900: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
a910: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
a920: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54     iSortTab = iT
a930: 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31  ab;.    bSeq = 1
a940: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
a950: 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b   i<nSortData; i+
a960: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
a970: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a980: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
a990: 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72  , nKey+bSeq+i, r
a9a0: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64  egRow+i);.    Vd
a9b0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
a9c0: 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  s", aOutEx[i].zN
a9d0: 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e  ame ? aOutEx[i].
a9e0: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
a9f0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20  ].zSpan));.  }. 
aa00: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
aa10: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
aa20: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
aa30: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
aa40: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
aa50: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
aa60: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
aa70: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
aa80: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
aa90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aaa0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
aab0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
aac0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
aad0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
aae0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
aaf0: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
ab00: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
ab10: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
ab20: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
ab30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ab40: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ab50: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ab60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
ab70: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
ab80: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
ab90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aba0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
abb0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
abc0: 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a  w, 1, regRowid,.
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 20 20 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e          &pDest->
abf0: 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  affSdst, 1);.   
ac00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
ac10: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
ac20: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
ac30: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
ac40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ac50: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
ac60: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
ac70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ac80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
ac90: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
aca0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
acb0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
acc0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
acd0: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50  arse, regRow, iP
ace0: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
acf0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
ad00: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
ad10: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
ad20: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
ad30: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
ad40: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
ad50: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
ad60: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
ad70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
ad80: 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20  utine ); .      
ad90: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
ada0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
adb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
adc0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
add0: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ine );.      if(
ade0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
adf0: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
ae00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ae10: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
ae20: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
ae30: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
ae40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
ae50: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
ae60: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
ae70: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
ae80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ae90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aea0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
aeb0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
aec0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
aed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
aee0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
aef0: 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  id ){.    sqlite
af00: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
af10: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b  pParse, regRow);
af20: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
af30: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
af40: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
af50: 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  }.  /* The botto
af60: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
af70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
af80: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
af90: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
afa0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
afb0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
afc0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
afd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
afe0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
aff0: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
b000: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
b010: 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
b020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b030: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
b040: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
b050: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
b060: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65  .  if( pSort->re
b070: 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65  gReturn ) sqlite
b080: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b090: 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  P_Return, pSort-
b0a0: 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73  >regReturn);.  s
b0b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
b0c0: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
b0d0: 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  eak);.}../*.** R
b0e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
b0f0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
b100: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
b110: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
b120: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
b130: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
b140: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
b150: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
b160: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
b170: 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65  ** Also try to e
b180: 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65  stimate the size
b190: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
b1a0: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
b1b0: 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  n that.** result
b1c0: 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a   in *pEstWidth..
b1d0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
b1e0: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
b1f0: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
b200: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
b210: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
b220: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
b230: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
b240: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
b250: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
b260: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
b270: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
b280: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
b290: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
b2a0: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
b2b0: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
b2c0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
b2d0: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
b2e0: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
b2f0: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
b300: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
b310: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
b320: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
b330: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
b340: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
b350: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
b360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
b370: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
b380: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
b390: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
b3a0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
b3b0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
b3c0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
b3d0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
b3e0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
b3f0: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
b400: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
b410: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
b420: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
b430: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
b440: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
b450: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b460: 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f  e has either 3 o
b470: 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64  r 6 parameters d
b480: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
b490: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
b4a0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
b4b0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
b4c0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
b4d0: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  ion is used..*/.
b4e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b4f0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b500: 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f  DATA.# define co
b510: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
b520: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
b530: 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Impl(A,B,C,D,E,F
b540: 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ).static const c
b550: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49  har *columnTypeI
b560: 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  mpl(.  NameConte
b570: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
b580: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
b590: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
b5a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b5b0: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
b5c0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
b5d0: 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74  gCol,.  u8 *pEst
b5e0: 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20  Width.){.  char 
b5f0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d  const *zOrigDb =
b600: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
b610: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
b620: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
b630: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73  rigCol = 0;.#els
b640: 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64  e /* if !defined
b650: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
b660: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
b670: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  */.# define colu
b680: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
b690: 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,F) columnTypeIm
b6a0: 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61 74 69 63  pl(A,B,F).static
b6b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
b6c0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
b6d0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
b6e0: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
b6f0: 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68  .  u8 *pEstWidth
b700: 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  .){.#endif /* !d
b710: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
b720: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b730: 44 41 54 41 29 20 2a 2f 0a 20 20 63 68 61 72 20  DATA) */.  char 
b740: 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30  const *zType = 0
b750: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20  ;.  int j;.  u8 
b760: 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20  estWidth = 1;.. 
b770: 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
b780: 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72  ==0) || pNC->pSr
b790: 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  cList==0 ) retur
b7a0: 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 0;.  switch( p
b7b0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
b7c0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
b7d0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
b7e0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
b7f0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
b800: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
b810: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
b820: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
b830: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
b840: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
b850: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
b860: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
b870: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
b880: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
b890: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
b8a0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
b8b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b8c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
b8d0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
b8e0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
b8f0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
b900: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
b910: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
b920: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
b930: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
b940: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
b950: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
b960: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
b970: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
b980: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74   pTab */.      t
b990: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
b9a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
b9b0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
b9c0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
b9d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
b9e0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
b9f0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
ba00: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
ba10: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
ba20: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
ba30: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
ba40: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
ba50: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
ba60: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
ba70: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
ba80: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
ba90: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
baa0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
bab0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
bac0: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
bad0: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
bae0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
baf0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
bb00: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
bb10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
bb20: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
bb30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
bb40: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
bb50: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
bb60: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
bb70: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
bb80: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
bb90: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
bba0: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
bbb0: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
bbc0: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
bbd0: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
bbe0: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
bbf0: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
bc00: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
bc10: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
bc20: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
bc30: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
bc40: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
bc50: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
bc60: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
bc70: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
bc80: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
bc90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
bca0: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
bcb0: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
bcc0: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
bcd0: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
bce0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
bcf0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
bd00: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
bd10: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
bd20: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
bd30: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
bd40: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
bd50: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
bd60: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
bd70: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
bd80: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
bd90: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
bda0: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
bdb0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
bdc0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
bdd0: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
bde0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
bdf0: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
be00: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
be10: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
be20: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
be30: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
be40: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
be50: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
be60: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
be70: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
be80: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
be90: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
bea0: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
beb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bec0: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
bed0: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
bee0: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
bef0: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
bf00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
bf10: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
bf20: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
bf30: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
bf40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
bf50: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
bf60: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
bf70: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
bf80: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
bf90: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
bfa0: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
bfb0: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
bfc0: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
bfd0: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
bfe0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
bff0: 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  >=0 && ALWAYS(iC
c000: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
c010: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
c020: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
c030: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
c040: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
c050: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
c060: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
c070: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
c080: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
c090: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
c0a0: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
c0b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
c0c0: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
c0d0: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
c0e0: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
c0f0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
c100: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
c110: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
c120: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
c130: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
c140: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
c150: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
c160: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
c170: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
c180: 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  pNC;.          s
c190: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
c1a0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
c1b0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
c1c0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a  nType(&sNC, p,&z
c1d0: 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62  OrigDb,&zOrigTab
c1e0: 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74  ,&zOrigCol, &est
c1f0: 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20  Width); .       
c200: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
c210: 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  f( pTab->pSchema
c220: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
c230: 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20   real table */. 
c240: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
c250: 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pS );.        if
c260: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
c270: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
c280: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
c290: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
c2a0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
c2b0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65  ->nCol) );.#ifde
c2c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c2d0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
c2e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
c2f0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
c300: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
c310: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
c320: 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b  igCol = "rowid";
c330: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c340: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
c350: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c360: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
c370: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
c380: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c390: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
c3a0: 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62   estWidth = pTab
c3b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45  ->aCol[iCol].szE
c3c0: 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  st;.        }.  
c3d0: 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d        zOrigTab =
c3e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
c3f0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70        if( pNC->p
c400: 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Parse ){.       
c410: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
c420: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
c430: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
c440: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
c450: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
c460: 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  igDb = pNC->pPar
c470: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
c480: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
c490: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  }.#else.        
c4a0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
c4b0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c4c0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
c4d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c4e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
c4f0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
c500: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73  pe;.          es
c510: 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61  tWidth = pTab->a
c520: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b  Col[iCol].szEst;
c530: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
c540: 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
c550: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
c560: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c570: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
c580: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
c590: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c5a0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
c5b0: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
c5c0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c5d0: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
c5e0: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
c5f0: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
c600: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
c610: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
c620: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
c630: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
c640: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
c650: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
c660: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
c670: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
c680: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
c690: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
c6a0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
c6b0: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
c6c0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
c6d0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
c6e0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
c6f0: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
c700: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
c710: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
c720: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
c730: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
c740: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
c750: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
c760: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
c770: 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a  l, &estWidth); .
c780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c790: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
c7a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c7b0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
c7c0: 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72  ATA  .  if( pzOr
c7d0: 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65  igDb ){.    asse
c7e0: 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26  rt( pzOrigTab &&
c7f0: 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20   pzOrigCol );.  
c800: 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f    *pzOrigDb = zO
c810: 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  rigDb;.    *pzOr
c820: 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62  igTab = zOrigTab
c830: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c  ;.    *pzOrigCol
c840: 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d   = zOrigCol;.  }
c850: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45  .#endif.  if( pE
c860: 73 74 57 69 64 74 68 20 29 20 2a 70 45 73 74 57  stWidth ) *pEstW
c870: 69 64 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b  idth = estWidth;
c880: 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b  .  return zType;
c890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
c8a0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
c8b0: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
c8c0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c8d0: 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  types of columns
c8e0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
c8f0: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
c900: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
c910: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
c920: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c930: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
c940: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
c950: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
c960: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
c970: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
c980: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
c990: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
c9a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
c9b0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
c9c0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
c9d0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
c9e0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
c9f0: 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
ca00: 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53  xt sNC;.  sNC.pS
ca10: 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
ca20: 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  t;.  sNC.pParse 
ca30: 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28  = pParse;.  for(
ca40: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
ca50: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ca60: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
ca70: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
ca80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ca90: 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ype;.#ifdef SQLI
caa0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
cab0: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f  _METADATA.    co
cac0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
cad0: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
cae0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
caf0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
cb00: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
cb10: 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  0;.    zType = c
cb20: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
cb30: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
cb40: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
cb50: 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  l, 0);..    /* T
cb60: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
cb70: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
cb80: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
cb90: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
cba0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
cbb0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
cbc0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
cbd0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
cbe0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
cbf0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
cc00: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
cc10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
cc20: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
cc30: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
cc40: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
cc50: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
cc60: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
cc70: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
cc80: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
cc90: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
cca0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
ccb0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ccc0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ccd0: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
cce0: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
ccf0: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
cd00: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
cd10: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
cd20: 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
cd30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
cd40: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
cd50: 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45  COLNAME_DECLTYPE
cd60: 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f  , zType, SQLITE_
cd70: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
cd80: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
cd90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
cda0: 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f  ECLTYPE) */.}../
cdb0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
cdc0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
cdd0: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e  l the VDBE the n
cde0: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ames of columns.
cdf0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
ce00: 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f   set.  This info
ce10: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
ce20: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a  to provide the.*
ce30: 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73  * azCol[] values
ce40: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
ce50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ce60: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
ce70: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
ce80: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
ce90: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
cea0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
ceb0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
cec0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
ced0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
cee0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
cef0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
cf00: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
cf10: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
cf20: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
cf30: 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20  i, j;.  sqlite3 
cf40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
cf50: 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65  ;.  int fullName
cf60: 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a  s, shortNames;..
cf70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cf80: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  MIT_EXPLAIN.  /*
cf90: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
cfa0: 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69  XPLAIN, skip thi
cfb0: 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20  s step */.  if( 
cfc0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
cfd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
cfe0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
cff0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
d000: 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d  sSet || NEVER(v=
d010: 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
d020: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
d030: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
d040: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
d050: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
d060: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
d070: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
d080: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
d090: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d0a0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
d0b0: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
d0c0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
d0d0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
d0e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d0f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
d100: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
d110: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
d120: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d130: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
d140: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d150: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
d160: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
d170: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
d180: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
d190: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
d1a0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d1b0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
d1c0: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
d1d0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d1e0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f   }else if( (p->o
d1f0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
d200: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  p->op==TK_AGG_CO
d210: 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73  LUMN) && pTabLis
d220: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
d230: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
d240: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
d250: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
d260: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
d270: 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70  (j=0; ALWAYS(j<p
d280: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20  TabList->nSrc); 
d290: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
d2a0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  ( pTabList->a[j]
d2b0: 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61  .iCursor==p->iTa
d2c0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
d2d0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
d2e0: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
d2f0: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
d300: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
d310: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
d320: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
d330: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
d340: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
d350: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
d360: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
d370: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
d380: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
d390: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
d3a0: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
d3b0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
d3c0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
d3d0: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
d3e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
d3f0: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
d400: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
d410: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d420: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d430: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
d440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
d450: 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69  bStrDup(db, pELi
d460: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c  st->a[i].zSpan),
d470: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
d480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d490: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20  ( fullNames ){. 
d4a0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
d4b0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
d4c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
d4d0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
d4e0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
d4f0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   zCol);.        
d500: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d510: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d520: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
d530: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
d540: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d550: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d560: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d570: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d580: 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52   zCol, SQLITE_TR
d590: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
d5a0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
d5b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d5c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
d5d0: 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d  zSpan;.      z =
d5e0: 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d   z==0 ? sqlite3M
d5f0: 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75  Printf(db, "colu
d600: 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71  mn%d", i+1) : sq
d610: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
d620: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
d630: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d640: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d650: 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f  NAME, z, SQLITE_
d660: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
d670: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
d680: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
d690: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
d6a0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  st);.}../*.** Gi
d6b0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
d6c0: 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73  n list (which is
d6d0: 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74   really the list
d6e0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a   of expressions.
d6f0: 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ** that form the
d700: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
d710: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
d720: 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f  t) compute appro
d730: 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  priate.** column
d740: 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62   names for a tab
d750: 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f  le that would ho
d760: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
d770: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  n list..**.** Al
d780: 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77  l column names w
d790: 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a  ill be unique..*
d7a0: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f  *.** Only the co
d7b0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63  lumn names are c
d7c0: 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e  omputed.  Column
d7d0: 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a  .zType, Column.z
d7e0: 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68  Coll,.** and oth
d7f0: 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c  er fields of Col
d800: 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  umn are zeroed..
d810: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
d820: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
d830: 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  s.  If a memory 
d840: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
d850: 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72   occurs,.** stor
d860: 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c  e NULL in *paCol
d870: 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c   and 0 in *pnCol
d880: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
d890: 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61  TE_NOMEM..*/.sta
d8a0: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f  tic int selectCo
d8b0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
d8c0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
d8d0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d8e0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d8f0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d900: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
d910: 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77  Expr list from w
d920: 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63  hich to derive c
d930: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
d940: 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   i16 *pnCol,    
d950: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
d960: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
d970: 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a  columns here */.
d980: 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c    Column **paCol
d990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
d9a0: 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  te the new colum
d9b0: 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29  n list here */.)
d9c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
d9d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
d9e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
d9f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
da00: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
da10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
da20: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
da30: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
da40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
da50: 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65  ex added to make
da60: 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65   the name unique
da70: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
da80: 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20  ol, *pCol;      
da90: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
daa0: 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c   over result col
dab0: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  umns */.  int nC
dac0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
dad0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dae0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
daf0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
db00: 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20    Expr *p;      
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db20: 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
db30: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
db40: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
db50: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
db60: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
db70: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  n name */.  int 
db80: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
db90: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
dba0: 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65  of name in zName
dbb0: 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c  [] */..  if( pEL
dbc0: 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20  ist ){.    nCol 
dbd0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
dbe0: 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69  .    aCol = sqli
dbf0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
dc00: 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b  db, sizeof(aCol[
dc10: 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74  0])*nCol);.    t
dc20: 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30  estcase( aCol==0
dc30: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
dc40: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61   nCol = 0;.    a
dc50: 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  Col = 0;.  }.  *
dc60: 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  pnCol = nCol;.  
dc70: 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a  *paCol = aCol;..
dc80: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
dc90: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  aCol; i<nCol; i+
dca0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
dcb0: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
dcc0: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
dcd0: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
dce0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
dcf0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
dd00: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
dd10: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  pr);.    if( (zN
dd20: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
dd30: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
dd40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
dd50: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
dd60: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
dd70: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
dd80: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
dd90: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
dda0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ddb0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
ddc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
ddd0: 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20   *pColExpr = p; 
dde0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
ddf0: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72  on that is the r
de00: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
de10: 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
de20: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
de30: 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61  /* Table associa
de40: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78  ted with this ex
de50: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
de60: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
de70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
de80: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
de90: 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
dea0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
deb0: 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
dec0: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
ded0: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
dee0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
def0: 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70  & ALWAYS(pColExp
df00: 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  r->pTab!=0) ){. 
df10: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
df20: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
df30: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
df40: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
df50: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
df60: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
df70: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
df80: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
df90: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
dfa0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
dfb0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
dfc0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
dfd0: 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20  b, "%s",.       
dfe0: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d            iCol>=
dff0: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
e000: 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f  Col].zName : "ro
e010: 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wid");.      }el
e020: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
e030: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
e040: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
e050: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e060: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
e070: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
e080: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e090: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
e0a0: 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  , pColExpr->u.zT
e0b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
e0c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  se{.        /* U
e0d0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
e0e0: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
e0f0: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
e100: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
e110: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
e120: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
e130: 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  "%s", pEList->a[
e140: 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  i].zSpan);.     
e150: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e160: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e170: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
e180: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
e190: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
e1a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e1b0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
e1c0: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
e1d0: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
e1e0: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
e1f0: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
e200: 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  n integer to the
e210: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
e220: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
e230: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
e240: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
e250: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
e260: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
e270: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
e280: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e290: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
e2a0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
e2b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e       char *zNewN
e2c0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ame;.        int
e2d0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   k;.        for(
e2e0: 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26  k=nName-1; k>1 &
e2f0: 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  & sqlite3Isdigit
e300: 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29  (zName[k]); k--)
e310: 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  {}.        if( k
e320: 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d  >=0 && zName[k]=
e330: 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b  =':' ) nName = k
e340: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
e350: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
e360: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
e370: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
e380: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
e390: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
e3a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e3b0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
e3c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
e3d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
e3e0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
e3f0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
e400: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
e410: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
e420: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
e430: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
e440: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
e450: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
e460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
e470: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
e480: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
e490: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e4a0: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
e4b0: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
e4c0: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
e4d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e4e0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
e4f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e500: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
e510: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
e520: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
e530: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
e540: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
e550: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
e560: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
e570: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
e580: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
e590: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
e5a0: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
e5b0: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
e5c0: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
e5d0: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
e5e0: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
e5f0: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
e600: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
e610: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
e620: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
e630: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
e640: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
e650: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
e660: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
e670: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
e680: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
e690: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
e6a0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
e6b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e6c0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e6d0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61  contexts */.  Ta
e6e0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
e6f0: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d      /* Add colum
e700: 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
e710: 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  on to this table
e720: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
e730: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
e740: 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
e750: 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
e760: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
e770: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
e780: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
e790: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
e7a0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
e7b0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
e7c0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
e7d0: 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
e7e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e7f0: 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d  a;.  u64 szAll =
e800: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
e810: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
e820: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
e830: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
e840: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
e850: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
e860: 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
e870: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
e880: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e890: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
e8a0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
e8b0: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
e8c0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
e8d0: 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
e8e0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
e8f0: 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
e900: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
e910: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
e920: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
e930: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
e940: 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b  l++){.    p = a[
e950: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43  i].pExpr;.    pC
e960: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
e970: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e980: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
e990: 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d   p,0,0,0, &pCol-
e9a0: 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a  >szEst));.    sz
e9b0: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
e9c0: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
e9d0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
e9e0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
e9f0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
ea00: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
ea10: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
ea20: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
ea30: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
ea40: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
ea50: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
ea60: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
ea70: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
ea80: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ea90: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
eaa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
eab0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
eac0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41  qlite3LogEst(szA
ead0: 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ll*4);.}../*.** 
eae0: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
eaf0: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
eb00: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
eb10: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
eb20: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
eb30: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
eb40: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
eb50: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
eb60: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
eb70: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
eb80: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
eb90: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
eba0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ebb0: 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
ebc0: 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
ebd0: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
ebe0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
ebf0: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
ec00: 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
ec10: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
ec20: 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
ec30: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
ec40: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
ec50: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
ec60: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
ec70: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
ec80: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
ec90: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
eca0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
ecb0: 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
ecc0: 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
ecd0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ece0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
ecf0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
ed00: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ed10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
ed20: 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
ed30: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
ed40: 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
ed50: 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
ed60: 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
ed70: 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
ed80: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
ed90: 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a  .bEnabled==0 );.
eda0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
edb0: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
edc0: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
edd0: 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
ede0: 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
edf0: 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
ee00: 36 29 20 29 3b 0a 20 20 73 65 6c 65 63 74 43 6f  6) );.  selectCo
ee10: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
ee20: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
ee30: 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
ee40: 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
ee50: 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64  Col);.  selectAd
ee60: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
ee70: 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
ee80: 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
ee90: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
eea0: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
eeb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
eec0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
eed0: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
eee0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
eef0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
ef00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
ef10: 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
ef20: 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
ef30: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
ef40: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
ef50: 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
ef60: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
ef70: 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
ef80: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
ef90: 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
efa0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
efb0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
efc0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
efd0: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
efe0: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
eff0: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
f000: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
f010: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
f020: 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65   v ) sqlite3Vdbe
f030: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69  AddOp0(v, OP_Ini
f040: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  t);.    if( pPar
f050: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
f060: 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  .     && Optimiz
f070: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
f080: 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46  rse->db,SQLITE_F
f090: 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20  actorOutConst). 
f0a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72     ){.      pPar
f0b0: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
f0c0: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  r = 1;.    }..  
f0d0: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
f0e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
f0f0: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
f100: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
f110: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
f120: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
f130: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
f140: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
f150: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
f160: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
f170: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
f180: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
f190: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
f1a0: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
f1b0: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
f1c0: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
f1d0: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
f1e0: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
f1f0: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
f200: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
f210: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
f220: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
f230: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
f240: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
f250: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
f260: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
f270: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
f280: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
f290: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
f2a0: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
f2b0: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
f2c0: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
f2d0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
f2e0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
f2f0: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
f300: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
f310: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
f320: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
f330: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
f340: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
f350: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
f360: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
f370: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28  default values (
f380: 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74  zero).** prior t
f390: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
f3a0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
f3b0: 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74  e iOffset regist
f3c0: 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73  er (if it exists
f3d0: 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ) is initialized
f3e0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   to the value.**
f3f0: 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20   of the OFFSET. 
f400: 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69   The iLimit regi
f410: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
f420: 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52  zed to LIMIT.  R
f430: 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73  egister.** iOffs
f440: 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69  et+1 is initiali
f450: 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46  zed to LIMIT+OFF
f460: 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  SET..**.** Only 
f470: 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20  if pLimit!=0 or 
f480: 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68  pOffset!=0 do th
f490: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
f4a0: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
f4b0: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
f4c0: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
f4d0: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
f4e0: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
f4f0: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
f500: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
f510: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
f520: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
f530: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
f540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f550: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
f560: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
f570: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
f580: 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
f590: 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
f5a0: 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
f5b0: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
f5c0: 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20  int addr1, n;.  
f5d0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
f5e0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
f5f0: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
f600: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
f610: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
f620: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
f630: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
f640: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
f650: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
f660: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
f670: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
f680: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
f690: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
f6a0: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
f6b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
f6c0: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
f6d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
f6e0: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
f6f0: 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
f700: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
f710: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
f720: 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
f730: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
f740: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f750: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73  pParse);.    ass
f760: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
f770: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f780: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69  IsInteger(p->pLi
f790: 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  mit, &n) ){.    
f7a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f7b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
f7c0: 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
f7d0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f7e0: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
f7f0: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
f800: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
f810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f820: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
f830: 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  0, iBreak);.    
f840: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30    }else if( n>=0
f850: 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
f860: 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20  w>(u64)n ){.    
f870: 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
f880: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  w = n;.      }. 
f890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f8a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f8b0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
f8c0: 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
f8d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f8e0: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
f8f0: 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64  Int, iLimit); Vd
f900: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f910: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f920: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
f930: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
f940: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f950: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
f960: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
f970: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f980: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
f990: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
f9a0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
f9b0: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
f9c0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
f9d0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
f9e0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
f9f0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
fa00: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
fa10: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fa20: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fa30: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
fa40: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
fa50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fa60: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
fa70: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
fa80: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
fa90: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
faa0: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
fab0: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
fac0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fad0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
fae0: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
faf0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fb00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb10: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
fb20: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
fb30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fb40: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
fb50: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
fb60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fb70: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
fb80: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
fb90: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
fba0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
fbb0: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
fbc0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
fbd0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
fbe0: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
fbf0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
fc00: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
fc10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fc20: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
fc30: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
fc40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
fc50: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
fc60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
fc70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fc80: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
fc90: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
fca0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
fcb0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
fcc0: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
fcd0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
fce0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
fcf0: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
fd00: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
fd10: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
fd20: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
fd30: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
fd40: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
fd50: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
fd60: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fd70: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
fd80: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
fd90: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
fda0: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
fdb0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
fdc0: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
fdd0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
fde0: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
fdf0: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
fe00: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
fe10: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
fe20: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
fe30: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
fe40: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
fe50: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
fe60: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
fe70: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
fe80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fe90: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
fea0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
feb0: 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  );.  if( pRet==0
fec0: 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69   && iCol<p->pELi
fed0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
fee0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
fef0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
ff00: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
ff10: 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
ff20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
ff30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
ff40: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
ff50: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
ff60: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
ff70: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
ff80: 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
ff90: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
ffa0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
ffb0: 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
ffc0: 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
ffd0: 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
ffe0: 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
fff0: 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
10000 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
10010 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
10020 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
10030 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
10040 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
10050 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
10060 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
10070 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
10080 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
10090 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
100a0 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
100b0 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
100c0 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
100d0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
100e0 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
100f0 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
10100 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
10110 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
10120 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
10130 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
10140 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10150 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10160 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
10170 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
10180 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
10190 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
101a0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
101b0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
101c0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
101d0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
101e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
101f0 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
10200 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
10210 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
10220 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
10230 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
10240 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
10250 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
10260 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
10270 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
10280 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
10290 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
102a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
102b0 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
102c0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
102d0 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
102e0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
102f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
10300 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
10310 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
10320 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
10330 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
10340 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10350 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
10360 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
10370 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
10380 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10390 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
103a0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
103b0 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
103c0 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
103d0 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
103e0 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
103f0 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
10400 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
10410 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
10420 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
10430 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10440 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
10450 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
10460 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
10470 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
10480 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
10490 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
104a0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
104b0 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
104c0 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
104d0 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
104e0 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
104f0 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
10520 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
10530 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
10540 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
10560 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
10570 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
10580 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
10590 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
105a0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
105b0 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
105c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
105d0 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
105e0 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
105f0 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
10600 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20  a[].isRecursive 
10610 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
10620 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
10630 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
10640 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
10650 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
10660 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
10670 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
10680 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
10690 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
106a0 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
106b0 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
106c0 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
106d0 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
106e0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
106f0 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
10700 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
10710 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
10720 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
10730 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
10740 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
10750 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
10760 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
10770 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
10780 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
10790 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
107a0 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
107b0 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
107c0 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
107d0 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
107e0 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
107f0 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
10800 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
10810 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
10820 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
10830 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
10840 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
10850 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
10860 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
10870 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
10880 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
10890 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
108a0 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
108b0 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
108c0 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
108d0 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
108e0 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
108f0 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
10900 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
10910 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
10920 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
10930 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
10940 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
10950 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
10960 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
10970 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
10980 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10990 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
109a0 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
109b0 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
109c0 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
109d0 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
109e0 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
109f0 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
10a00 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
10a10 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
10a20 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
10a30 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
10a40 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
10a50 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
10a60 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
10a70 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
10a80 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
10a90 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
10aa0 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
10ab0 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
10ac0 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
10ad0 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
10ae0 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
10af0 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
10b00 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
10b10 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
10b20 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
10b30 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
10b40 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
10b50 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
10b60 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
10b70 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
10b80 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
10b90 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
10ba0 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
10bb0 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
10bc0 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
10bd0 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
10be0 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
10bf0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10c00 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10c10 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
10c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10c30 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
10c40 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
10c50 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
10c60 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
10c70 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
10c80 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
10c90 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
10ca0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
10cb0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
10cc0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
10cd0 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
10ce0 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
10cf0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
10d00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
10d10 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
10d20 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
10d30 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
10d40 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
10d50 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
10d60 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
10d70 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
10d80 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
10d90 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
10da0 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
10db0 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
10dc0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
10dd0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
10de0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
10df0 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
10e00 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
10e10 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
10e20 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
10e30 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
10e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10e50 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
10e60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
10e70 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
10e80 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
10e90 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
10ea0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
10eb0 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
10ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10ed0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
10ee0 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
10ef0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10f00 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
10f10 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
10f20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
10f30 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
10f40 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
10f50 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
10f60 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
10f70 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
10f80 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
10f90 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
10fa0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
10fb0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
10fe0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
11010 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
11020 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
11030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
11040 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
11050 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
11060 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  *pOffset;       
11070 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
11080 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
11090 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
110a0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
110b0 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
110c0 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
110d0 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
110e0 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
110f0 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
11100 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
11110 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
11120 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
11130 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
11140 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
11150 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
11160 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
11170 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
11180 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
11190 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
111a0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
111b0 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
111c0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
111d0 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
111e0 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
111f0 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73  >pLimit;.  pOffs
11200 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
11210 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
11220 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
11230 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
11240 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
11250 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
11260 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
11270 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
11280 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
11290 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
112a0 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
112b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
112c0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
112d0 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
112e0 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
112f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
11300 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63 75  Src->a[i].isRecu
11310 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
11320 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e  Current = pSrc->
11330 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
11340 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11350 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
11360 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62  ate cursors numb
11370 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e  ers for Queue an
11380 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65  d Distinct.  The
11390 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
113a0 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74  or.  ** the Dist
113b0 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20  inct table must 
113c0 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67  be exactly one g
113d0 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75  reater than Queu
113e0 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20  e in order.  ** 
113f0 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74  for the SRT_Dist
11400 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73  Fifo and SRT_Dis
11410 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69  tQueue destinati
11420 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a  ons to work. */.
11430 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73    iQueue = pPars
11440 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28  e->nTab++;.  if(
11450 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
11460 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20   ){.    eDest = 
11470 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44  pOrderBy ? SRT_D
11480 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44  istQueue : SRT_D
11490 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69  istFifo;.    iDi
114a0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
114b0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
114c0 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
114d0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65  rderBy ? SRT_Que
114e0 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20  ue : SRT_Fifo;. 
114f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
11500 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
11510 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51  Queue, eDest, iQ
11520 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ueue);..  /* All
11530 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f  ocate cursors fo
11540 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65  r Current, Queue
11550 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20  , and Distinct. 
11560 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20  */.  regCurrent 
11570 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11580 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11590 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
115a0 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74  Pseudo, iCurrent
115b0 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43  , regCurrent, nC
115c0 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ol);.  if( pOrde
115d0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
115e0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d  fo *pKeyInfo = m
115f0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
11600 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
11610 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   p, 1);.    sqli
11620 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11630 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
11640 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  l, iQueue, pOrde
11650 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
11660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11670 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
11680 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
11690 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65  FO);.    destQue
116a0 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  ue.pOrderBy = pO
116b0 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b  rderBy;.  }else{
116c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
116d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
116e0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
116f0 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20  ue, nCol);.  }. 
11700 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11710 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29   "Queue table"))
11720 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63  ;.  if( iDistinc
11730 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72  t ){.    p->addr
11740 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71  OpenEphm[0] = sq
11750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11760 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
11770 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20  ral, iDistinct, 
11780 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  0);.    p->selFl
11790 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
117a0 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20  hemeral;.  }..  
117b0 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52  /* Detach the OR
117c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
117d0 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  om the compound 
117e0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70  SELECT */.  p->p
117f0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
11800 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
11810 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75  ults of the setu
11820 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65  p-query in Queue
11830 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70  . */.  pSetup->p
11840 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Next = 0;.  rc =
11850 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11860 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26  Parse, pSetup, &
11870 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53  destQueue);.  pS
11880 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  etup->pNext = p;
11890 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
118a0 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76   end_of_recursiv
118b0 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46  e_query;..  /* F
118c0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  ind the next row
118d0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e   in the Queue an
118e0 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f  d output that ro
118f0 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  w */.  addrTop =
11900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11910 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
11920 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65   iQueue, addrBre
11930 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
11940 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  e(v);..  /* Tran
11950 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f  sfer the next ro
11960 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20  w in Queue over 
11970 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  to Current */.  
11980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11990 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
119a0 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54   iCurrent); /* T
119b0 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63  o reset column c
119c0 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ache */.  if( pO
119d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
119e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
119f0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51  v, OP_Column, iQ
11a00 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
11a10 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72  nExpr+1, regCurr
11a20 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
11a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11a40 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
11a50 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43  ta, iQueue, regC
11a60 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  urrent);.  }.  s
11a70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11a80 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
11a90 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75  Queue);..  /* Ou
11aa0 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20  tput the single 
11ab0 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a  row in Current *
11ac0 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  /.  addrCont = s
11ad0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11ae0 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66  bel(v);.  codeOf
11af0 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65  fset(v, regOffse
11b00 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  t, addrCont);.  
11b10 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
11b20 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
11b30 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a  List, iCurrent,.
11b40 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
11b50 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
11b60 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72  rBreak);.  if( r
11b70 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  egLimit ){.    s
11b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11b90 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 72  (v, OP_IfZero, r
11ba0 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
11bb0 61 6b 2c 20 2d 31 29 3b 0a 20 20 20 20 56 64 62  ak, -1);.    Vdb
11bc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
11bd0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
11be0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
11bf0 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
11c00 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
11c10 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
11c20 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
11c30 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
11c40 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
11c50 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
11c60 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
11c70 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
11c80 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
11c90 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
11ca0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11cb0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
11cc0 75 65 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28  ueue);.  assert(
11cd0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
11ce0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
11cf0 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Setup;..  /* Kee
11d00 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f  p running the lo
11d10 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  op until the Que
11d20 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20  ue is empty */. 
11d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11d40 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
11d50 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
11d60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11d70 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
11d80 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63  ak);..end_of_rec
11d90 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20  ursive_query:.  
11da0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11db0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
11dc0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
11dd0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
11de0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70  pOrderBy;.  p->p
11df0 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
11e00 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
11e10 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  Offset;.  return
11e20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11e30 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
11e40 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
11e50 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69  erences */.stati
11e60 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
11e70 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
11e80 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11e90 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11ea0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
11eb0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11ec0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
11ed0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
11ee0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
11ef0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
11f00 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
11f10 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
11f20 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  ults */.);../*.*
11f30 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
11f40 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20  for when two or 
11f50 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20  more terms of a 
11f60 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
11f70 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
11f80 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65  * size result se
11f90 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
11fa0 69 64 20 73 65 6c 65 63 74 57 72 6f 6e 67 4e 75  id selectWrongNu
11fb0 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73  mTermsError(Pars
11fc0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
11fd0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
11fe0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
11ff0 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  lues ){.    sqli
12000 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12010 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20  se, "all VALUES 
12020 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61  must have the sa
12030 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72  me number of ter
12040 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ms");.  }else{. 
12050 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12060 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
12070 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
12080 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
12090 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
120a0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
120b0 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
120c0 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
120d0 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
120e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64   }.}../*.** Hand
120f0 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  le the special c
12100 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ase of a compoun
12110 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
12120 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a  iginates from a.
12130 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ** VALUES clause
12140 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74  .  By handling t
12150 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
12160 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20   case, we avoid 
12170 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f  deep.** recursio
12180 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e  n, and thus do n
12190 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72  ot need to enfor
121a0 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  ce the SQLITE_LI
121b0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
121c0 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55  ECT.** on a VALU
121d0 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ES clause..**.**
121e0 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c   Because the Sel
121f0 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69  ect object origi
12200 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c  nates from a VAL
12210 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20  UES clause:.**  
12220 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c   (1) It has no L
12230 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a  IMIT or OFFSET.*
12240 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
12250 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
12260 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
12270 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
12280 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ause.*/.static i
12290 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61  nt multiSelectVa
122a0 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lues(.  Parse *p
122b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
122c0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
122d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
122e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
122f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
12300 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
12310 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12320 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12330 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12340 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12350 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
12360 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e  *pPrior;.  int n
12370 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
12380 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 6e  ->nExpr;.  int n
12390 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
123a0 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
123b0 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a   p->pNext==0 );.
123c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
123d0 46 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 56 61  Flags & SF_AllVa
123e0 6c 75 65 73 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  lues );.  do{.  
123f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
12400 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
12410 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
12420 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
12430 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | (p->op==TK_SEL
12440 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ECT && p->pPrior
12450 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
12460 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
12470 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12480 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
12490 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  .    if( p->pELi
124a0 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 45 78 70 72  st->nExpr!=nExpr
124b0 20 29 7b 0a 20 20 20 20 20 20 73 65 6c 65 63 74   ){.      select
124c0 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72  WrongNumTermsErr
124d0 6f 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  or(pParse, p);. 
124e0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
124f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
12500 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61  pPrior==0 ) brea
12510 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
12520 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d  ->pPrior->pNext=
12530 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  =p );.    p = p-
12540 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f  >pPrior;.    nRo
12550 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  w++;.  }while(1)
12560 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
12570 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e      pPrior = p->
12580 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
12590 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72  Prior = 0;.    r
125a0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
125b0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
125c0 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  st);.    p->pPri
125d0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
125e0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
125f0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
12600 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70  ow = nRow;.    p
12610 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12620 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12630 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12640 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
12650 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f   process a compo
12660 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66  und query form f
12670 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f  rom.** two or mo
12680 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
12690 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c  ies using UNION,
126a0 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45   UNION ALL, EXCE
126b0 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53  PT, or.** INTERS
126c0 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  ECT.**.** "p" po
126d0 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
126e0 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
126f0 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
12700 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
12710 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
12720 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
12730 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
12740 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
12750 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
12760 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
12770 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
12780 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
12790 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
127a0 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
127b0 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
127c0 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
127d0 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
127e0 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
127f0 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
12800 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
12810 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
12820 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
12830 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
12840 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
12850 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
12860 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
12870 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
12880 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
12890 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
128a0 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
128b0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
128c0 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
128d0 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
128e0 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
128f0 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
12910 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12920 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
12930 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
12940 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
12950 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
12960 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
12970 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
12980 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
12990 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
129a0 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
129b0 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
129c0 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
129d0 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
129e0 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
129f0 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
12a00 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
12a10 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
12a20 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
12a30 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
12a40 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
12a50 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
12a60 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
12a70 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
12a80 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
12a90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
12aa0 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
12ab0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12ac0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12ad0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12ae0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12af0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
12b00 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
12b10 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
12b20 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
12b30 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
12b40 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
12b50 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
12b60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12b70 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
12b80 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
12b90 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
12ba0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
12bb0 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
12bc0 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
12bd0 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
12be0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
12bf0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
12c00 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
12c10 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
12c20 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
12c30 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
12c40 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
12c50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c  /.  Select *pDel
12c60 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61  ete = 0;  /* Cha
12c70 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c  in of simple sel
12c80 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ects to delete *
12c90 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
12ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
12cb0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12cc0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
12cd0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
12ce0 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b    int iSub1 = 0;
12cf0 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
12d00 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
12d10 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
12d20 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ub2 = 0;        
12d30 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
12d40 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
12d50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
12d60 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
12d70 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
12d80 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
12d90 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
12da0 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
12db0 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
12dc0 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
12dd0 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
12de0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
12df0 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
12e00 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
12e10 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
12e20 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
12e30 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
12e40 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  /.  assert( (p->
12e50 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
12e60 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70  cursive)==0 || p
12e70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
12e80 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
12e90 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
12ea0 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d  ->db;.  pPrior =
12eb0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65   p->pPrior;.  de
12ec0 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69  st = *pDest;.  i
12ed0 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
12ee0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
12ef0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12f00 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
12f10 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
12f20 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
12f30 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
12f40 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
12f50 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
12f60 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
12f70 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
12f80 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
12f90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
12fa0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
12fb0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
12fc0 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
12fd0 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
12fe0 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
12ff0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
13000 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
13010 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13020 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
13030 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13040 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
13050 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
13060 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
13070 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
13080 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
13090 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
130a0 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
130b0 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
130c0 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
130d0 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
130e0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
130f0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13100 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
13110 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13120 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
13130 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d  dest.iSDParm, p-
13140 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
13150 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13160 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
13170 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
13180 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
13190 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
131a0 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64   /* Special hand
131b0 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f  ling for a compo
131c0 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
131d0 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20  originates as a 
131e0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20  VALUES clause.. 
131f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
13200 46 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 56 61  Flags & SF_AllVa
13210 6c 75 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d  lues ){.    rc =
13220 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
13230 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  es(pParse, p, &d
13240 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d  est);.    goto m
13250 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13260 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13270 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
13280 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
13290 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
132a0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
132b0 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
132c0 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
132d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
132e0 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
132f0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66  ->pEList );.  if
13300 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
13310 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr!=pPrior->pELi
13320 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
13330 20 73 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54   selectWrongNumT
13340 65 72 6d 73 45 72 72 6f 72 28 70 50 61 72 73 65  ermsError(pParse
13350 2c 20 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  , p);.    rc = 1
13360 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
13370 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
13380 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13390 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
133a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
133b0 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
133c0 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65    generateWithRe
133d0 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61  cursiveQuery(pPa
133e0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
133f0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
13400 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
13410 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
13420 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
13430 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
13440 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
13450 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
13460 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
13470 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
13480 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
13490 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
134a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
134b0 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
134c0 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
134d0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
134e0 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
134f0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
13500 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ALL: {.      int
13510 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
13520 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20   int nLimit;.   
13530 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
13540 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
13550 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
13560 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
13570 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
13580 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
13590 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  et;.      pPrior
135a0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
135b0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
135c0 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
135d0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
135e0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
135f0 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
13600 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
13610 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13620 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
13630 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
13640 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
13650 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
13660 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
13670 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
13680 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
13690 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
136a0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
136b0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
136c0 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
136d0 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
136e0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
136f0 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
13700 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
13710 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
13720 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13730 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a  AddOp1(v, OP_IfZ
13740 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  ero, p->iLimit);
13750 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13760 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
13770 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
13780 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
13790 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
137a0 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e   }.      explain
137b0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
137c0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
137d0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
137e0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
137f0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
13800 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
13810 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
13820 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
13830 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
13840 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
13850 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
13860 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13870 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
13880 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
13890 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
138a0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
138b0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
138c0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26  Prior->pLimit, &
138d0 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
138e0 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
138f0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75  >nSelectRow > (u
13900 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20  64)nLimit .     
13910 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
13920 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d  SelectRow = nLim
13930 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
13940 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
13950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13960 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
13970 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
13980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13990 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
139a0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
139b0 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
139c0 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
139d0 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
139e0 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
139f0 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
13a00 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
13a10 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
13a20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
13a30 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
13a40 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
13a50 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
13a60 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
13a70 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
13a80 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
13a90 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
13aa0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
13ab0 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
13ac0 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
13ad0 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
13ae0 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
13af0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
13b00 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
13b10 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74  est;..      test
13b20 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
13b30 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
13b40 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
13b50 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
13b60 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
13b70 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
13b80 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
13b90 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
13ba0 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
13bb0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
13bc0 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
13bd0 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
13be0 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
13bf0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
13c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13c10 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
13c20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
13c30 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
13c40 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
13c50 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
13c60 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
13c70 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
13c80 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
13c90 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
13ca0 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44  onTab = dest.iSD
13cb0 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
13cc0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
13cd0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
13ce0 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
13cf0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
13d00 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
13d10 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
13d20 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
13d30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
13d40 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
13d50 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
13d60 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
13d70 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
13d80 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
13d90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13da0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
13db0 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
13dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13dd0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
13de0 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
13df0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
13e00 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
13e10 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
13e20 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
13e30 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
13e40 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
13e50 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
13e60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13e70 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
13e80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
13e90 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
13ea0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13eb0 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
13ec0 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
13ed0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
13ee0 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
13ef0 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
13f00 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
13f10 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
13f20 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
13f30 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
13f40 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
13f50 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
13f60 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  r, &uniondest);.
13f70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
13f80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
13f90 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13fa0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
13fb0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
13fc0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
13fd0 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
13fe0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
13ff0 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
14000 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
14010 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14030 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
14040 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  );.        op = 
14050 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
14060 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
14070 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
14080 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
14090 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
140a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
140b0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
140c0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
140d0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
140e0 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
140f0 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61   op;.      expla
14100 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14110 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
14120 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14140 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
14150 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
14160 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
14170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14180 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
14190 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
141a0 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
141b0 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
141c0 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
141d0 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
141e0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
141f0 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
14200 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
14210 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
14220 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
14230 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
14240 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
14250 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
14260 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
14270 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14280 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
14290 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
142a0 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c  _UNION ) p->nSel
142b0 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
142c0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
142d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
142e0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
142f0 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
14300 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
14310 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14320 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
14330 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
14340 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
14350 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  t = 0;..      /*
14360 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
14370 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
14380 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
14390 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
143a0 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
143b0 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
143c0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
143d0 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
143e0 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
143f0 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
14400 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
14410 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
14420 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
14430 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
14440 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
14450 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14460 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
14470 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
14480 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
14490 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
144a0 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
144b0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
144c0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
144d0 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
144e0 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
144f0 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
14500 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
14510 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
14520 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
14530 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
14540 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14550 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
14560 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
14570 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14580 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
14590 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
145a0 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
145b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
145c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
145d0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
145e0 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56  nTab, iBreak); V
145f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14600 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
14610 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14620 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
14630 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
14640 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
14650 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
14660 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
14670 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
14680 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
14690 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
146a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
146b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
146c0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
146d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
146e0 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
146f0 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62  ab, iStart); Vdb
14700 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14720 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14730 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
14740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14750 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14760 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
14770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14780 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
14790 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
147a0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
147b0 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  CT ); {.      in
147c0 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
147d0 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
147e0 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
147f0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
14800 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20  t, *pOffset;.   
14810 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
14820 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
14830 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
14840 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20     int r1;..    
14850 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
14860 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
14870 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
14880 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
14890 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
148a0 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
148b0 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
148c0 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
148d0 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
148e0 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
148f0 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
14900 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
14910 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
14920 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32  ab++;.      tab2
14930 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14940 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
14950 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
14960 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d  );..      addr =
14970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14980 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14990 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
149a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
149b0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
149c0 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
149d0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
149e0 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
149f0 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
14a00 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
14a10 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
14a20 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
14a30 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
14a40 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14a50 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
14a60 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
14a70 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
14a80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14a90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14aa0 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
14ab0 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
14ac0 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65  , tab1);.      e
14ad0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14ae0 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
14af0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14b00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14b10 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14b20 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
14b30 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
14b40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14b50 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
14b60 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
14b70 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14b80 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
14b90 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
14ba0 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
14bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
14bc0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14bd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
14be0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32  nEphemeral, tab2
14bf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
14c00 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
14c10 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
14c20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
14c30 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b  nEphm[1] = addr;
14c40 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14c50 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
14c60 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
14c70 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
14c80 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
14c90 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
14ca0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
14cb0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
14cc0 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61  ersectdest.iSDPa
14cd0 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20  rm = tab2;.     
14ce0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14cf0 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
14d00 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14d10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14d20 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14d30 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74  e, p, &intersect
14d40 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
14d50 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
14d60 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
14d70 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
14d80 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14d90 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
14da0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
14db0 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65  tRow>pPrior->nSe
14dc0 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
14dd0 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
14de0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
14df0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
14e00 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
14e10 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
14e20 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
14e30 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14e40 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20   = pOffset;..   
14e50 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
14e60 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
14e70 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
14e80 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
14e90 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
14ea0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
14eb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
14ec0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
14ed0 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
14ee0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
14ef0 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
14f00 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77  t = p;.        w
14f10 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
14f20 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
14f30 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
14f40 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
14f50 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
14f60 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
14f70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
14f80 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
14f90 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14fa0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
14fb0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
14fc0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
14fd0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
14fe0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
14ff0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
15000 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15010 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
15020 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
15030 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
15040 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  (v);.      r1 = 
15050 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15060 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
15070 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
15080 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15090 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
150a0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
150b0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
150c0 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
150d0 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
150e0 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
150f0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
15100 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15110 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
15120 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
15130 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15140 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c  p->pEList, tab1,
15150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15160 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
15170 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
15180 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
15190 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
151a0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
151b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
151c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
151d0 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20   tab1, iStart); 
151e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
151f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15200 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15210 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
15220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15230 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
15240 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
15250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15260 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
15270 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
15280 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
15290 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
152a0 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
152b0 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
152c0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b   p->op!=TK_ALL);
152d0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
152e0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
152f0 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  es used by .  **
15300 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15310 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
15320 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
15330 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
15340 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
15350 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
15360 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
15370 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
15380 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20  This section is 
15390 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74  run by the right
153a0 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
153b0 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a  tement only..  *
153c0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
153d0 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  nts to the left 
153e0 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  always skip this
153f0 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68   part.  The righ
15400 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45  t-most.  ** SELE
15410 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b  CT might also sk
15420 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20  ip this part if 
15430 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20  it has no ORDER 
15440 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20  BY clause and.  
15450 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65  ** no temp table
15460 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a  s are required..
15470 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
15480 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73  lFlags & SF_Uses
15490 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20  Ephemeral ){.   
154a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
154c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
154d0 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
154e0 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
154f0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
15500 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
15510 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
15520 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
15530 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
15540 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
15550 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
15560 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
15570 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
15580 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
15590 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
155a0 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
155b0 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
155c0 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155e0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
155f0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
15600 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
15610 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a   p->pNext==0 );.
15620 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45      nCol = p->pE
15630 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
15640 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
15650 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
15660 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  db, nCol, 1);.  
15670 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
15680 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15690 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
156a0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
156b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
156c0 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
156d0 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
156e0 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
156f0 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
15700 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
15710 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
15720 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
15730 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
15740 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
15750 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
15760 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
15770 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c     }..    for(pL
15780 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
15790 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
157a0 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
157b0 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
157c0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
157d0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
157e0 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
157f0 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
15800 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
15810 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
15820 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
15830 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
15840 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
15850 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
15860 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
15870 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
15880 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
15890 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
158a0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
158b0 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
158c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
158d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
158e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
158f0 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
15900 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
15910 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
15920 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
15930 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
15940 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20  f(pKeyInfo),.   
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
15970 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
15980 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
15990 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
159a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
159b0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
159c0 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a  (pKeyInfo);.  }.
159d0 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
159e0 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  d:.  pDest->iSds
159f0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
15a00 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
15a10 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73   dest.nSdst;.  s
15a20 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
15a30 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
15a40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15a50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15a60 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
15a70 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
15a80 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73  Code an output s
15a90 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20  ubroutine for a 
15aa0 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
15ab0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a  entation of a.**
15ac0 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74   SELECT statment
15ad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ..**.** The data
15ae0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73   to be output is
15af0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49   contained in pI
15b00 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65  n->iSdst.  There
15b10 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64   are.** pIn->nSd
15b20 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  st columns to be
15b30 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
15b40 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
15b50 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
15b60 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
15b70 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
15b80 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
15b90 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
15ba0 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
15bb0 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
15bc0 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
15bd0 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  0 then it is the
15be0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
15bf0 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  in a vector that
15c00 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
15c10 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
15c20 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69    mem[regPrev] i
15c30 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73  s a flag that is
15c40 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65   false.** if the
15c50 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70  re has been no p
15c60 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
15c70 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
15c80 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65  en code is.** ge
15c90 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72  nerated to suppr
15ca0 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20  ess duplicates. 
15cb0 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65   pKeyInfo is use
15cc0 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a  d for comparing.
15cd0 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49  ** keys..**.** I
15ce0 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e  f the LIMIT foun
15cf0 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69  d in p->iLimit i
15d00 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20  s reached, jump 
15d10 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a  immediately to.*
15d20 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61  * iBreak..*/.sta
15d30 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
15d40 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
15d50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15d60 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
15d70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15d80 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
15d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15da0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
15db0 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ent */.  SelectD
15dc0 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  est *pIn,       
15dd0 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75   /* Coroutine su
15de0 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pplying data */.
15df0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
15e00 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65  est,      /* Whe
15e10 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64  re to send the d
15e20 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
15e30 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20  Return,         
15e40 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61   /* The return a
15e50 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
15e60 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
15e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
15e80 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20  Previous result 
15e90 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e  register.  No un
15ea0 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f  iqueness if 0 */
15eb0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
15ec0 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f  Info,      /* Fo
15ed0 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68  r comparing with
15ee0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
15ef0 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f10 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20  Jump here if we 
15f20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f  hit the LIMIT */
15f30 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
15f40 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
15f50 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a   int iContinue;.
15f60 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61    int addr;..  a
15f70 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
15f80 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15f90 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  .  iContinue = s
15fa0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15fb0 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75  bel(v);..  /* Su
15fc0 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
15fd0 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43  s for UNION, EXC
15fe0 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
15ff0 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  CT .  */.  if( r
16000 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e  egPrev ){.    in
16010 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31  t j1, j2;.    j1
16020 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16030 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
16040 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65  , regPrev); Vdbe
16050 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16060 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
16070 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
16080 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73  mpare, pIn->iSds
16090 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
160a0 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20  n->nSdst,.      
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
160d0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
160e0 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
160f0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
16100 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16110 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c  , OP_Jump, j2+2,
16120 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32   iContinue, j2+2
16130 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16140 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
16150 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
16160 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
16170 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16180 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
16190 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
161a0 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
161b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
161c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
161d0 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
161e0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
161f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16200 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
16210 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
16220 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
16230 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
16240 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
16250 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
16260 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
16270 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  t, iContinue);..
16280 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
16290 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
162a0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
162b0 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
162c0 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
162d0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
162e0 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
162f0 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
16300 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
16310 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16320 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16330 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
16340 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16350 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  rse);.      test
16360 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65  case( pDest->eDe
16370 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
16380 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16390 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
163a0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
163b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
163c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
163d0 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
163e0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  dst, pIn->nSdst,
163f0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
16400 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16410 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
16420 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32  est->iSDParm, r2
16430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16440 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16450 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  _Insert, pDest->
16460 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  iSDParm, r1, r2)
16470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16480 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
16490 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
164a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
164b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
164c0 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
164d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
164e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
164f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16500 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16510 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16520 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
16530 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
16540 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
16550 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
16560 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
16570 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
16580 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
16590 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
165a0 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
165b0 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
165c0 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
165d0 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
165e0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
165f0 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
16600 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73  int r1;.      as
16610 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
16620 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65  ==1 );.      pDe
16630 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20  st->affSdst = . 
16640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
16650 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
16660 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
16670 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
16680 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20  Sdst);.      r1 
16690 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
166a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
166b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
166c0 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
166d0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
166e0 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74  t, 1, r1, &pDest
166f0 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20  ->affSdst,1);.  
16700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16710 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
16720 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
16730 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  iSdst, 1);.     
16740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16750 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
16760 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
16770 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
16780 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16790 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
167a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
167b0 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20     }..#if 0  /* 
167c0 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20  Never occurs on 
167d0 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65 72  an ORDER BY quer
167e0 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61  y */.    /* If a
167f0 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
16800 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
16810 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
16820 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
16830 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
16840 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
16850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16860 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
16870 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61   1, pDest->iSDPa
16880 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
16890 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
168a0 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
168b0 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
168c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
168d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
168e0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
168f0 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
16900 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
16910 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
16920 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
16930 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
16940 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
16950 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
16960 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
16970 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
16980 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16990 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
169a0 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
169b0 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst==1 );.     
169c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
169d0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
169e0 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
169f0 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
16a00 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
16a10 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
16a20 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
16a30 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
16a40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
16a50 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
16a60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16a70 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
16a80 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
16a90 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
16aa0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16ab0 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
16ac0 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
16ad0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
16ae0 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
16af0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16b00 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
16b10 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
16b20 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
16b30 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
16b40 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
16b50 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
16b60 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16b70 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
16b80 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
16b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16ba0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
16bb0 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
16bc0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
16bd0 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73  dst, pDest->nSds
16be0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16bf0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16c00 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
16c10 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
16c20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
16c30 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
16c40 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
16c50 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
16c60 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
16c70 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
16c80 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
16c90 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
16ca0 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
16cb0 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
16cc0 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
16cd0 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
16ce0 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
16cf0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
16d00 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
16d10 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
16d20 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
16d30 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
16d40 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
16d50 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
16d60 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
16d70 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
16d80 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
16d90 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
16da0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
16db0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
16dc0 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
16dd0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
16de0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
16df0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16e00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
16e10 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
16e20 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
16e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16e40 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
16e50 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
16e60 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
16e70 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Sdst);.      bre
16e80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
16e90 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
16ea0 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
16eb0 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
16ec0 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
16ed0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
16ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16ef0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
16f00 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
16f10 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64 62  iBreak, -1); Vdb
16f20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16f30 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
16f40 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
16f50 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
16f60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
16f70 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
16f80 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
16f90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
16fa0 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
16fb0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
16fc0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
16fd0 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
16fe0 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
16ff0 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
17000 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
17010 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
17020 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
17030 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
17040 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
17050 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
17060 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
17070 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
17080 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
17090 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
170a0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
170b0 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
170c0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
170d0 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
170e0 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
170f0 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
17100 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
17110 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
17120 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
17130 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
17140 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
17150 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
17160 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
17170 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
17180 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
17190 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
171a0 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
171b0 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
171c0 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
171d0 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
171e0 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
171f0 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
17200 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
17210 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
17220 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
17230 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
17240 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
17250 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
17260 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
17270 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
17280 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
17290 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
172a0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
172b0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
172c0 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
172d0 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
172e0 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
172f0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
17300 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
17310 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
17320 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
17330 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
17340 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
17350 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
17360 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
17370 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
17380 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
17390 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
173a0 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
173b0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
173c0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
173d0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
173e0 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
173f0 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
17400 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
17410 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
17420 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
17430 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
17440 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
17450 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
17460 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
17470 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
17480 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17490 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
174a0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
174b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
174c0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
174d0 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
174e0 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
174f0 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
17500 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
17510 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
17520 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
17530 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
17540 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
17550 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
17560 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
17570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
17580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
17590 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
175a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
175b0 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
175c0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
175d0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
175e0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
175f0 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
17600 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
17610 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
17620 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
17630 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
17640 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
17650 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
17660 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17670 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
17680 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
17690 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
176a0 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
176b0 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
176c0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
176d0 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
176e0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
176f0 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
17700 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
17710 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
17720 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
17730 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
17740 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
17750 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
17760 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
17770 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
17780 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
17790 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
177a0 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
177b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
177c0 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
177d0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
177e0 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
177f0 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
17800 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
17810 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
17820 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
17830 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
17840 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
17850 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
17860 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
17870 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
17880 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
17890 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
178a0 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
178b0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
178c0 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
178d0 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
178e0 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
178f0 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
17900 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
17910 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
17920 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
17930 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
17940 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
17950 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
17960 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
17970 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
17980 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
17990 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
179a0 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
179b0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
179c0 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
179d0 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
179e0 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
179f0 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
17a00 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
17a10 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
17a20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
17a30 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
17a40 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
17a50 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
17a60 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
17a70 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
17a80 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
17a90 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17aa0 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
17ab0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17ac0 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
17ad0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
17ae0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
17af0 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
17b00 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
17b10 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
17b20 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
17b30 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
17b40 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
17b50 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
17b60 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
17b70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
17b80 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
17b90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
17ba0 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
17bb0 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
17bc0 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
17bd0 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
17be0 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
17bf0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
17c00 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
17c10 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
17c20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
17c30 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
17c40 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
17c50 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
17c60 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
17c70 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
17c80 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
17c90 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
17ca0 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
17cb0 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
17cc0 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
17cd0 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
17ce0 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
17cf0 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
17d00 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
17d10 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
17d20 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
17d30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17d40 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
17d50 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
17d60 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
17d70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
17d80 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
17d90 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
17da0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
17db0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17dc0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
17dd0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
17de0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
17df0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
17e00 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
17e10 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
17e20 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
17e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
17e40 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
17e50 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
17e60 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
17e70 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
17e80 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
17e90 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17eb0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
17ec0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
17ed0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
17ee0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
17ef0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
17f00 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
17f10 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
17f20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
17f30 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
17f40 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
17f50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
17f60 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
17f70 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
17f80 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
17f90 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
17fa0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
17fb0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
17fc0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
17fd0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
17fe0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17ff0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
18000 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18010 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
18020 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18030 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
18040 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18050 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
18060 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18070 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
18080 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
18090 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
180a0 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
180b0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
180c0 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
180d0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
180e0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
180f0 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
18100 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
18110 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
18120 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
18130 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
18140 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
18150 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
18160 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18170 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
18180 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18190 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
181a0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
181b0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f  .  int addrEofA_
181c0 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65  noB;     /* Alte
181d0 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69  rnate addrEofA i
181e0 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  f B is uninitial
181f0 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ized */.  int ad
18200 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
18210 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18220 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
18230 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
18240 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
18250 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18260 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
18270 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18280 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
18290 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
182a0 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
182b0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
182c0 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
182d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
182e0 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
182f0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
18300 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
18310 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
18320 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
18330 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
18340 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
18350 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
18360 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
18370 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
18380 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
18390 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
183a0 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
183b0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
183c0 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
183d0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
183e0 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
183f0 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
18400 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
18410 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
18420 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
18430 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
18440 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
18450 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
18460 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
18470 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
18480 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
18490 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
184a0 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
184b0 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
184c0 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
184d0 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
184e0 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
184f0 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
18500 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
18510 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
18520 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
18530 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
18540 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
18550 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
18560 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
18570 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
18580 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
18590 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
185a0 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
185b0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
185c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
185d0 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
185e0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
185f0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18600 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18610 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
18620 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
18630 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18640 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
18650 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
18660 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18670 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18680 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
18690 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
186a0 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
186b0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
186c0 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
186d0 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
186e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
186f0 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
18700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
18710 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
18720 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
18730 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
18740 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
18750 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
18760 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
18770 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
18780 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
18790 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
187a0 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
187b0 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
187c0 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
187d0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
187e0 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
187f0 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
18800 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
18810 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
18820 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
18830 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
18840 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
18850 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18860 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
18870 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
18880 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18890 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
188a0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
188b0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
188c0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
188d0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
188e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
188f0 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
18900 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
18910 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
18920 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
18930 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
18940 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
18950 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
18960 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
18970 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
18980 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
18990 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
189a0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
189b0 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
189c0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
189d0 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
189e0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
189f0 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
18a00 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
18a10 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
18a20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
18a30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
18a40 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
18a50 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
18a60 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18a70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18a80 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
18a90 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
18aa0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
18ab0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
18ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18ad0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
18ae0 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
18af0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
18b00 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
18b10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
18b20 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
18b30 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
18b40 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
18b50 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
18b60 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
18b70 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
18b80 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18b90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18ba0 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
18bb0 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
18bc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
18bd0 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
18be0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
18bf0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
18c00 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
18c10 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
18c20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
18c30 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
18c40 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
18c50 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
18c60 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
18c70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
18c80 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
18c90 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
18ca0 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
18cb0 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
18cc0 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
18cd0 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
18ce0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
18cf0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
18d00 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
18d10 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
18d20 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
18d30 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
18d40 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
18d50 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
18d60 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
18d70 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
18d80 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
18d90 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
18da0 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
18db0 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
18dc0 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
18dd0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
18de0 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
18df0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
18e00 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79  of(int)*nOrderBy
18e10 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
18e20 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
18e30 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18e40 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Item;.    for(i=
18e50 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
18e60 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79  y->a; i<nOrderBy
18e70 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
18e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18e90 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18ea0 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20 20 20 20  ByCol>0.        
18eb0 20 20 26 26 20 70 49 74 65 6d 2d 3e 75 2e 78 2e    && pItem->u.x.
18ec0 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e  iOrderByCol<=p->
18ed0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
18ee0 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
18ef0 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  i] = pItem->u.x.
18f00 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
18f10 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
18f20 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65  erge = multiSele
18f30 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
18f40 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
18f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
18f60 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
18f70 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
18f80 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18f90 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
18fa0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
18fb0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
18fc0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
18fd0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
18fe0 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
18ff0 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
19000 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
19010 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
19020 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
19030 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
19040 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
19050 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
19060 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
19070 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
19080 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
19090 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
190a0 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
190b0 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
190c0 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
190d0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
190e0 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
190f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19100 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
19110 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
19120 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
19130 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
19140 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
19150 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
19160 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
19170 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
19180 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73  = nExpr+1;.    s
19190 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
191a0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
191b0 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
191c0 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
191d0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
191e0 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
191f0 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
19200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
19210 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
19220 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70  riteable(pKeyDup
19230 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) );.      for(i
19240 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
19250 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
19260 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
19270 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
19280 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
19290 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
192a0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
192b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
192c0 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
192d0 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
192e0 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
192f0 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
19300 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
19310 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72  Prior = 0;.  pPr
19320 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ior->pNext = 0;.
19330 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
19340 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
19350 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
19360 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
19370 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
19380 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
19390 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
193a0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
193b0 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
193c0 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
193d0 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
193e0 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
193f0 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
19400 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
19410 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
19420 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
19430 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
19440 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
19450 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
19460 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19470 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
19480 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
194a0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
194b0 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
194c0 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
194d0 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
19500 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
19510 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19520 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
19530 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
19540 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
19550 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
19560 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
19570 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
19580 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
19590 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
195a0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
195b0 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
195c0 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
195d0 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
195e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
195f0 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
19600 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19610 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
19620 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
19630 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
19640 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
19650 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
19660 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
19670 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
19680 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
19690 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
196a0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
196b0 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
196c0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
196d0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
196e0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
196f0 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
19700 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
19710 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
19720 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
19730 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ct..  */.  addrS
19740 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
19750 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19760 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73  v) + 1;.  j1 = s
19770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19780 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
19790 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20  tine, regAddrA, 
197a0 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  0, addrSelectA);
197b0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
197c0 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22  v, "left SELECT"
197d0 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c  ));.  pPrior->iL
197e0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41  imit = regLimitA
197f0 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ;.  explainSetIn
19800 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
19810 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
19820 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Id);.  sqlite3Se
19830 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
19840 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20  ior, &destA);.  
19850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19860 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
19870 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
19880 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
19890 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a  mpHere(v, j1);..
198a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
198b0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
198c0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
198d0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
198e0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
198f0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
19900 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
19910 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
19920 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
19930 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  1;.  j1 = sqlite
19940 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19950 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
19960 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
19970 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
19980 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
19990 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
199a0 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
199b0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
199c0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
199d0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
199e0 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
199f0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
19a00 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49    .  explainSetI
19a10 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
19a20 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
19a30 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
19a40 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
19a50 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
19a60 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
19a70 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
19a80 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
19a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19aa0 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
19ab0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
19ac0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
19ad0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
19ae0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
19af0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
19b00 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
19b10 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
19b20 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
19b30 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
19b40 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
19b50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
19b60 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
19b70 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
19b80 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
19b90 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
19ba0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
19bb0 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
19bc0 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
19bf0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
19c00 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19c10 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
19c20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
19c30 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
19c40 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
19c50 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
19c60 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
19c70 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
19c80 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
19c90 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
19ca0 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
19cb0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
19cc0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
19cd0 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
19ce0 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
19cf0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
19d00 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
19d10 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
19d20 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
19d30 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
19d40 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
19d50 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
19d60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65  .  }.  sqlite3Ke
19d70 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44  yInfoUnref(pKeyD
19d80 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  up);..  /* Gener
19d90 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19da0 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
19db0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
19dc0 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
19dd0 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
19de0 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
19df0 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
19e00 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  /.  if( op==TK_E
19e10 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
19e20 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
19e30 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
19e40 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c  addrEofA = label
19e50 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  End;.  }else{  .
19e60 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
19e70 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
19e80 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
19e90 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
19ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19eb0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
19ec0 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
19ed0 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
19ee0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19ef0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19f00 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65  , regAddrB, labe
19f10 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  lEnd);.         
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
19f40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19f50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19f60 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
19f70 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
19f80 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b   p->nSelectRow +
19f90 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
19fa0 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tRow;.  }..  /* 
19fb0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19fc0 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
19fd0 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
19fe0 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
19ff0 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1a000 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1a010 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
1a020 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1a030 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1a040 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1a050 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66  addrEofA;.    if
1a060 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ( p->nSelectRow 
1a070 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  > pPrior->nSelec
1a080 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
1a090 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
1a0a0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c  SelectRow;.  }el
1a0b0 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
1a0c0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
1a0d0 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  of-B subroutine"
1a0e0 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42  ));.    addrEofB
1a0f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a100 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1a110 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1a120 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
1a130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a140 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1a150 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64  A, labelEnd); Vd
1a160 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a180 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1a190 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20   0, addrEofB);. 
1a1a0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a1b0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1a1c0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
1a1d0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1a1e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
1a1f0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1a200 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
1a210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a220 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1a230 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1a240 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a250 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a260 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1a270 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1a280 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1a290 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a2a0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
1a2b0 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47  elCmpr);..  /* G
1a2c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1a2d0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1a2e0 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69  of A==B.  */.  i
1a2f0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
1a300 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
1a310 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73  addrAltB;.  }els
1a320 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54  e if( op==TK_INT
1a330 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1a340 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
1a350 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b  B;.    addrAltB+
1a360 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1a370 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1a380 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72  (v, "A-eq-B subr
1a390 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1a3a0 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71  ddrAeqB =.    sq
1a3b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a3c0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a3d0 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1a3e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a3f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a400 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a410 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
1a420 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
1a430 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1a440 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1a450 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
1a460 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a470 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
1a480 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
1a490 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1a4a0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1a4b0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1a4c0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1a4d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a4e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a4f0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1a500 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
1a510 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a520 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a530 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1a540 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1a550 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1a560 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a570 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
1a580 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  pr);..  /* This 
1a590 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74  code runs once t
1a5a0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65  o initialize eve
1a5b0 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  rything..  */.  
1a5c0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1a5d0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71  ere(v, j1);.  sq
1a5e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a5f0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a600 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f  AddrA, addrEofA_
1a610 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  noB); VdbeCovera
1a620 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1a630 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a640 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1a650 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1a660 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1a670 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
1a680 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
1a690 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
1a6a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1a6b0 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1a6c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a6d0 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
1a6e0 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
1a6f0 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
1a700 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
1a710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a720 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
1a730 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64  , destA.iSdst, d
1a740 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64  estB.iSdst, nOrd
1a750 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a770 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c  char*)pKeyMerge,
1a780 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
1a790 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1a7a0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45  eP5(v, OPFLAG_PE
1a7b0 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65  RMUTE);.  sqlite
1a7c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a7d0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42  P_Jump, addrAltB
1a7e0 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72  , addrAeqB, addr
1a7f0 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72  AgtB); VdbeCover
1a800 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75  age(v);..  /* Ju
1a810 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70  mp to the this p
1a820 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
1a830 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   terminate the q
1a840 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  uery..  */.  sql
1a850 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1a860 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64  abel(v, labelEnd
1a870 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
1a880 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
1a890 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  t columns.  */. 
1a8a0 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
1a8b0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
1a8c0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69  .    Select *pFi
1a8d0 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  rst = pPrior;.  
1a8e0 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
1a8f0 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
1a900 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
1a910 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  r;.    generateC
1a920 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
1a930 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
1a940 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
1a950 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1a960 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1a970 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1a980 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1a990 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1a9a0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1a9b0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1a9c0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1a9d0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1a9e0 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1a9f0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1aa00 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1aa10 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1aa20 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1aa30 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1aa40 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1aa50 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1aa60 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1aa70 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
1aa80 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
1aa90 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
1aaa0 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
1aab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1aac0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
1aad0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1aae0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1aaf0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1ab00 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46  _OMIT_VIEW)./* F
1ab10 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
1ab20 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
1ab30 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1ab40 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
1ab50 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
1ab60 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1ab70 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
1ab80 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
1ab90 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
1aba0 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
1abb0 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
1abc0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
1abd0 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
1abe0 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
1abf0 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
1ac00 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
1ac10 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
1ac20 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
1ac30 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
1ac40 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
1ac50 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
1ac60 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
1ac70 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
1ac80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1ac90 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
1aca0 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
1acb0 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
1acc0 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
1acd0 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
1ace0 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
1acf0 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
1ad00 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
1ad10 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
1ad20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
1ad30 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1ad40 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
1ad50 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
1ad60 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
1ad70 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
1ad80 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
1ad90 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
1ada0 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
1adb0 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
1adc0 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
1add0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
1ade0 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
1adf0 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
1ae00 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
1ae10 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
1ae20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1ae30 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
1ae40 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f  malloc errors to
1ae50 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1ae60 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1ae70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  r,        /* Exp
1ae80 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74  r in which subst
1ae90 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a  itution occurs *
1aea0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1aeb0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1aec0 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
1aed0 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1aee0 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53   *pEList    /* S
1aef0 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73  ubstitute expres
1af00 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  sions */.){.  if
1af10 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1af20 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
1af30 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1af40 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
1af50 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
1af60 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
1af70 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1af80 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
1af90 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
1afa0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
1afb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1afc0 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
1afd0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
1afe0 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1aff0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1b000 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
1b010 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
1b020 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
1b030 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1b040 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  , pEList->a[pExp
1b050 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1b060 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
1b070 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1b080 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
1b090 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
1b0a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1b0b0 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
1b0c0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b0d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
1b0e0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b0f0 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
1b100 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b110 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
1b120 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b130 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1b140 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1b150 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1b160 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1b170 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
1b180 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1b190 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  pEList);.    }el
1b1a0 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45  se{.      substE
1b1b0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70  xprList(db, pExp
1b1c0 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  r->x.pList, iTab
1b1d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b1e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b1f0 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20  pExpr;.}.static 
1b200 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1b210 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st(.  sqlite3 *d
1b220 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
1b230 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
1b240 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
1b250 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
1b260 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
1b270 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
1b280 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1b290 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
1b2a0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1b2b0 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
1b2c0 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
1b2d0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
1b2e0 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
1b2f0 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
1b300 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1b310 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1b320 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1b330 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1b340 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1b350 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1b360 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  r(db, pList->a[i
1b370 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
1b380 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
1b390 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1b3a0 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74  tSelect(.  sqlit
1b3b0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1b3c0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
1b3d0 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
1b3e0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1b3f0 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
1b400 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
1b410 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1b420 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
1b430 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1b440 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1b450 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20  be replaced */. 
1b460 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1b470 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
1b480 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
1b490 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1b4a0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1b4b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1b4c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
1b4d0 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75  p ) return;.  su
1b4e0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b4f0 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c  p->pEList, iTabl
1b500 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
1b510 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b520 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61  p->pGroupBy, iTa
1b530 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b540 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b550 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  , p->pOrderBy, i
1b560 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b570 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1b580 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
1b590 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c  pHaving, iTable,
1b5a0 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
1b5b0 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
1b5c0 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  r(db, p->pWhere,
1b5d0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b5e0 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28  ;.  substSelect(
1b5f0 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  db, p->pPrior, i
1b600 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b610 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1b620 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1b630 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72   );  /* Even for
1b640 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20 68   (SELECT 1) we h
1b650 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74  ave: pSrc!=0 but
1b660 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a   pSrc->nSrc==0 *
1b670 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1b680 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  Src) ){.    for(
1b690 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1b6a0 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1b6b0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1b6c0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1b6d0 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  ct(db, pItem->pS
1b6e0 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
1b6f0 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1b700 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
1b710 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b720 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1b730 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b740 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
1b750 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1b760 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1b770 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1b780 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1b790 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1b7a0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
1b7b0 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
1b7c0 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s as a performan
1b7d0 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
1b7e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b7f0 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
1b800 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
1b810 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
1b820 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a  ening occurs..**
1b830 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
1b840 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
1b850 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
1b860 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1b870 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
1b880 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
1b890 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
1b8a0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1b8b0 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
1b8c0 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
1b8d0 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
1b8e0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
1b8f0 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
1b900 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
1b910 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
1b920 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1b930 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1b940 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
1b950 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
1b960 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
1b970 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
1b980 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
1b990 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
1b9a0 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
1b9b0 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
1b9c0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1b9d0 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
1b9e0 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
1b9f0 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
1ba00 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
1ba10 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
1ba20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ba30 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1ba40 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
1ba50 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
1ba60 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
1ba70 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
1ba80 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ba90 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
1baa0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1bab0 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
1bac0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1bad0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1bae0 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  is simplificatio
1baf0 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1bb00 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1bb10 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1bb20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1bb30 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1bb40 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1bb50 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1bb60 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1bb70 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1bb80 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1bb90 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1bba0 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
1bbb0 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
1bbc0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1bbd0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1bbe0 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
1bbf0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1bc00 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1bc10 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
1bc20 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
1bc30 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1bc40 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1bc50 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
1bc60 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1bc70 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
1bc80 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1bc90 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
1bca0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1bcb0 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20  t outer join.** 
1bcc0 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c         (Original
1bcd0 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20  ly ticket #306. 
1bce0 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79   Strengthened by
1bcf0 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a   ticket #3300).*
1bd00 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1bd10 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1bd20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1bd30 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1bd40 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1bd50 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1bd60 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1bd70 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1bd80 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1bd90 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1bda0 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1bdb0 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1bdc0 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1bdd0 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1bde0 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1bdf0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1be00 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1be10 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
1be20 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1be30 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1be40 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1be50 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1be60 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1be70 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
1be80 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1be90 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
1bea0 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
1beb0 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
1bec0 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
1bed0 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
1bee0 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
1bef0 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  ose with the spe
1bf00 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1bf10 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1bf20 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1bf30 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1bf40 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1bf50 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1bf60 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1bf70 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1bf80 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1bf90 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1bfa0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1bfb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
1bfc0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1bfd0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1bfe0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1bff0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
1c000 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
1c010 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  tes..**.**  (**)
1c020 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31    Restriction (1
1c030 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66  0) was removed f
1c040 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20  rom the code on 
1c050 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77  2005-02-05 but w
1c060 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69  e.**        acci
1c070 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74  dently carried t
1c080 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61  he comment forwa
1c090 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39  rd until 2014-09
1c0a0 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a  -15.  Original.*
1c0b0 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a 20 22  *        text: "
1c0c0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c0d0 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
1c0e0 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
1c0f0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1c100 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
1c110 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31  IMIT.".**.**  (1
1c120 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1c130 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
1c140 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1c150 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
1c160 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
1c170 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65  **)  Not impleme
1c180 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20  nted.  Subsumed 
1c190 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  into restriction
1c1a0 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69   (3).  Was previ
1c1b0 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ously.**        
1c1c0 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72  a separate restr
1c1d0 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20  iction deriving 
1c1e0 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30  from ticket #350
1c1f0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ..**.**  (13)  T
1c200 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1c210 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1c220 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1c230 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1c240 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c250 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
1c260 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54  ..**.**  (15)  T
1c270 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1c280 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
1c290 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
1c2a0 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
1c2b0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1c2c0 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20  ot have a LIMIT 
1c2d0 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
1c2e0 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
1c2f0 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b  339 and ticket [
1c300 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a  02a8e81d44])..**
1c310 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f  .**  (16)  The o
1c320 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1c330 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
1c340 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64  r the subquery d
1c350 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f  oes.**        no
1c360 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
1c370 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
1c380 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
1c390 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
1c3a0 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
1c3b0 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
1c3c0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
1c3d0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
1c3e0 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71   (17)  The sub-q
1c3f0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f  uery is not a co
1c400 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f  mpound select, o
1c410 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20  r it is a UNION 
1c420 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63  ALL .**        c
1c430 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d  ompound clause m
1c440 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20  ade up entirely 
1c450 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  of non-aggregate
1c460 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a   queries, and .*
1c470 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72  *        the par
1c480 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  ent query:.**.**
1c490 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1c4a0 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f  ot itself part o
1c4b0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
1c4c0 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ect,.**         
1c4d0 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67   * is not an agg
1c4e0 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e  regate or DISTIN
1c4f0 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a  CT query, and.**
1c500 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1c510 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20  ot a join.**.** 
1c520 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
1c530 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
1c540 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
1c550 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
1c560 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
1c570 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
1c580 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
1c590 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1c5a0 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
1c5b0 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
1c5c0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
1c5d0 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
1c5e0 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
1c5f0 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1c600 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
1c610 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
1c620 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
1c630 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
1c640 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
1c650 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
1c660 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
1c670 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
1c680 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
1c690 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
1c6a0 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
1c6b0 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
1c6c0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
1c6d0 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
1c6e0 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
1c6f0 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
1c700 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
1c710 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
1c720 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
1c730 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1c740 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c750 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
1c760 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
1c770 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1c780 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
1c790 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
1c7a0 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
1c7b0 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
1c7c0 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
1c7d0 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
1c7e0 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
1c7f0 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
1c800 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
1c810 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1c820 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1c830 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
1c840 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
1c850 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62  *        ORDER b
1c860 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  y clause of the 
1c870 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
1c880 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
1c890 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
1c8a0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
1c8b0 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
1c8c0 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65  (19)  The subque
1c8d0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c8e0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1c8f0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
1c900 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
1c910 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
1c920 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
1c930 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1c940 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1c950 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
1c960 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
1c970 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
1c980 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
1c990 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
1c9a0 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
1c9b0 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
1c9c0 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
1c9d0 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
1c9e0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
1c9f0 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
1ca00 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
1ca10 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
1ca20 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
1ca30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1ca40 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20    But we.**     
1ca50 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70     have other op
1ca60 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d  timizations in m
1ca70 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ind to deal with
1ca80 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a   that case..**.*
1ca90 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62  *  (21)  The sub
1caa0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1cab0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1cac0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1cad0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1cae0 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
1caf0 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
1cb00 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
1cb10 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1cb20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1cb30 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29  CTE..**.**  (23)
1cb40 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73 20    The parent is 
1cb50 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1cb60 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62 2d  CTE, or the sub-
1cb70 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a  query is not a.*
1cb80 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
1cb90 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72 65  d query. This re
1cba0 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
1cbb0 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
1cbc0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
1cbd0 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
1cbe0 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
1cbf0 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
1cc00 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
1cc10 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
1cc20 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
1cc30 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
1cc40 32 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  24)  The subquer
1cc50 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1cc60 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20  egate that uses 
1cc70 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
1cc80 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20  () or .**       
1cc90 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
1cca0 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74  ons.  (Without t
1ccb0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c  his restriction,
1ccc0 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a   a query like:.*
1ccd0 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  *        "SELECT
1cce0 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
1ccf0 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74  max(y), x FROM t
1cd00 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65  1)" would not ne
1cd10 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20  cessarily.**    
1cd20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76      return the v
1cd30 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68  alue X for which
1cd40 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29   Y was maximal.)
1cd50 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  .**.**.** In thi
1cd60 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
1cd70 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
1cd80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1cd90 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
1cda0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1cdb0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
1cdc0 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
1cdd0 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
1cde0 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
1cdf0 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
1ce00 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
1ce10 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1ce20 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1ce30 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
1ce40 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
1ce50 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
1ce60 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1ce70 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
1ce80 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1ce90 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
1cea0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1ceb0 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
1cec0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1ced0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
1cee0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
1cef0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
1cf00 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
1cf10 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
1cf20 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
1cf30 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
1cf40 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
1cf50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1cf60 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1cf70 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1cf80 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1cf90 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
1cfa0 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
1cfb0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
1cfc0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
1cfd0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
1cfe0 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
1cff0 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
1d000 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
1d010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d020 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
1d030 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
1d040 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
1d050 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
1d060 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
1d070 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1d080 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1d090 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
1d0a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
1d0b0 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
1d0c0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1d0d0 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
1d0e0 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74  Parent;.  Select
1d0f0 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
1d100 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
1d110 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
1d120 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1d130 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
1d140 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
1d150 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
1d160 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
1d170 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
1d180 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1d190 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1d1a0 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
1d1b0 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
1d1c0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1d1d0 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1d1e0 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
1d1f0 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
1d200 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1d210 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d220 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
1d230 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
1d240 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
1d250 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
1d260 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
1d270 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
1d280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1d290 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1d2a0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2c0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1d2d0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1d2e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d2f0 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
1d300 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1d310 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1d320 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
1d330 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1d340 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1d350 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
1d360 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
1d370 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
1d380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1d390 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20  Prior==0 );  /* 
1d3a0 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65  Unable to flatte
1d3b0 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69  n compound queri
1d3c0 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  es */.  if( Opti
1d3d0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1d3e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
1d3f0 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
1d400 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
1d410 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
1d420 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
1d430 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
1d440 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
1d450 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
1d460 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
1d470 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
1d480 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
1d490 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1d4a0 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
1d4b0 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
1d4c0 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72  isAgg && subquer
1d4d0 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
1d4e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d4f0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d500 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (1)  */.  if( 
1d510 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
1d520 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
1d530 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d540 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d550 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62  n (2)  */.  pSub
1d560 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1d570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1d580 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
1d590 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
1d5a0 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
1d5b0 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
1d5c0 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
1d5d0 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
1d5e0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1d5f0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
1d600 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
1d610 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
1d620 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
1d630 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
1d640 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
1d650 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
1d660 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1d670 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
1d680 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1d690 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
1d6a0 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
1d6b0 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
1d6c0 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
1d6d0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1d6e0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
1d6f0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1d700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d710 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
1d720 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
1d730 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d760 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
1d770 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1d780 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
1d790 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
1d7a0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
1d7b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1d7f0 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
1d800 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1d810 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d830 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d840 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
1d850 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1d860 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
1d870 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1d880 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d890 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69  tion (5)  */.  i
1d8a0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1d8b0 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
1d8c0 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
1d8d0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d8e0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d8f0 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
1d900 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1d910 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1d920 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
1d930 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1d940 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1d950 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d960 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
1d970 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1d980 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1d990 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
1d9a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d9d0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
1d9e0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
1d9f0 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
1da00 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
1da10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1da20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1da30 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
1da40 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1da50 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
1da60 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1da70 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1da80 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
1da90 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1daa0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1dab0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
1dac0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1dad0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dae0 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
1daf0 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
1db00 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1db10 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a  SF_Recursive );.
1db20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1db30 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1db40 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69  MinMaxAgg );.  i
1db50 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1db60 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
1db70 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20  e|SF_MinMaxAgg) 
1db80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1db90 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1dba0 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a   (22) and (24) *
1dbb0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1dbc0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1dbd0 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62  cursive) && pSub
1dbe0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1dbf0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1dc00 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f  triction (23) */
1dc10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c  .  }..  /* OBSOL
1dc20 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20  ETE COMMENT 1:. 
1dc30 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
1dc40 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
1dc50 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
1dc60 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1dc70 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
1dc80 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
1dc90 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1dca0 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
1dcb0 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
1dcc0 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
1dcd0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1dce0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1dcf0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1dd00 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
1dd10 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1dd20 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1dd30 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1dd40 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1dd50 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1dd60 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
1dd70 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
1dd80 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
1dd90 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
1dda0 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  ** OBSOLETE C
1ddb0 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52  OMMENT 2:.  ** R
1ddc0 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
1ddd0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1dde0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1ddf0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
1de00 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
1de10 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
1de20 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
1de30 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
1de40 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
1de50 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
1de60 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1de70 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1de80 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
1de90 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
1dea0 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
1deb0 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1dec0 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1ded0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1dee0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1def0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1df00 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
1df10 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
1df20 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
1df30 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
1df40 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
1df50 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
1df60 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
1df70 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
1df80 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
1df90 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a  INNER JOIN..  **
1dfa0 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52  .  ** THIS OVERR
1dfb0 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f  IDES OBSOLETE CO
1dfc0 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41  MMENTS 1 AND 2 A
1dfd0 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65  BOVE:.  ** Ticke
1dfe0 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68  t #3300 shows th
1dff0 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  at flattening th
1e000 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1e010 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a  a LEFT JOIN.  **
1e020 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68   is fraught with
1e030 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74   danger.  Best t
1e040 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c  o avoid the whol
1e050 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65  e thing.  If the
1e060 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
1e070 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
1e080 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1e090 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
1e0a0 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tten..  */.  if(
1e0b0 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e   (pSubitem->join
1e0c0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
1e0d0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
1e0e0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
1e0f0 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49  estriction 17: I
1e100 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1e110 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
1e120 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
1e130 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
1e140 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
1e150 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
1e160 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
1e170 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
1e180 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
1e190 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
1e1a0 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
1e1b0 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
1e1c0 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
1e1d0 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
1e1e0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
1e1f0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  or ){.    if( pS
1e200 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1e210 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1e220 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e230 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  20 */.    }.    
1e240 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d  if( isAgg || (p-
1e250 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1e260 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70  istinct)!=0 || p
1e270 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a  Src->nSrc!=1 ){.
1e280 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1e290 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53      }.    for(pS
1e2a0 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b  ub1=pSub; pSub1;
1e2b0 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50   pSub1=pSub1->pP
1e2c0 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73  rior){.      tes
1e2d0 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
1e2e0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1e2f0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1e300 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
1e310 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ct );.      test
1e320 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
1e330 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1e340 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1e350 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
1e360 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  te );.      asse
1e370 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d  rt( pSub->pSrc!=
1e380 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
1e390 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1e3a0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1e3b0 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
1e3c0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
1e3d0 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
1e3e0 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
1e3f0 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31  .       || pSub1
1e400 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20  ->pSrc->nSrc<1. 
1e410 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70        || pSub->p
1e420 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53  EList->nExpr!=pS
1e430 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
1e440 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  pr.      ){.    
1e450 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e460 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
1e470 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72  case( pSub1->pSr
1e480 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20  c->nSrc>1 );.   
1e490 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
1e4a0 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20  iction 18. */.  
1e4b0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1e4c0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
1e4d0 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
1e4e0 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
1e4f0 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
1e500 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1e510 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
1e520 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
1e530 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e540 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e550 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
1e560 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1e570 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
1e580 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
1e590 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  */.  SELECTTRACE
1e5a0 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c  (1,pParse,p,("fl
1e5b0 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d  atten %s.%p from
1e5c0 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20   term %d\n",.   
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20  pSub->zSelName, 
1e5f0 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a  pSub, iFrom));..
1e600 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74    /* Authorize t
1e610 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1e620 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1e630 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d  ntext = pSubitem
1e640 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f  ->zName;.  TESTO
1e650 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33  NLY(i =) sqlite3
1e660 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1e670 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
1e680 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73   0, 0, 0);.  tes
1e690 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45  tcase( i==SQLITE
1e6a0 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73  _DENY );.  pPars
1e6b0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1e6c0 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
1e6d0 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ext;..  /* If th
1e6e0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1e6f0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1e700 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
1e710 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e   (by restriction
1e720 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38  s.  ** 17 and 18
1e730 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20   above) it must 
1e740 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  be a UNION ALL a
1e750 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  nd the parent qu
1e760 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62  ery must .  ** b
1e770 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  e of the form:. 
1e780 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1e790 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20  ECT <expr-list> 
1e7a0 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79  FROM (<sub-query
1e7b0 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65  >) <where-clause
1e7c0 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c  > .  **.  ** fol
1e7d0 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44  lowed by any ORD
1e7e0 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64  ER BY, LIMIT and
1e7f0 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73  /or OFFSET claus
1e800 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20  es. This block. 
1e810 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20   ** creates N-1 
1e820 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
1e830 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
1e840 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
1e850 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
1e860 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
1e870 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
1e880 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
1e890 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
1e8a0 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
1e8b0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1e8c0 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
1e8d0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1e8e0 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
1e8f0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1e900 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
1e910 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
1e920 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  *.  ** Example:.
1e930 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1e940 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a  LECT a+1 FROM (.
1e950 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1e960 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT x FROM tab.  
1e970 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1e980 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1e990 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61  SELECT y FROM ta
1e9a0 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
1e9b0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1e9c0 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
1e9d0 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20  *2) FROM tab2.  
1e9e0 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61  **     ) WHERE a
1e9f0 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20  !=5 ORDER BY 1. 
1ea00 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f   **.  ** Transfo
1ea10 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rmed into:.  **.
1ea20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1ea30 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  x+1 FROM tab WHE
1ea40 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE x+1!=5.  **  
1ea50 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1ea60 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31  *     SELECT y+1
1ea70 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1ea80 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  y+1!=5.  **     
1ea90 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1eaa0 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
1eab0 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57  2)+1 FROM tab2 W
1eac0 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21  HERE abs(z*2)+1!
1ead0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45  =5.  **     ORDE
1eae0 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
1eaf0 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68   We call this th
1eb00 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71  e "compound-subq
1eb10 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22  uery flattening"
1eb20 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75  ..  */.  for(pSu
1eb30 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  b=pSub->pPrior; 
1eb40 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d  pSub; pSub=pSub-
1eb50 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65  >pPrior){.    Se
1eb60 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  lect *pNew;.    
1eb70 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1eb80 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1eb90 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d  ;.    Expr *pLim
1eba0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
1ebb0 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65      Expr *pOffse
1ebc0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
1ebd0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69      Select *pPri
1ebe0 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
1ebf0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1ec00 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  = 0;.    p->pSrc
1ec10 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72   = 0;.    p->pPr
1ec20 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ior = 0;.    p->
1ec30 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
1ec40 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
1ec50 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1ec60 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
1ec70 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
1ec80 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
1ec90 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c  pNew, pSub->zSel
1eca0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  Name);.    p->pO
1ecb0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
1ecc0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
1ecd0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
1ece0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1ecf0 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
1ed00 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
1ed10 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
1ed20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1ed30 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
1ed40 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
1ed50 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
1ed60 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1ed70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
1ed80 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
1ed90 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
1eda0 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
1edb0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
1edc0 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
1edd0 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
1ede0 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20  arse,p,.        
1edf0 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   ("compound-subq
1ee00 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63  uery flattener c
1ee10 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20  reates %s.%p as 
1ee20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  peer\n",.       
1ee30 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1ee40 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a  , pNew));.    }.
1ee50 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1ee60 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1ee70 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
1ee80 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
1ee90 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
1eea0 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1eeb0 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
1eec0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1eed0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
1eee0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
1eef0 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
1ef00 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
1ef10 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1ef20 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
1ef30 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1ef40 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1ef50 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1ef60 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1ef70 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
1ef80 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1ef90 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
1efa0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1efb0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
1efc0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
1efd0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
1efe0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
1eff0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1f000 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
1f010 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
1f020 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
1f030 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
1f040 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
1f050 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1f060 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
1f070 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
1f080 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
1f090 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
1f0a0 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
1f0b0 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
1f0c0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
1f0d0 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
1f0e0 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
1f0f0 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
1f100 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
1f110 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
1f120 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
1f130 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
1f140 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
1f150 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
1f160 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
1f170 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
1f180 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1f190 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
1f1a0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
1f1b0 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65  ( pTabToDel->nRe
1f1c0 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
1f1d0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1f1e0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1f1f0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1f200 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1f210 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
1f220 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1f230 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
1f240 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1f250 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
1f260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f270 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
1f280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
1f290 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
1f2a0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1f2b0 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
1f2c0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1f2d0 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
1f2e0 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
1f2f0 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
1f300 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
1f310 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
1f320 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
1f330 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
1f340 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
1f350 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
1f360 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1f370 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
1f380 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
1f390 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
1f3a0 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
1f3b0 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
1f3c0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
1f3d0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
1f3e0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1f3f0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
1f400 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1f410 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
1f420 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
1f430 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
1f440 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
1f450 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
1f460 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
1f470 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
1f480 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
1f490 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
1f4a0 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
1f4b0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
1f4c0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
1f4d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
1f4e0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
1f4f0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
1f500 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
1f510 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
1f520 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
1f530 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
1f540 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
1f550 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
1f560 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
1f570 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
1f580 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
1f590 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
1f5a0 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
1f5b0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1f5c0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
1f5d0 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
1f5e0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
1f5f0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1f600 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
1f610 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
1f620 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
1f630 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
1f640 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1f650 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
1f660 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
1f670 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
1f680 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
1f690 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1f6a0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f6b0 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
1f6c0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1f6d0 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
1f6e0 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
1f6f0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1f700 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
1f710 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
1f720 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
1f730 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1f740 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
1f750 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
1f760 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
1f770 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1f780 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
1f790 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
1f7a0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1f7b0 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
1f7c0 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
1f7d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1f7e0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1f7f0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1f800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1f810 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1f820 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1f830 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
1f840 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1f850 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
1f860 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
1f870 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
1f880 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
1f890 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
1f8a0 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
1f8b0 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
1f8c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
1f8d0 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
1f8e0 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
1f8f0 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
1f900 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1f910 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1f920 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1f930 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
1f940 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
1f950 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
1f960 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
1f970 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1f980 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
1f990 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
1f9a0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
1f9b0 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
1f9c0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1f9d0 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
1f9e0 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
1f9f0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
1fa00 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
1fa10 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
1fa20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71  expand the out q
1fa30 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e  uery to 4 slots.
1fa40 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20    The middle.   
1fa50 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61   ** slot is expa
1fa60 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
1fa70 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
1fa80 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ke space for the
1fa90 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  .    ** two elem
1faa0 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
1fab0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1fac0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
1fad0 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
1fae0 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
1faf0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
1fb00 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1fb10 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1fb20 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
1fb30 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
1fb40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1fb50 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1fb60 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1fb70 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
1fb80 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
1fb90 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
1fba0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
1fbb0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1fbc0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1fbd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
1fbe0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
1fbf0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1fc00 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
1fc10 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
1fc20 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  g);.      pSrc->
1fc30 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
1fc40 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
1fc50 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
1fc60 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
1fc70 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
1fc80 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
1fc90 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
1fca0 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
1fcb0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
1fcc0 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
1fcd0 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
1fce0 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
1fcf0 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
1fd00 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1fd10 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
1fd20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
1fd30 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
1fd40 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1fd50 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
1fd60 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
1fd70 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
1fd80 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
1fd90 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
1fda0 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
1fdb0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
1fdc0 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
1fdd0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
1fde0 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
1fdf0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1fe00 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
1fe10 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
1fe20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1fe30 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
1fe40 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
1fe50 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
1fe60 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1fe70 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
1fe80 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
1fe90 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
1fea0 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
1feb0 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
1fec0 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
1fed0 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
1fee0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
1fef0 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
1ff00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1ff10 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1ff20 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
1ff30 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
1ff40 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1ff50 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
1ff60 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69  DbStrDup(db, pLi
1ff70 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
1ff80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ff90 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
1ffa0 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
1ffb0 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  [i].zName = zNam
1ffc0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1ffd0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1ffe0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1fff0 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
20000 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
20010 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b      if( isAgg ){
20020 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
20030 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
20040 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
20050 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
20060 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
20070 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
20080 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
20090 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
200a0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
200b0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
200c0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
200d0 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74  y ){.      /* At
200e0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79   this point, any
200f0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72   non-zero iOrder
20100 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64  ByCol values ind
20110 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20  icate that the. 
20120 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
20130 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
20140 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20  on is identical 
20150 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43  to the iOrderByC
20160 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65  ol'th.      ** e
20170 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e  xpression return
20180 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61  ed by SELECT sta
20190 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e  tement pSub. Sin
201a0 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a  ce these values.
201b0 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20        ** do not 
201c0 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72  necessarily corr
201d0 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e  espond to column
201e0 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74  s in SELECT stat
201f0 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20  ement pParent,. 
20200 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65       ** zero the
20210 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65  m before transfe
20220 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ring the ORDER B
20230 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
20240 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20  **.      ** Not 
20250 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63  doing this may c
20260 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66  ause an error if
20270 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
20280 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
20290 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74   ** function att
202a0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
202b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d   a compound sub-
202c0 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65  query into pPare
202d0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65  nt.      ** (the
202e0 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63   only way this c
202f0 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20  an happen is if 
20300 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
20310 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20  -query is.      
20320 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72  ** currently par
20330 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29  t of pSub->pSrc)
20340 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31  . See ticket [d1
20350 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20  1a6e908f].  */. 
20360 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
20370 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
20380 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
20390 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
203a0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
203b0 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  {.        pOrder
203c0 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
203d0 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
203e0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
203f0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  rt( pParent->pOr
20400 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
20410 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
20420 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
20430 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
20440 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
20450 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
20460 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
20470 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74  else if( pParent
20480 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
20490 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
204a0 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
204b0 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74  OrderBy, iParent
204c0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
204d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
204e0 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
204f0 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71       pWhere = sq
20500 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
20510 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30   pSub->pWhere, 0
20520 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20530 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
20540 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75      }.    if( su
20550 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
20560 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
20570 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  rent->pHaving==0
20580 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
20590 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61  t->pHaving = pPa
205a0 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20  rent->pWhere;.  
205b0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
205c0 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
205d0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
205e0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
205f0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
20600 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
20610 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
20620 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
20630 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
20640 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
20650 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20  nt->pHaving, .  
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20680 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
20690 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  b, pSub->pHaving
206a0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73  , 0));.      ass
206b0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47  ert( pParent->pG
206c0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
206d0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f     pParent->pGro
206e0 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
206f0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53  prListDup(db, pS
20700 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29  ub->pGroupBy, 0)
20710 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20720 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
20730 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  re = substExpr(d
20740 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
20750 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
20760 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
20770 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
20780 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
20790 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
207a0 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b  pWhere, pWhere);
207b0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
207c0 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
207d0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
207e0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
207f0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
20800 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
20810 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
20820 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
20830 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
20840 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
20850 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
20860 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
20870 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
20880 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
20890 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
208a0 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
208b0 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
208c0 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
208d0 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
208e0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
208f0 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
20900 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
20910 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
20920 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
20930 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20940 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
20950 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20960 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
20970 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
20980 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
20990 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
209a0 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
209b0 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
209c0 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
209d0 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
209e0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
209f0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
20a00 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69  (db, pSub1);..#i
20a10 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
20a20 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
20a30 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
20a40 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71   0x100 ){.    sq
20a50 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
20a60 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69  ("After flatteni
20a70 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ng:\n");.    sql
20a80 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
20a90 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
20aa0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
20ab0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
20ac0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
20ad0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
20ae0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
20af0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
20b00 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e  ../*.** Based on
20b10 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
20b20 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
20b30 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
20b40 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   by the first.**
20b50 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20   argument, this 
20b60 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
20b70 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
20b80 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
20b90 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20      * the query 
20ba0 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20  contains just a 
20bb0 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65  single aggregate
20bc0 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20   function,.**   
20bd0 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65   * the aggregate
20be0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74   function is eit
20bf0 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  her min() or max
20c00 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20  (), and.**    * 
20c10 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
20c20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
20c30 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  nction is a colu
20c40 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  mn value..**.** 
20c50 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
20c60 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68  ove are true, th
20c70 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  en WHERE_ORDERBY
20c80 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
20c90 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20  DERBY_MAX.** is 
20ca0 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72  returned as appr
20cb0 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a  opriate. Also, *
20cc0 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
20cd0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
20ce0 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75  .** list of argu
20cf0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
20d00 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65  the aggregate be
20d10 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
20d20 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
20d30 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
20d40 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a  e are not met, *
20d50 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
20d60 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52  to 0 and.** WHER
20d70 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
20d80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
20d90 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
20da0 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a  xQuery(AggInfo *
20db0 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69  pAggInfo, ExprLi
20dc0 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
20dd0 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
20de0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
20df0 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  L;          /* R
20e00 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
20e10 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b    *ppMinMax = 0;
20e20 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
20e30 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  >nFunc==1 ){.   
20e40 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
20e50 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
20e60 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72  ].pExpr; /* Aggr
20e70 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
20e80 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
20e90 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
20ea0 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  x.pList;      /*
20eb0 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
20ec0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
20ed0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
20ee0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
20ef0 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  CTION );.    if(
20f00 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
20f10 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
20f20 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
20f30 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
20f40 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f  LUMN ){.      co
20f50 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20  nst char *zFunc 
20f60 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
20f70 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
20f80 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
20f90 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
20fa0 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
20fb0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
20fc0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
20fd0 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
20fe0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
20ff0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
21000 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
21010 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
21020 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
21030 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  X;.        *ppMi
21040 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
21050 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21060 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
21070 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70  inMax==0 || (*pp
21080 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d  MinMax)->nExpr==
21090 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  1 );.  return eR
210a0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
210b0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
210c0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
210d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
210e0 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
210f0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
21100 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
21110 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
21120 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
21130 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
21140 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
21150 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
21160 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
21170 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
21180 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
21190 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
211a0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
211b0 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
211c0 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
211d0 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
211e0 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
211f0 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
21200 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
21210 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
21220 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
21230 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
21240 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
21250 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
21260 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
21270 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
21280 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
21290 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
212a0 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
212b0 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
212c0 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
212d0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
212e0 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
212f0 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
21300 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
21310 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
21320 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
21330 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
21340 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
21350 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
21360 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
21370 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
21380 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
21390 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
213a0 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
213b0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
213c0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
213d0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
213e0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
213f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
21400 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
21410 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
21420 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
21430 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
21440 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  .pFunc->funcFlag
21450 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  s&SQLITE_FUNC_CO
21460 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  UNT)==0 ) return
21470 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
21480 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e  >flags&EP_Distin
21490 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ct ) return 0;..
214a0 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
214b0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ../*.** If the s
214c0 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20  ource-list item 
214d0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
214e0 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e  ument was augmen
214f0 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49  ted with an.** I
21500 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
21510 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f  , then try to lo
21520 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69  cate the specifi
21530 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  ed index. If the
21540 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61  re.** was such a
21550 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
21560 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e  named index cann
21570 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  ot be found, ret
21580 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
21590 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61  RROR and leave a
215a0 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
215b0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f  e. Otherwise, po
215c0 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d  pulate .** pFrom
215d0 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74  ->pIndex and ret
215e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
215f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
21600 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72  exedByLookup(Par
21610 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
21620 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21630 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
21640 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46  From->pTab && pF
21650 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20  rom->zIndex ){. 
21660 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
21670 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
21680 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d    char *zIndex =
21690 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a   pFrom->zIndex;.
216a0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
216b0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
216c0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20  ab->pIndex; .   
216d0 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c       pIdx && sql
216e0 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78  ite3StrICmp(pIdx
216f0 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29  ->zName, zIndex)
21700 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d  ; .        pIdx=
21710 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20  pIdx->pNext.    
21720 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78  );.    if( !pIdx
21730 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21740 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
21750 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
21760 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30  : %s", zIndex, 0
21770 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
21780 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
21790 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
217a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
217b0 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49   }.    pFrom->pI
217c0 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d  ndex = pIdx;.  }
217d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
217e0 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74  _OK;.}./*.** Det
217f0 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ect compound SEL
21800 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
21810 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52  hat use an ORDER
21820 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20   BY clause with 
21830 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  .** an alternati
21840 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ve collating seq
21850 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  uence..**.**    
21860 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
21870 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
21880 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44   ... FROM t2 ORD
21890 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45  ER BY .. COLLATE
218a0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65   ....**.** These
218b0 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61   are rewritten a
218c0 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a  s a subquery:.**
218d0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
218e0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
218f0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
21900 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
21910 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52  t2).**     ORDER
21920 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20   BY ... COLLATE 
21930 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  ....**.** This t
21940 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
21950 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
21960 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65  se the multiSele
21970 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74  ctOrderBy() rout
21980 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61  ine.** above tha
21990 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  t generates the 
219a0 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f  code for a compo
219b0 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20  und SELECT with 
219c0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
219d0 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72  se.** uses a mer
219e0 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61  ge algorithm tha
219f0 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73  t requires the s
21a00 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ame collating se
21a10 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a  quence on the.**
21a20 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
21a30 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  as on the ORDER 
21a40 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20  BY clause.  See 
21a50 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f  ticket.** http:/
21a60 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
21a70 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34  src/info/6709574
21a80 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  d2a.**.** This t
21a90 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
21aa0 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72   only needed for
21ab0 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45   EXCEPT, INTERSE
21ac0 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a  CT, and UNION..*
21ad0 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  * The UNION ALL 
21ae0 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66  operator works f
21af0 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65  ine with multiSe
21b00 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76  lectOrderBy() ev
21b10 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65  en when.** there
21b20 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72   are COLLATE ter
21b30 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
21b40 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  BY..*/.static in
21b50 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  t convertCompoun
21b60 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
21b70 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
21b80 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
21b90 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74   int i;.  Select
21ba0 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
21bb0 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20   *pX;.  sqlite3 
21bc0 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78  *db;.  struct Ex
21bd0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
21be0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53    SrcList *pNewS
21bf0 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rc;.  Parse *pPa
21c00 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d  rse;.  Token dum
21c10 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50  my;..  if( p->pP
21c20 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
21c30 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
21c40 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
21c50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
21c60 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72  _Continue;.  for
21c70 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58  (pX=p; pX && (pX
21c80 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
21c90 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pX->op==TK_SELEC
21ca0 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  T); pX=pX->pPrio
21cb0 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30  r){}.  if( pX==0
21cc0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
21cd0 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d  ntinue;.  a = p-
21ce0 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20  >pOrderBy->a;.  
21cf0 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42  for(i=p->pOrderB
21d00 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30  y->nExpr-1; i>=0
21d10 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  ; i--){.    if( 
21d20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67  a[i].pExpr->flag
21d30 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
21d40 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
21d50 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57  ( i<0 ) return W
21d60 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20  RC_Continue;..  
21d70 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
21d80 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
21d90 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66  means the transf
21da0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75  ormation is requ
21db0 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72  ired. */..  pPar
21dc0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
21dd0 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
21de0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
21df0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
21e00 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
21e10 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
21e20 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
21e30 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d  n WRC_Abort;.  m
21e40 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c  emset(&dummy, 0,
21e50 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b   sizeof(dummy));
21e60 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c  .  pNewSrc = sql
21e70 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
21e80 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
21e90 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e  ,0,0,0,&dummy,pN
21ea0 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70  ew,0,0);.  if( p
21eb0 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75  NewSrc==0 ) retu
21ec0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
21ed0 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d  *pNew = *p;.  p-
21ee0 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b  >pSrc = pNewSrc;
21ef0 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73  .  p->pEList = s
21f00 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
21f10 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
21f20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
21f30 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70  TK_ALL, 0));.  p
21f40 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
21f50 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
21f60 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  0;.  pNew->pGrou
21f70 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  pBy = 0;.  pNew-
21f80 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20  >pHaving = 0;.  
21f90 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
21fa0 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   0;.  p->pPrior 
21fb0 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  = 0;.  p->pNext 
21fc0 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  = 0;.  p->selFla
21fd0 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
21fe0 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  nd;.  assert( pN
21ff0 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b  ew->pPrior!=0 );
22000 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d  .  pNew->pPrior-
22010 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
22020 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
22030 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  0;.  pNew->pOffs
22040 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  et = 0;.  return
22050 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
22060 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
22070 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
22080 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28  Argument pWith (
22090 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c  which may be NUL
220a0 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c  L) points to a l
220b0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65  inked list of ne
220c0 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f  sted .** WITH co
220d0 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e  ntexts, from inn
220e0 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e  er to outermost.
220f0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64   If the table id
22100 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  entified by .** 
22110 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
22120 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61  ent pItem is rea
22130 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62  lly a common-tab
22140 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43  le-expression (C
22150 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74  TE) .** then ret
22160 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22170 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74   the CTE definit
22180 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62  ion for that tab
22190 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  le. Otherwise.**
221a0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
221b0 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c  .** If a non-NUL
221c0 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  L value is retur
221d0 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74  ned, set *ppCont
221e0 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ext to point to 
221f0 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65  the With.** obje
22200 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ct that the retu
22210 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73  rned CTE belongs
22220 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73   to..*/.static s
22230 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63  truct Cte *searc
22240 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70  hWith(.  With *p
22250 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
22260 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
22270 65 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20 57 49  ent outermost WI
22280 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  TH clause */.  s
22290 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
222a0 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f  em *pItem,     /
222b0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
222c0 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65  ement to resolve
222d0 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43   */.  With **ppC
222e0 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20  ontext          
222f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49        /* OUT: WI
22300 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  TH clause return
22310 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74   value belongs t
22320 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  o */.){.  const 
22330 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
22340 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
22350 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65  ase==0 && (zName
22360 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29   = pItem->zName)
22370 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  !=0 ){.    With 
22380 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57  *p;.    for(p=pW
22390 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75  ith; p; p=p->pOu
223a0 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ter){.      int 
223b0 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
223c0 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b  ; i<p->nCte; i++
223d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
223e0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
223f0 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  ame, p->a[i].zNa
22400 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
22410 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d      *ppContext =
22420 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   p;.          re
22430 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  turn &p->a[i];. 
22440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22450 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22460 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn 0;.}../* The
22470 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
22480 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63  maintains a stac
22490 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48  k of active WITH
224a0 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68   clauses.** with
224b0 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
224c0 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e  WITH clause bein
224d0 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  g at the top of 
224e0 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
224f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
22500 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c  shes the WITH cl
22510 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74  ause passed as t
22520 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
22530 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74  nt.** onto the t
22540 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
22550 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72   If argument bFr
22560 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ee is true, then
22570 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c   this.** WITH cl
22580 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  ause will never 
22590 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  be popped from t
225a0 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69  he stack. In thi
225b0 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f  s case it.** sho
225c0 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f  uld be freed alo
225d0 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73  ng with the Pars
225e0 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68  e object. In oth
225f0 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a  er cases, when.*
22600 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20  * bFree==0, the 
22610 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c  With object will
22620 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
22630 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20  with the SELECT 
22640 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69  .** statement wi
22650 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61  th which it is a
22660 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f  ssociated..*/.vo
22670 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  id sqlite3WithPu
22680 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
22690 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75  , With *pWith, u
226a0 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65  8 bFree){.  asse
226b0 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20  rt( bFree==0 || 
226c0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30  pParse->pWith==0
226d0 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20   );.  if( pWith 
226e0 29 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f  ){.    pWith->pO
226f0 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70  uter = pParse->p
22700 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
22710 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
22720 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 62 46 72  .    pParse->bFr
22730 65 65 57 69 74 68 20 3d 20 62 46 72 65 65 3b 0a  eeWith = bFree;.
22740 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
22750 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
22760 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46  s if argument pF
22770 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20  rom refers to a 
22780 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20  CTE declared by 
22790 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73  .** a WITH claus
227a0 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63  e on the stack c
227b0 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69  urrently maintai
227c0 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ned by the parse
227d0 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75  r. And,.** if cu
227e0 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
227f0 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73  ng a CTE express
22800 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20  ion, if it is a 
22810 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66  recursive.** ref
22820 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75  erence to the cu
22830 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rrent CTE..**.**
22840 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20   If pFrom falls 
22850 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74  into either of t
22860 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65  he two categorie
22870 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e  s above, pFrom->
22880 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  pTab.** and othe
22890 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70  r fields are pop
228a0 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  ulated according
228b0 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73  ly. The caller s
228c0 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28  hould check.** (
228d0 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20  pFrom->pTab!=0) 
228e0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
228f0 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75  ther or not a su
22900 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a  ccessful match.*
22910 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  * was found..**.
22920 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
22930 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75  t a match is fou
22940 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  nd, SQLITE_OK is
22950 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
22960 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
22970 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   If an error doe
22980 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f  s occur, an erro
22990 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f  r message is sto
229a0 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  red in the.** pa
229b0 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72  rser and some er
229c0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74  ror code other t
229d0 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  han SQLITE_OK re
229e0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
229f0 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64  c int withExpand
22a00 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c  (.  Walker *pWal
22a10 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53  ker, .  struct S
22a20 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
22a30 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  om.){.  Parse *p
22a40 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
22a50 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74  >pParse;.  sqlit
22a60 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
22a70 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74  >db;.  struct Ct
22a80 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20  e *pCte;        
22a90 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65         /* Matche
22aa0 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69  d CTE (or NULL i
22ab0 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20  f no match) */. 
22ac0 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20   With *pWith;   
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ae0 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20   /* WITH clause 
22af0 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67  that pCte belong
22b00 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
22b10 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
22b20 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73  0 );..  pCte = s
22b30 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65  earchWith(pParse
22b40 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20  ->pWith, pFrom, 
22b50 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70  &pWith);.  if( p
22b60 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  Cte ){.    Table
22b70 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72   *pTab;.    Expr
22b80 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
22b90 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
22ba0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66      Select *pLef
22bb0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
22bc0 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53    /* Left-most S
22bd0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
22be0 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52  */.    int bMayR
22bf0 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20  ecursive;       
22c00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22c10 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20  compound joined 
22c20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a  by UNION [ALL] *
22c30 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76  /.    With *pSav
22c40 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20  edWith;         
22c50 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
22c60 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e  alue of pParse->
22c70 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pWith */..    /*
22c80 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69   If pCte->zErr i
22c90 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68  s non-NULL at th
22ca0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
22cb0 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61  his is an illega
22cc0 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  l.    ** recursi
22cd0 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ve reference to 
22ce0 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20  CTE pCte. Leave 
22cf0 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
22d00 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  se and return.  
22d10 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70    ** early. If p
22d20 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c  Cte->zErr is NUL
22d30 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  L, then this is 
22d40 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
22d50 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a  reference..    *
22d60 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
22d70 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20  proceed.  */.   
22d80 20 69 66 28 20 70 43 74 65 2d 3e 7a 45 72 72 20   if( pCte->zErr 
22d90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22da0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
22db0 20 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74   pCte->zErr, pCt
22dc0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e->zName);.     
22dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
22de0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
22df0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
22e00 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pTab==0 );.    p
22e10 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
22e20 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
22e30 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
22e40 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
22e50 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
22e60 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22e70 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
22e80 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e   1;.    pTab->zN
22e90 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
22ea0 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  trDup(db, pCte->
22eb0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62  zName);.    pTab
22ec0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
22ed0 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
22ee0 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
22ef0 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
22f00 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
22f10 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
22f20 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
22f30 72 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  ral;.    pFrom->
22f40 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
22f50 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
22f60 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Cte->pSelect, 0)
22f70 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
22f80 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
22f90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22fa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
22fb0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  rom->pSelect );.
22fc0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
22fd0 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72   this is a recur
22fe0 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20  sive CTE. */.   
22ff0 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70   pSel = pFrom->p
23000 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79  Select;.    bMay
23010 52 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53  Recursive = ( pS
23020 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  el->op==TK_ALL |
23030 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55  | pSel->op==TK_U
23040 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  NION );.    if( 
23050 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
23060 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
23070 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
23080 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  c = pFrom->pSele
23090 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  ct->pSrc;.      
230a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
230b0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
230c0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
230d0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
230e0 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  = &pSrc->a[i];. 
230f0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
23100 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a  ->zDatabase==0 .
23110 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65           && pIte
23120 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20  m->zName!=0 .   
23130 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
23140 74 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d  te3StrICmp(pItem
23150 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a  ->zName, pCte->z
23160 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20  Name).          
23170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
23180 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  em->pTab = pTab;
23190 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
231a0 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20  ->isRecursive = 
231b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  1;.          pTa
231c0 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  b->nRef++;.     
231d0 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
231e0 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73  ags |= SF_Recurs
231f0 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ive;.        }. 
23200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
23210 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65    /* Only one re
23220 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
23230 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  e is permitted. 
23240 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62  */ .    if( pTab
23250 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20  ->nRef>2 ){.    
23260 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23270 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  g(.          pPa
23280 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72  rse, "multiple r
23290 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63  eferences to rec
232a0 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73  ursive table: %s
232b0 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20  ", pCte->zName. 
232c0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65       );.      re
232d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
232e0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  R;.    }.    ass
232f0 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d  ert( pTab->nRef=
23300 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65  =1 || ((pSel->se
23310 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73  lFlags&SF_Recurs
23320 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52  ive) && pTab->nR
23330 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70  ef==2 ));..    p
23340 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63 69 72  Cte->zErr = "cir
23350 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a  cular reference:
23360 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64   %s";.    pSaved
23370 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70  With = pParse->p
23380 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
23390 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
233a0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
233b0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
233c0 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f 20  bMayRecursive ? 
233d0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70  pSel->pPrior : p
233e0 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70  Sel);..    for(p
233f0 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74  Left=pSel; pLeft
23400 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d  ->pPrior; pLeft=
23410 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a  pLeft->pPrior);.
23420 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65      pEList = pLe
23430 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ft->pEList;.    
23440 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20  if( pCte->pCols 
23450 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
23460 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65  ist->nExpr!=pCte
23470 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29  ->pCols->nExpr )
23480 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23490 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
234a0 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
234b0 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64  %d values for %d
234c0 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20   columns",.     
234d0 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61         pCte->zNa
234e0 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  me, pEList->nExp
234f0 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r, pCte->pCols->
23500 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b  nExpr.        );
23510 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
23520 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
23530 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ith;.        ret
23540 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
23550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23560 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70  pEList = pCte->p
23570 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Cols;.    }..   
23580 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
23590 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
235a0 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62  e, pEList, &pTab
235b0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
235c0 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  Col);.    if( bM
235d0 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
235e0 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73       if( pSel->s
235f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
23600 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
23610 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22    pCte->zErr = "
23620 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69  multiple recursi
23630 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25  ve references: %
23640 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s";.      }else{
23650 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
23660 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65  Err = "recursive
23670 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20   reference in a 
23680 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20  subquery: %s";. 
23690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
236a0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
236b0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
236c0 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a     }.    pCte->z
236d0 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Err = 0;.    pPa
236e0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
236f0 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20  vedWith;.  }..  
23700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23710 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
23720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23730 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CTE./*.** If the
23740 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61   SELECT passed a
23750 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
23760 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73  ument has an ass
23770 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a  ociated WITH .**
23780 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20   clause, pop it 
23790 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73  from the stack s
237a0 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
237b0 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
237c0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
237d0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
237e0 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  s the xSelectCal
237f0 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63  lback2() callbac
23800 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53  k by.** sqlite3S
23810 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68  electExpand() wh
23820 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c  en walking a SEL
23830 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f  ECT tree to reso
23840 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  lve table.** nam
23850 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f  es and other FRO
23860 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
23870 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
23880 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  id selectPopWith
23890 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
238a0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
238b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
238c0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
238d0 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d  .  With *pWith =
238e0 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
238f0 29 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66 28 20  )->pWith;.  if( 
23900 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20  pWith!=0 ){.    
23910 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
23920 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a  pWith==pWith );.
23930 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
23940 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65  h = pWith->pOute
23950 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  r;.  }.}.#else.#
23960 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70  define selectPop
23970 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  With 0.#endif../
23980 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
23990 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61  e is a Walker ca
239a0 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61  llback for "expa
239b0 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20  nding" a SELECT 
239c0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45  statement..** "E
239d0 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20  xpanding" means 
239e0 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  to do the follow
239f0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ing:.**.**    (1
23a00 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
23a10 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
23a20 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
23a30 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
23a40 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
23a50 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
23a60 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
23a70 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
23a80 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
23a90 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
23aa0 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
23ab0 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
23ac0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
23ad0 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
23ae0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
23af0 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
23b00 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
23b10 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
23b20 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
23b30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
23b40 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
23b50 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
23b60 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
23b70 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
23b80 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
23b90 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
23ba0 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
23bb0 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
23bc0 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
23bd0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
23be0 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
23bf0 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
23c00 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 72  the persistent r
23c10 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
23c20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
23c30 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
23c40 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
23c50 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23c60 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65  e to accommodate
23c70 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
23c80 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
23c90 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
23ca0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
23cb0 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
23cc0 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
23cd0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
23ce0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
23cf0 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
23d00 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
23d10 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
23d20 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
23d30 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
23d40 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
23d50 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
23d60 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
23d70 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
23d80 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
23d90 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
23da0 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
23db0 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
23dc0 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a  in TABLE..**.*/.
23dd0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
23de0 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72  tExpander(Walker
23df0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
23e00 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
23e10 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
23e20 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
23e30 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69  i, j, k;.  SrcLi
23e40 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
23e50 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
23e60 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
23e70 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
23e80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23e90 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
23ea0 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c  pr *pE, *pRight,
23eb0 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73   *pExpr;.  u16 s
23ec0 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
23ed0 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c  Flags;..  p->sel
23ee0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61  Flags |= SF_Expa
23ef0 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e  nded;.  if( db->
23f00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b  mallocFailed  ){
23f10 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
23f20 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Abort;.  }.  if(
23f30 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d   NEVER(p->pSrc==
23f40 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20  0) || (selFlags 
23f50 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
23f60 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
23f70 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
23f80 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
23f90 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
23fa0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
23fb0 20 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63   pWalker->xSelec
23fc0 74 43 61 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c 65  tCallback2==sele
23fd0 63 74 50 6f 70 57 69 74 68 20 29 7b 0a 20 20 20  ctPopWith ){.   
23fe0 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
23ff0 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67  (pParse, findRig
24000 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
24010 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
24020 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
24030 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
24040 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
24050 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
24060 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
24070 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
24080 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
24090 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
240a0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
240b0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
240c0 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
240d0 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
240e0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
240f0 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
24100 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
24110 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
24120 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
24130 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
24140 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
24150 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
24160 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
24170 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
24180 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
24190 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
241a0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
241b0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
241c0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
241d0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
241e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
241f0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
24200 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  ->isRecursive==0
24210 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20   || pFrom->pTab 
24220 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  );.    if( pFrom
24230 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 20  ->isRecursive ) 
24240 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
24250 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  ( pFrom->pTab!=0
24260 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
24270 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  s statement has 
24280 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65  already been pre
24290 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73  pared.  There is
242a0 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a   no need.      *
242b0 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e  * to go further.
242c0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
242d0 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  ( i==0 );.#ifnde
242e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
242f0 45 0a 20 20 20 20 20 20 73 65 6c 65 63 74 50 6f  E.      selectPo
24300 70 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20 70  pWith(pWalker, p
24310 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
24320 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
24330 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
24340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
24350 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61      if( withExpa
24360 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  nd(pWalker, pFro
24370 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
24380 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70  Abort;.    if( p
24390 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20  From->pTab ) {} 
243a0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
243b0 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
243c0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
243d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
243e0 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
243f0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
24400 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
24410 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
24420 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24430 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
24440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
24450 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
24460 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
24470 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ab==0 );.      i
24480 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  f( sqlite3WalkSe
24490 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
244a0 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  el) ) return WRC
244b0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46  _Abort;.      pF
244c0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
244d0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
244e0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
244f0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
24500 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
24510 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
24520 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
24530 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61  f = 1;.      pTa
24540 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
24550 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
24560 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76  qlite_sq_%p", (v
24570 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20  oid*)pTab);.    
24580 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
24590 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20  Prior ){ pSel = 
245a0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a  pSel->pPrior; }.
245b0 20 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75        selectColu
245c0 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
245d0 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45  pParse, pSel->pE
245e0 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
245f0 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
24600 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  .      pTab->iPK
24610 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  ey = -1;.      p
24620 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
24630 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
24640 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
24650 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
24660 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
24670 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
24680 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  al;.#endif.    }
24690 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
246a0 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
246b0 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
246c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
246d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
246e0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
246f0 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
24700 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
24710 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
24720 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
24730 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69   pFrom);.      i
24740 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
24750 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
24760 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e       if( pTab->n
24770 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20  Ref==0xffff ){. 
24780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
24790 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
247a0 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e  too many referen
247b0 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d  ces to \"%s\": m
247c0 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20  ax 65535",.     
247d0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
247e0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f  e);.        pFro
247f0 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  m->pTab = 0;.   
24800 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
24810 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
24820 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
24830 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  +;.#if !defined(
24840 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
24850 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53  ) || !defined (S
24860 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
24870 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69  ALTABLE).      i
24880 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
24890 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54   || IsVirtual(pT
248a0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ab) ){.        /
248b0 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
248c0 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
248d0 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
248e0 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
248f0 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
24900 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
24910 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72  Parse, pTab) ) r
24920 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
24930 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24940 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
24950 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46  =0 );.        pF
24960 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
24970 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
24980 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  db, pTab->pSelec
24990 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 0);.        s
249a0 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
249b0 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  ame(pFrom->pSele
249c0 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ct, pTab->zName)
249d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
249e0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
249f0 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
24a00 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ect);.      }.#e
24a10 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
24a20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  /* Locate the in
24a30 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65  dex named by the
24a40 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
24a50 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  se, if any. */. 
24a60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
24a70 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
24a80 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
24a90 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
24aa0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
24ab0 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
24ac0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
24ad0 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
24ae0 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
24af0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
24b00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24b10 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73   || sqliteProces
24b20 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
24b30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
24b40 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
24b50 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
24b60 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
24b70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
24b80 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
24b90 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
24ba0 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
24bb0 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
24bc0 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
24bd0 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
24be0 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
24bf0 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
24c00 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
24c10 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
24c20 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
24c30 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
24c40 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
24c50 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
24c60 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
24c70 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
24c80 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
24c90 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
24ca0 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
24cb0 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
24cc0 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
24cd0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
24ce0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
24cf0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
24d00 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
24d10 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
24d20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
24d30 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
24d40 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
24d50 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
24d60 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
24d70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
24d80 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c  +){.    pE = pEL
24d90 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
24da0 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
24db0 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
24dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
24dd0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
24de0 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
24df0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
24e00 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
24e10 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
24e20 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
24e30 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
24e40 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
24e50 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
24e60 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
24e70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
24e80 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
24e90 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
24ea0 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
24eb0 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
24ec0 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
24ed0 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
24ee0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
24ef0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
24f00 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
24f10 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
24f20 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
24f30 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
24f40 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
24f50 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
24f60 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
24f70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
24f80 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
24f90 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
24fa0 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
24fb0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
24fc0 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
24fd0 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
24fe0 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
24ff0 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25010 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
25020 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
25030 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  s)==0;..    /* W
25040 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 46  hen processing F
25050 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
25060 65 72 69 65 73 2c 20 69 74 20 69 73 20 61 6c 77  eries, it is alw
25070 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 20  ays the case.   
25080 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f   ** that full_co
25090 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61  lumn_names=OFF a
250a0 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f  nd short_column_
250b0 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20  names=ON.  The. 
250c0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73     ** sqlite3Res
250d0 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
250e0 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69   routine makes i
250f0 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73  t so. */.    ass
25100 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
25110 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
25120 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  m)==0.          
25130 7c 7c 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c  || ((flags & SQL
25140 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
25150 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )==0 &&.        
25160 20 20 20 20 20 20 28 66 6c 61 67 73 20 26 20 53        (flags & S
25170 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
25180 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20  mes)!=0) );..   
25190 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
251a0 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
251b0 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d  .      pE = a[k]
251c0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52  .pExpr;.      pR
251d0 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68  ight = pE->pRigh
251e0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
251f0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
25200 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  || pRight!=0 );.
25210 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
25220 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d  !=TK_ALL && (pE-
25230 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
25240 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
25250 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
25260 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
25270 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
25280 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
25290 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
252a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
252b0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
252c0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
252d0 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
252e0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
252f0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
25300 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
25310 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
25320 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
25330 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
25340 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
25350 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61  Span = a[k].zSpa
25360 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  n;.          a[k
25370 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
25380 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61         a[k].zSpa
25390 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  n = 0;.        }
253a0 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
253b0 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  xpr = 0;.      }
253c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
253d0 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
253e0 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
253f0 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
25400 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
25410 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
25420 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
25430 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
25440 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
25450 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
25460 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
25470 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20  *zTName = 0;    
25480 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
25490 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
254a0 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
254b0 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
254c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
254d0 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  E->pLeft!=0 );. 
254e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
254f0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
25500 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f  y(pE->pLeft, EP_
25510 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
25520 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
25530 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  pE->pLeft->u.zTo
25540 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ken;.        }. 
25550 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
25560 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
25570 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
25580 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
25590 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
255a0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
255b0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
255c0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
255d0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
255e0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
255f0 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
25600 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
25610 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
25620 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20   *zSchemaName = 
25630 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
25640 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
25650 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
25660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
25670 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
25680 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
25690 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
256a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
256b0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
256c0 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30       if( pSub==0
256d0 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c   || (pSub->selFl
256e0 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
256f0 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rom)==0 ){.     
25700 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b         pSub = 0;
25710 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25720 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74   zTName && sqlit
25730 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
25740 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29  , zTabName)!=0 )
25750 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25760 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
25770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25780 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
25790 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
257a0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
257b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
257c0 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62  SchemaName = iDb
257d0 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44  >=0 ? db->aDb[iD
257e0 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a  b].zName : "*";.
257f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25800 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
25810 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
25820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
25830 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
25840 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
25850 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
25860 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ar *zColname;  /
25870 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63  * The computed c
25880 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
25890 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
258a0 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61  zToFree;   /* Ma
258b0 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68  lloced string th
258c0 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  at needs to be f
258d0 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  reed */.        
258e0 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61      Token sColna
258f0 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64  me;  /* Computed
25900 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20   column name as 
25910 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20  a token */..    
25920 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25930 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20  zName );.       
25940 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
25950 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20  && pSub.        
25960 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d       && sqlite3M
25970 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75  atchSpanName(pSu
25980 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
25990 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65  zSpan, 0, zTName
259a0 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  , 0)==0.        
259b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
259c0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
259d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
259e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
259f0 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
25a00 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28  ed as 'hidden' (
25a10 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70  currently only p
25a20 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
25a30 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75      ** for virtu
25a40 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e  al tables), do n
25a50 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e  ot include it in
25a60 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
25a70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
25a80 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20  ult-set list..  
25a90 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
25aa0 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48           if( IsH
25ab0 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
25ac0 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20  b->aCol[j]) ){. 
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
25ae0 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54  ert(IsVirtual(pT
25af0 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab));.          
25b00 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
25b10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25b20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
25b30 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
25b40 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
25b50 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
25b60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
25b70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  From->jointype &
25b80 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a   JT_NATURAL)!=0.
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ba0 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  && tableAndColum
25bb0 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c  nIndex(pTabList,
25bc0 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29   i, zName, 0, 0)
25bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
25be0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25bf0 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
25c00 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
25c10 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
25c20 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
25c30 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
25c40 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
25c50 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20   the join */.   
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
25c70 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
25c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25c90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25ca0 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f  IdListIndex(pFro
25cb0 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  m->pUsing, zName
25cc0 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
25cd0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
25ce0 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
25cf0 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
25d00 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
25d20 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
25d30 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
25d40 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
25d60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
25d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25d80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25d90 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
25da0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
25db0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
25dc0 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
25dd0 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
25de0 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b      zToFree = 0;
25df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25e00 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54   longNames || pT
25e10 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29  abList->nSrc>1 )
25e20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25e30 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20  Expr *pLeft;.   
25e40 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
25e50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
25e60 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61  b, TK_ID, zTabNa
25e70 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
25e80 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
25e90 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
25ea0 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
25eb0 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
25ec0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
25ed0 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
25ee0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
25ef0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
25f00 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
25f10 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
25f20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
25f30 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
25f40 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
25f50 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  eft, pExpr, 0);.
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
25f80 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
25fa0 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
25fb0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
25fc0 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
25fd0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
25fe0 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
25ff0 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
26000 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26010 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26020 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
26030 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
26040 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26050 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
26060 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
26070 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
26080 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
26090 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a        sColname.z
260a0 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
260b0 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
260c0 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  e.n = sqlite3Str
260d0 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b  len30(zColname);
260e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
260f0 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
26100 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ame(pParse, pNew
26110 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b  , &sColname, 0);
26120 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26130 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c   pNew && (p->sel
26140 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
26150 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20  dFrom)!=0 ){.   
26160 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
26170 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
26180 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70  *pX = &pNew->a[p
26190 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  New->nExpr-1];. 
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
261b0 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20   pSub ){.       
261c0 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
261d0 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
261e0 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
261f0 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
26200 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
26210 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
26220 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
26230 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
26240 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
26250 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
26260 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
26270 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20  , "%s.%s.%s",.  
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262a0 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
262b0 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  Name, zTabName, 
262c0 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
262d0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
262e0 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
262f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
26300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26310 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61     pX->bSpanIsTa
26320 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  b = 1;.         
26330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26340 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
26350 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, zToFree);.   
26360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26370 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
26380 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
26390 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
263a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
263b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
263c0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
263d0 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
263e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
263f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26400 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
26410 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
26420 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
26430 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
26440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26450 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
26460 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
26470 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
26480 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
26490 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  New;.  }.#if SQL
264a0 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
264b0 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26   if( p->pEList &
264c0 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  & p->pEList->nEx
264d0 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
264e0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
264f0 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
26500 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
26510 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
26520 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
26530 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t");.  }.#endif.
26540 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
26550 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
26560 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
26570 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
26580 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
26590 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
265a0 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
265b0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
265c0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
265d0 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
265e0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
265f0 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
26600 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
26610 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
26620 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
26630 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
26640 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
26650 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
26660 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
26670 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
26680 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
26690 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
266a0 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
266b0 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  rser tree..*/.st
266c0 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c  atic int exprWal
266d0 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
266e0 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
266f0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
26700 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
26710 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
26720 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
26730 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
26740 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
26750 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
26760 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
26770 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
26780 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
26790 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
267a0 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
267b0 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
267c0 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
267d0 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
267e0 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
267f0 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
26800 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
26810 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
26820 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
26830 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
26840 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
26850 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
26860 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
26870 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
26880 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
26890 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
268a0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
268b0 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
268c0 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
268d0 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
268e0 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
268f0 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
26900 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
26910 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
26920 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
26930 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
26940 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
26950 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
26960 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
26970 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
26980 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
26990 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
269a0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
269b0 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
269c0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
269d0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
269e0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
269f0 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
26a00 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
26a10 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  e;.  if( pParse-
26a20 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a  >hasCompound ){.
26a30 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
26a40 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43  lback = convertC
26a50 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
26a60 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c  ubquery;.    sql
26a70 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
26a80 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
26a90 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
26aa0 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
26ab0 61 6e 64 65 72 3b 0a 20 20 69 66 28 20 28 70 53  ander;.  if( (pS
26ac0 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
26ad0 26 20 53 46 5f 41 6c 6c 56 61 6c 75 65 73 29 3d  & SF_AllValues)=
26ae0 3d 30 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  =0 ){.    w.xSel
26af0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
26b00 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20  electPopWith;.  
26b10 7d 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  }.  sqlite3WalkS
26b20 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
26b30 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  t);.}...#ifndef 
26b40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
26b50 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  UERY./*.** This 
26b60 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c  is a Walker.xSel
26b70 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c  ectCallback call
26b80 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c  back for the sql
26b90 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e  ite3SelectTypeIn
26ba0 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  fo().** interfac
26bb0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  e..**.** For eac
26bc0 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  h FROM-clause su
26bd0 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75  bquery, add Colu
26be0 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c  mn.zType and Col
26bf0 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66  umn.zColl.** inf
26c00 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  ormation to the 
26c10 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
26c20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
26c30 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  the result set.*
26c40 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65  * of that subque
26c50 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61  ry..**.** The Ta
26c60 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
26c70 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
26c80 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73  e result set was
26c90 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20   constructed.** 
26ca0 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  by selectExpande
26cb0 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65  r() but the type
26cc0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
26cd0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f  nformation was o
26ce0 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61  mitted.** at tha
26cf0 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20  t point because 
26d00 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20  identifiers had 
26d10 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73  not yet been res
26d20 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  olved.  This.** 
26d30 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
26d40 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69  d after identifi
26d50 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  er resolution..*
26d60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
26d70 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
26d80 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a  ypeInfo(Walker *
26d90 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
26da0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
26db0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  arse;.  int i;. 
26dc0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
26dd0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
26de0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
26df0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
26e00 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
26e10 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20  solved );.  if( 
26e20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
26e30 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
26e40 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  0 ){.    p->selF
26e50 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79  lags |= SF_HasTy
26e60 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72  peInfo;.    pPar
26e70 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
26e80 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69  arse;.    pTabLi
26e90 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
26ea0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
26eb0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
26ec0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
26ed0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
26ee0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
26ef0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
26f00 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
26f10 28 70 54 61 62 21 3d 30 29 20 26 26 20 28 70 54  (pTab!=0) && (pT
26f20 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
26f30 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
26f40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
26f50 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
26f60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
26f70 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
26f80 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
26f90 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
26fa0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
26fb0 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sel ){.         
26fc0 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
26fd0 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
26fe0 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
26ff0 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64 43        selectAddC
27000 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
27010 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
27020 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  ab, pSel);.     
27030 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27040 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
27050 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
27060 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79  tine adds dataty
27070 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  pe and collating
27080 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d   sequence inform
27090 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20  ation to.** the 
270a0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73  Table structures
270b0 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   of all FROM-cla
270c0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69  use subqueries i
270d0 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  n a.** SELECT st
270e0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55  atement..**.** U
270f0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
27100 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
27110 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
27120 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
27130 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50  ectAddTypeInfo(P
27140 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
27150 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
27160 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27170 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57  MIT_SUBQUERY.  W
27180 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
27190 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
271a0 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  w));.  w.xSelect
271b0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
271c0 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
271d0 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
271e0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
271f0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
27200 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
27210 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
27220 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
27230 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
27240 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
27250 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73  ts up a SELECT s
27260 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
27270 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
27280 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
27290 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
272a0 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
272b0 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
272c0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
272d0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
272e0 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
272f0 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
27300 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
27310 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
27320 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
27330 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
27340 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
27350 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
27360 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
27370 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
27380 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
27390 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
273a0 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
273b0 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
273c0 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
273d0 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
273e0 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
273f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
27400 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
27410 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
27420 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
27430 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
27440 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
27450 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
27460 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
27470 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
27480 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
27490 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
274a0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
274b0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
274c0 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
274d0 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
274e0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
274f0 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
27500 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
27510 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  db;.  if( NEVER(
27520 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
27530 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
27540 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
27550 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
27560 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  rn;.  if( p->sel
27570 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
27580 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b  peInfo ) return;
27590 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
275a0 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70  Expand(pParse, p
275b0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
275c0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
275d0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
275e0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
275f0 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
27600 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
27610 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
27620 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
27630 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
27640 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
27650 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
27660 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a  o(pParse, p);.}.
27670 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
27680 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
27690 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
276a0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
276b0 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74  mulator is a set
276c0 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
276d0 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e   that hold.** in
276e0 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
276f0 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61  ts while calcula
27700 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ting an aggregat
27710 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  e.  This.** rout
27720 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
27730 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e  de that stores N
27740 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
27750 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63  hose memory.** c
27760 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
27770 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75  void resetAccumu
27780 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
27790 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
277a0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
277b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
277c0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
277d0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
277e0 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74  nc *pFunc;.  int
277f0 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f   nReg = pAggInfo
27800 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e  ->nFunc + pAggIn
27810 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  fo->nColumn;.  i
27820 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74  f( nReg==0 ) ret
27830 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  urn;.#ifdef SQLI
27840 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
27850 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67  rify that all Ag
27860 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20  gInfo registers 
27870 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 72  are within the r
27880 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20 62  ange specified b
27890 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d  y.  ** AggInfo.m
278a0 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78  nReg..AggInfo.mx
278b0 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  Reg */.  assert(
278c0 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d   nReg==pAggInfo-
278d0 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d  >mxReg-pAggInfo-
278e0 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f  >mnReg+1 );.  fo
278f0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
27900 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
27910 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
27920 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
27930 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
27940 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
27950 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  & pAggInfo->aCol
27960 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
27970 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
27980 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
27990 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
279a0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
279b0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
279c0 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e  [i].iMem>=pAggIn
279d0 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20  fo->mnReg.      
279e0 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e     && pAggInfo->
279f0 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70  aFunc[i].iMem<=p
27a00 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29  AggInfo->mxReg )
27a10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
27a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
27a30 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
27a40 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c  pAggInfo->mnReg,
27a50 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67   pAggInfo->mxReg
27a60 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70  );.  for(pFunc=p
27a70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20  AggInfo->aFunc, 
27a80 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
27a90 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75  >nFunc; i++, pFu
27aa0 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  nc++){.    if( p
27ab0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e  Func->iDistinct>
27ac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
27ad0 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45   *pE = pFunc->pE
27ae0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
27af0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
27b00 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65  rty(pE, EP_xIsSe
27b10 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
27b20 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d  f( pE->x.pList==
27b30 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  0 || pE->x.pList
27b40 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
27b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
27b60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44  orMsg(pParse, "D
27b70 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74  ISTINCT aggregat
27b80 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61  es must have exa
27b90 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20  ctly one ".     
27ba0 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22        "argument"
27bb0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  );.        pFunc
27bc0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
27bd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27be0 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
27bf0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
27c00 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
27c10 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69  Parse, pE->x.pLi
27c20 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  st, 0, 0);.     
27c30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27c40 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
27c50 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
27c60 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  >iDistinct, 0, 0
27c70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27c80 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
27c90 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
27ca0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
27cb0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
27cc0 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
27cd0 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
27ce0 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
27cf0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
27d00 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
27d10 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
27d20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
27d30 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
27d40 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
27d50 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
27d60 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
27d70 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
27d80 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
27d90 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
27da0 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
27db0 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
27dc0 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
27dd0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
27de0 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
27df0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
27e00 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
27e10 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
27e20 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
27e30 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
27e40 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct) );.    sqlit
27e50 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
27e60 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
27e70 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
27e80 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
27e90 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
27ea0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
27eb0 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
27ec0 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
27ed0 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
27ee0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
27ef0 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
27f00 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
27f10 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
27f20 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
27f30 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
27f40 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
27f50 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
27f60 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
27f70 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
27f80 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
27f90 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
27fa0 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20  t regHit = 0;.  
27fb0 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20  int addrHitTest 
27fc0 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67  = 0;.  struct Ag
27fd0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
27fe0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
27ff0 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67  _col *pC;..  pAg
28000 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
28010 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 1;.  for(i=0
28020 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
28030 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
28040 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
28050 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
28060 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
28070 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
28080 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
28090 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
280a0 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
280b0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
280c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
280d0 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
280e0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
280f0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
28100 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
28110 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
28120 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
28130 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
28140 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
28150 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
28160 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
28170 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 53  pList, regAgg, S
28180 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b  QLITE_ECEL_DUP);
28190 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
281a0 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
281b0 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
281c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
281d0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
281e0 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
281f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
28200 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
28210 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
28220 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  );.      codeDis
28230 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
28240 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
28250 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
28260 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
28270 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
28280 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
28290 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
282a0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
282b0 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
282c0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
282d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
282e0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
282f0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
28300 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
28310 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
28320 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
28330 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
28340 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
28350 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
28360 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
28370 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
28380 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
28390 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
283a0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
283b0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
283c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
283d0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
283e0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
283f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
28400 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
28410 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
28420 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
28430 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
28440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28450 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
28460 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
28470 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
28480 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
28490 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
284a0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
284b0 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67  ggStep, 0, regAg
284c0 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20  g, pF->iMem,.   
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
284f0 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
28500 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28510 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
28520 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
28530 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
28540 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
28550 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
28560 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
28570 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
28580 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
28590 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
285a0 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
285b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
285c0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
285d0 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
285e0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
285f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
28600 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
28610 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20   populating the 
28620 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
28630 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65  sters, clear the
28640 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
28650 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
28660 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71  f any of the req
28670 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  uired column val
28680 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ues are already 
28690 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e  present .  ** in
286a0 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69   registers, sqli
286b0 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61  te3ExprCode() ma
286c0 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74  y use OP_SCopy t
286d0 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65  o copy the value
286e0 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65  .  ** to pC->iMe
286f0 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69  m. But by the ti
28700 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  me the value is 
28710 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  used, the origin
28720 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a  al register.  **
28730 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
28740 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e  sed, invalidatin
28750 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  g the underlying
28760 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20   buffer holding 
28770 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72  the.  ** text or
28780 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65   blob value. See
28790 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64   ticket [883034d
287a0 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cb5]..  **.  ** 
287b0 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  Another solution
287c0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61   would be to cha
287d0 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  nge the OP_SCopy
287e0 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61   used to copy ca
287f0 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ched.  ** values
28800 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a   to an OP_Copy..
28810 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69    */.  if( regHi
28820 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
28830 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
28840 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
28850 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65  f, regHit); Vdbe
28860 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
28870 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
28880 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
28890 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  ;.  for(i=0, pC=
288a0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
288b0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
288c0 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
288d0 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
288e0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
288f0 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
28900 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
28910 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
28920 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  de = 0;.  sqlite
28930 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
28940 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61  pParse);.  if( a
28950 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20  ddrHitTest ){.  
28960 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
28970 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74  pHere(v, addrHit
28980 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Test);.  }.}../*
28990 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
289a0 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
289b0 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56  ruction to the V
289c0 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61  DBE to explain a
289d0 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74   simple.** count
289e0 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45  (*) query ("SELE
289f0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
28a00 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e   pTab")..*/.#ifn
28a10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28a20 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76  EXPLAIN.static v
28a30 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  oid explainSimpl
28a40 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20  eCount(.  Parse 
28a50 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
28a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
28a70 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
28a80 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28aa0 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
28ab0 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ueried */.  Inde
28ac0 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28ae0 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74  ndex used to opt
28af0 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e  imize scan, or N
28b00 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
28b10 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
28b20 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  =2 ){.    int bC
28b30 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20  over = (pIdx!=0 
28b40 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
28b50 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79  b) || !IsPrimary
28b60 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29  KeyIndex(pIdx)))
28b70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70  ;.    char *zEqp
28b80 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
28b90 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53  f(pParse->db, "S
28ba0 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73  CAN TABLE %s%s%s
28bb0 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
28bc0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
28bd0 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47  bCover ? " USING
28be0 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
28bf0 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20  " : "",.        
28c00 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a  bCover ? pIdx->z
28c10 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b  Name : "".    );
28c20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
28c30 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
28c40 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
28c50 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
28c60 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
28c70 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e   0, zEqp, P4_DYN
28c80 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  AMIC.    );.  }.
28c90 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
28ca0 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
28cb0 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  unt(a,b,c).#endi
28cc0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
28cd0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
28ce0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
28cf0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
28d00 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
28d10 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
28d20 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64   returned accord
28d30 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63  ing to the Selec
28d40 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
28d50 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  .** See comments
28d60 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
28d70 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f  for further info
28d80 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rmation..**.** T
28d90 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
28da0 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
28db0 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
28dc0 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
28dd0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
28de0 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
28df0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
28e00 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
28e10 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
28e20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
28e30 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
28e40 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
28e50 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
28e60 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
28e70 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
28e80 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
28e90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
28ea0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
28eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28ec0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
28ed0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
28ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28ef0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
28f00 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
28f10 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
28f20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
28f30 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
28f40 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
28f50 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
28f60 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
28f70 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
28f80 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
28f90 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
28fa0 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
28fb0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
28fc0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28fe0 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
28ff0 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
29000 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
29010 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
29020 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
29030 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
29040 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
29050 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
29060 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
29070 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
29080 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
29090 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
290a0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
290b0 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
290c0 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
290d0 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
290e0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
290f0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
29100 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
29110 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
29120 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
29130 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
29140 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
29150 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
29160 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
29170 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
29180 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
29190 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
291a0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
291b0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
291c0 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  on */.  Distinct
291d0 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f  Ctx sDistinct; /
291e0 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
291f0 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e   code the DISTIN
29200 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  CT keyword */.  
29210 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20  SortCtx sSort;  
29220 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f         /* Info o
29230 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
29240 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
29250 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  e */.  AggInfo s
29260 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
29270 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
29280 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
29290 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
292a0 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
292b0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
292c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
292d0 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
292e0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
292f0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
29300 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
29310 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29320 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
29330 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
29340 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
29350 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
29360 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
29370 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
29380 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
29390 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
293a0 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
293b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
293c0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
293d0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
293e0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
293f0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
29400 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
29410 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
29420 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
29430 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
29440 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
29450 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  ));.#if SELECTTR
29460 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50  ACE_ENABLED.  pP
29470 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
29480 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54  ent++;.  SELECTT
29490 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
294a0 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73   ("begin process
294b0 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28  ing:\n"));.  if(
294c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
294d0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
294e0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
294f0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
29500 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
29510 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
29520 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
29530 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
29540 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72  tFifo );.  asser
29550 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
29560 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
29570 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20  t!=SRT_Fifo );. 
29580 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
29590 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
295a0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
295b0 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65  tQueue );.  asse
295c0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
295d0 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
295e0 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b  st!=SRT_Queue );
295f0 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
29600 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
29610 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  {.    assert(pDe
29620 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
29630 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
29640 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
29650 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
29660 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
29670 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
29680 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
29690 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20  scard ||.       
296a0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
296b0 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20  ==SRT_Queue  || 
296c0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
296d0 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20  T_DistFifo ||.  
296e0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
296f0 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
29700 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ueue || pDest->e
29710 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b  Dest==SRT_Fifo);
29720 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52  .    /* If ORDER
29730 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66   BY makes no dif
29740 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f  ference in the o
29750 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68  utput then neith
29760 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44  er does.    ** D
29770 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61  ISTINCT so it ca
29780 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f  n be removed too
29790 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
297a0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
297b0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
297c0 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
297d0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c   = 0;.    p->sel
297e0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
297f0 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  tinct;.  }.  sql
29800 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
29810 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20  Parse, p, 0);.  
29820 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30  memset(&sSort, 0
29830 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29  , sizeof(sSort))
29840 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  ;.  sSort.pOrder
29850 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
29860 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
29870 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
29880 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
29890 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
298a0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
298b0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
298c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
298d0 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73  .  isAgg = (p->s
298e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
298f0 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73  regate)!=0;.  as
29900 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
29910 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  );..  /* Begin g
29920 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a  enerating code..
29930 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
29940 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
29950 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
29960 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
29970 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
29980 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
29990 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
299a0 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
299b0 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
299c0 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69   output..  */.#i
299d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
299e0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
299f0 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
29a00 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
29a10 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
29a20 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
29a30 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
29a40 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
29a50 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
29a60 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
29a70 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
29a80 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
29a90 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
29aa0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
29ab0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
29ac0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
29ad0 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d  ).  for(i=0; !p-
29ae0 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61  >pPrior && i<pTa
29af0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
29b00 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
29b10 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
29b20 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
29b30 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
29b40 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
29b50 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
29b60 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
29b70 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a   int isAggSub;..
29b80 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
29b90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
29ba0 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68   /* Sometimes th
29bb0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62  e code for a sub
29bc0 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65  query will be ge
29bd0 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61  nerated more tha
29be0 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69  n.    ** once, i
29bf0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
29c00 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48  s part of the WH
29c10 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ERE clause in a 
29c20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a  LEFT JOIN,.    *
29c30 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  * for example.  
29c40 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f  In that case, do
29c50 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20   not regenerate 
29c60 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69  the code to mani
29c70 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69  fest.    ** a vi
29c80 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75  ew or the co-rou
29c90 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tine to implemen
29ca0 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66  t a view.  The f
29cb0 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20  irst instance.  
29cc0 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65    ** is sufficie
29cd0 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73  nt, though the s
29ce0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e  ubroutine to man
29cf0 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64  ifest the view d
29d00 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  oes need.    ** 
29d10 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67  to be invoked ag
29d20 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
29d30 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
29d40 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ub ){.      if( 
29d50 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  pItem->viaCorout
29d60 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ine==0 ){.      
29d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29d80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
29d90 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
29da0 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  n, pItem->addrFi
29db0 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a  llSub);.      }.
29dc0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
29dd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
29de0 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48  crement Parse.nH
29df0 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69  eight by the hei
29e00 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ght of the large
29e10 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  st expression.  
29e20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72    ** tree referr
29e30 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
29e40 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
29e50 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
29e60 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
29e70 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
29e80 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
29e90 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
29ea0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
29eb0 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
29ec0 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
29ed0 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
29ee0 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
29ef0 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
29f00 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
29f10 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
29f20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
29f30 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
29f40 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
29f50 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
29f60 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
29f70 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70     isAggSub = (p
29f80 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
29f90 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
29fa0 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65  ;.    if( flatte
29fb0 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
29fc0 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69  , p, i, isAgg, i
29fd0 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20  sAggSub) ){.    
29fe0 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65    /* This subque
29ff0 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62  ry can be absorb
2a000 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  ed into its pare
2a010 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nt. */.      if(
2a020 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20   isAggSub ){.   
2a030 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a       isAgg = 1;.
2a040 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
2a050 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67  ags |= SF_Aggreg
2a060 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ate;.      }.   
2a070 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
2a080 65 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69 73  else if( pTabLis
2a090 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
2a0a0 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
2a0b0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
2a0c0 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f   SQLITE_SubqCoro
2a0d0 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20  utine).    ){.  
2a0e0 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74      /* Implement
2a0f0 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
2a100 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  at will return a
2a110 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
2a120 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
2a130 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69  ** set on each i
2a140 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20  nvocation..     
2a150 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2a160 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
2a170 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2a180 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  )+1;.      pItem
2a190 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
2a1a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2a1b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a1c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
2a1d0 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
2a1e0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20  ->regReturn, 0, 
2a1f0 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
2a200 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2a210 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  "%s", pItem->pTa
2a220 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2a230 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
2a240 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
2a250 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2a260 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
2a270 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
2a280 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2a290 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  rn);.      expla
2a2a0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74  inSetInteger(pIt
2a2b0 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28  em->iSelectId, (
2a2c0 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  u8)pParse->iNext
2a2d0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
2a2e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
2a2f0 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
2a300 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  st);.      pItem
2a310 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  ->pTab->nRowLogE
2a320 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
2a330 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74  st(pSub->nSelect
2a340 52 6f 77 29 3b 0a 20 20 20 20 20 20 70 49 74 65  Row);.      pIte
2a350 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  m->viaCoroutine 
2a360 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  = 1;.      pItem
2a370 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65  ->regResult = de
2a380 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20  st.iSdst;.      
2a390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a3a0 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
2a3b0 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2a3c0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73  Return);.      s
2a3d0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2a3e0 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29  re(v, addrTop-1)
2a3f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
2a400 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2a410 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65  (pParse);.    }e
2a420 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  lse{.      /* Ge
2a430 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2a440 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ine that will fi
2a450 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ll an ephemeral 
2a460 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20  table with.     
2a470 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   ** the content 
2a480 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72 79  of this subquery
2a490 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  .  pItem->addrFi
2a4a0 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74  llSub will point
2a4b0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
2a4c0 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2a4d0 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75  generated subrou
2a4e0 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65  tine.  pItem->re
2a4f0 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a  gReturn.      **
2a500 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 61   is a register a
2a510 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
2a520 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
2a530 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20  return address. 
2a540 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
2a550 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20  t topAddr;.     
2a560 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20   int onceAddr = 
2a570 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74  0;.      int ret
2a580 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Addr;.      asse
2a590 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
2a5a0 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20  illSub==0 );.   
2a5b0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
2a5c0 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
2a5d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41  nMem;.      topA
2a5e0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2a5f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2a600 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d  teger, 0, pItem-
2a610 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2a620 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
2a630 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b  llSub = topAddr+
2a640 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  1;.      if( pIt
2a650 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
2a660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
2a670 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
2a680 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61  y is not correla
2a690 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72  ted and if we ar
2a6a0 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a  e not inside of.
2a6b0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69          ** a tri
2a6c0 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e  gger, then we on
2a6d0 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  ly need to compu
2a6e0 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
2a6f0 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
2a700 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f       ** once. */
2a710 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64  .        onceAdd
2a720 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
2a730 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
2a740 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2a750 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2a760 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
2a770 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
2a780 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2a790 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a7a0 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43         VdbeNoopC
2a7b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
2a7c0 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
2a7d0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2a7e0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ame));.      }. 
2a7f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2a800 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
2a810 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
2a820 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
2a830 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
2a840 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2a850 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
2a860 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2a870 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ctId);.      sql
2a880 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
2a890 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
2a8a0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
2a8b0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
2a8c0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
2a8d0 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  Sub->nSelectRow)
2a8e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
2a8f0 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
2a900 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e  beJumpHere(v, on
2a910 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  ceAddr);.      r
2a920 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  etAddr = sqlite3
2a930 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2a940 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  _Return, pItem->
2a950 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2a960 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2a970 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
2a980 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2a990 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2a9a0 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74  dbeChangeP1(v, t
2a9b0 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29  opAddr, retAddr)
2a9c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
2a9d0 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2a9e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
2a9f0 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65      if( /*pParse
2aa00 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e  ->nErr ||*/ db->
2aa10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2aa20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
2aa30 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
2aa40 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
2aa50 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
2aa60 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
2aa70 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
2aa80 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
2aa90 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
2aaa0 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
2aab0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2aac0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2aad0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69      }.  }.  pELi
2aae0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
2aaf0 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20  #endif.  pWhere 
2ab00 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
2ab10 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
2ab20 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
2ab30 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
2ab40 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2ab50 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  t = (p->selFlags
2ab60 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
2ab70 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  =0;..#ifndef SQL
2ab80 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
2ab90 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66  D_SELECT.  /* If
2aba0 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20   there is are a 
2abb0 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72  sequence of quer
2abc0 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c  ies, do the earl
2abd0 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a  ier ones first..
2abe0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
2abf0 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  rior ){.    rc =
2ac00 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
2ac10 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
2ac20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2ac30 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
2ac40 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
2ac50 65 53 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20  eSelectId);.#if 
2ac60 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2ac70 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52  LED.    SELECTTR
2ac80 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
2ac90 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  "end compound-se
2aca0 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c  lect processing\
2acb0 6e 22 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65  n"));.    pParse
2acc0 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d  ->nSelectIndent-
2acd0 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  -;.#endif.    re
2ace0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2acf0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
2ad00 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e   query is DISTIN
2ad10 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
2ad20 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61   BY but is not a
2ad30 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64  n aggregate, and
2ad40 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65   .  ** if the se
2ad50 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65  lect-list is the
2ad60 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44   same as the ORD
2ad70 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e  ER BY list, then
2ad80 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a   this query.  **
2ad90 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
2ada0 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e  n as a GROUP BY.
2adb0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2adc0 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
2add0 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54       SELECT DIST
2ade0 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  INCT xyz FROM ..
2adf0 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  . ORDER BY xyz. 
2ae00 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e   **.  ** is tran
2ae10 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a  sformed to:.  **
2ae20 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
2ae30 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52   xyz FROM ... GR
2ae40 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52  OUP BY xyz ORDER
2ae50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
2ae60 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
2ae70 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61  m is preferred a
2ae80 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  s a single index
2ae90 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29   (or temp-table)
2aea0 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73   may be .  ** us
2aeb0 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ed for both the 
2aec0 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53  ORDER BY and DIS
2aed0 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67  TINCT processing
2aee0 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20  . As originally 
2aef0 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68  .  ** written th
2af00 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65  e query must use
2af10 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f   a temp-table fo
2af20 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  r at least one o
2af30 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a  f the ORDER .  *
2af40 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  * BY and DISTINC
2af50 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  T, and an index 
2af60 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70  or separate temp
2af70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f  -table for the o
2af80 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
2af90 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2afa0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
2afb0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
2afc0 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20  Distinct .   && 
2afd0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2afe0 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72  ompare(sSort.pOr
2aff0 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74  derBy, p->pEList
2b000 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
2b010 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2b020 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
2b030 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
2b040 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2b050 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
2b060 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75  t, 0);.    pGrou
2b070 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
2b080 79 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65  y;.    /* Notice
2b090 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
2b0a0 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68  ht SF_Distinct h
2b0b0 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20  as been cleared 
2b0c0 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  from p->selFlags
2b0d0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69  ,.    ** the sDi
2b0e0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73  stinct.isTnct is
2b0f0 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e   still set.  Hen
2b100 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65  ce, isTnct repre
2b110 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a  sents the.    **
2b120 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e   original settin
2b130 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74  g of the SF_Dist
2b140 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74  inct flag, not t
2b150 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
2b160 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ng */.    assert
2b170 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2b180 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ct );.  }..  /* 
2b190 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
2b1a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2b1b0 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e  then this sortin
2b1c0 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67  g.  ** index mig
2b1d0 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
2b1e0 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
2b1f0 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20  ta can be .  ** 
2b200 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
2b210 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20  -sorted order.  
2b220 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
2b230 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ase, then the.  
2b240 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  ** OP_OpenEpheme
2b250 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
2b260 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
2b270 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
2b280 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72  ce.  ** we figur
2b290 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
2b2a0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  orting index is 
2b2b0 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
2b2c0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20   addrSortIndex. 
2b2d0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
2b2e0 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
2b2f0 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  te that change..
2b300 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
2b310 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2b320 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2b330 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  fo;.    pKeyInfo
2b340 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2b350 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73  prList(pParse, s
2b360 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30  Sort.pOrderBy, 0
2b370 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
2b380 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75  ;.    sSort.iECu
2b390 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
2b3a0 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74  Tab++;.    sSort
2b3b0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2b3c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2b3d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2b3e0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2b3f0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45          sSort.iE
2b400 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f  Cursor, sSort.pO
2b410 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b  rderBy->nExpr+1+
2b420 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
2b430 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61  ,.          (cha
2b440 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2b450 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b  KEYINFO.      );
2b460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53  .  }else{.    sS
2b470 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2b480 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
2b490 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
2b4a0 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
2b4b0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
2b4c0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
2b4d0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
2b4e0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2b4f0 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
2b500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b510 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
2b520 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69  emeral, pDest->i
2b530 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  SDParm, pEList->
2b540 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
2b550 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
2b560 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
2b570 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2b580 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e  Label(v);.  p->n
2b590 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47  SelectRow = LARG
2b5a0 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d  EST_INT64;.  com
2b5b0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
2b5c0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
2b5d0 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
2b5e0 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74  imit==0 && sSort
2b5f0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
2b600 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2b610 56 64 62 65 47 65 74 4f 70 28 76 2c 20 73 53 6f  VdbeGetOp(v, sSo
2b620 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2b630 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53  )->opcode = OP_S
2b640 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20 73  orterOpen;.    s
2b650 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c  Sort.sortFlags |
2b660 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  = SORTFLAG_UseSo
2b670 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
2b680 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69  Open a virtual i
2b690 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
2b6a0 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
2b6b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
2b6c0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
2b6d0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44  stinct ){.    sD
2b6e0 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20  istinct.tabTnct 
2b6f0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2b700 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
2b710 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74  addrTnct = sqlit
2b720 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2b730 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2b740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b760 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
2b770 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
2b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b790 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
2b7a0 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  *)keyInfoFromExp
2b7b0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
2b7c0 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20  >pEList,0,0),.  
2b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
2b7f0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
2b800 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2b810 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
2b820 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73  DERED);.    sDis
2b830 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2b840 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2b850 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65  _UNORDERED;.  }e
2b860 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  lse{.    sDistin
2b870 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2b880 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
2b890 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OP;.  }..  if( !
2b8a0 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42  isAgg && pGroupB
2b8b0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  y==0 ){.    /* N
2b8c0 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
2b8d0 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f  tions and no GRO
2b8e0 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
2b8f0 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61      u16 wctrlFla
2b900 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e  gs = (sDistinct.
2b910 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57  isTnct ? WHERE_W
2b920 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30  ANT_DISTINCT : 0
2b930 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  );..    /* Begin
2b940 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2b950 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66  an. */.    pWInf
2b960 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2b970 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2b980 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2b990 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a  sSort.pOrderBy,.
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2b9c0 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46  ->pEList, wctrlF
2b9d0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66  lags, 0);.    if
2b9e0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
2b9f0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2ba00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2ba10 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e  ereOutputRowCoun
2ba20 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e  t(pWInfo) < p->n
2ba30 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20  SelectRow ){.   
2ba40 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
2ba50 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
2ba60 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
2ba70 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Info);.    }.   
2ba80 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69   if( sDistinct.i
2ba90 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33  sTnct && sqlite3
2baa0 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
2bab0 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20  pWInfo) ){.     
2bac0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2bad0 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68  Type = sqlite3Wh
2bae0 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
2baf0 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Info);.    }.   
2bb00 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
2bb10 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f  rBy ){.      sSo
2bb20 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69  rt.nOBSat = sqli
2bb30 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
2bb40 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2bb50 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
2bb60 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
2bb70 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
2bb80 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
2bb90 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
2bba0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2bbb0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
2bbc0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
2bbd0 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
2bbe0 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
2bbf0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
2bc00 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
2bc10 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
2bc20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
2bc30 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
2bc40 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
2bc50 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
2bc60 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
2bc70 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
2bc80 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
2bc90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2bca0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
2bcb0 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
2bcc0 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
2bcd0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
2bce0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
2bcf0 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63  op. */.    selec
2bd00 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
2bd10 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31  e, p, pEList, -1
2bd20 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74  , &sSort, &sDist
2bd30 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
2bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd50 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
2bd60 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66  tinueLabel(pWInf
2bd70 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
2bd80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2bd90 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
2bda0 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a  WInfo));..    /*
2bdb0 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
2bdc0 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
2bdd0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57   */.    sqlite3W
2bde0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2bdf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2be00 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20   This case when 
2be10 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72  there exist aggr
2be20 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
2be30 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  or a GROUP BY cl
2be40 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62  ause.    ** or b
2be50 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  oth */.    NameC
2be60 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
2be70 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
2be80 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
2be90 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
2bea0 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
2beb0 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
2bec0 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
2bed0 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
2bee0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
2bef0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
2bf00 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
2bf10 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
2bf20 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
2bf30 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
2bf40 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
2bf50 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
2bf60 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
2bf70 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
2bf80 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
2bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2bfa0 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
2bfb0 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
2bfc0 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
2bfd0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
2bfe0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
2bff0 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
2c000 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
2c010 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
2c020 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
2c030 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
2c040 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
2c050 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
2c060 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
2c070 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
2c080 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20  UP BY order */. 
2c090 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
2c0a0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
2c0b0 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
2c0c0 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
2c0d0 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20     int sortPTab 
2c0e0 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f  = 0;   /* Pseudo
2c0f0 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65  table used to de
2c100 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73  code sorting res
2c110 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ults */.    int 
2c120 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20  sortOut = 0;    
2c130 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74  /* Output regist
2c140 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  er from the sort
2c150 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72  er */.    int or
2c160 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a  derByGrp = 0; /*
2c170 20 54 72 75 65 20 69 66 20 74 68 65 20 47 52 4f   True if the GRO
2c180 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20  UP BY and ORDER 
2c190 42 59 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  BY are the same 
2c1a0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  */..    /* Remov
2c1b0 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c  e any and all al
2c1c0 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68  iases between th
2c1d0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
2c1e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55   the.    ** GROU
2c1f0 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  P BY clause..   
2c200 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
2c210 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
2c220 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
2c230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2c240 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2c250 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
2c260 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2c270 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
2c280 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f  g over expressio
2c290 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a  n in a list */..
2c2a0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70        for(k=p->p
2c2b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  EList->nExpr, pI
2c2c0 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  tem=p->pEList->a
2c2d0 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
2c2e0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
2c2f0 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20  tem->u.x.iAlias 
2c300 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2c310 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42     for(k=pGroupB
2c320 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  y->nExpr, pItem=
2c330 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30  pGroupBy->a; k>0
2c340 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
2c350 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
2c360 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
2c370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2c380 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
2c390 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  100 ) p->nSelect
2c3a0 52 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d  Row = 100;.    }
2c3b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
2c3c0 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20  SelectRow = 1;. 
2c3d0 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 49 66     }...    /* If
2c3e0 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
2c3f0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e   GROUP BY and an
2c400 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2c410 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20   and they are.  
2c420 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20    ** identical, 
2c430 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70  then it may be p
2c440 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62  ossible to disab
2c450 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  le the ORDER BY 
2c460 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f  clause .    ** o
2c470 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68  n the grounds th
2c480 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  at the GROUP BY 
2c490 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
2c4a0 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
2c4b0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63  .    ** in the c
2c4c0 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74  orrect order. It
2c4d0 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20   also may not - 
2c4e0 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d 61 79  the GROUP BY may
2c4f0 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
2c500 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
2c510 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
2c520 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
2c530 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
2c540 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
2c550 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
2c560 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
2c570 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
2c580 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
2c590 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
2c5a0 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
2c5b0 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
2c5c0 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
2c5d0 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
2c5e0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
2c5f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
2c600 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
2c610 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
2c620 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
2c630 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
2c640 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
2c650 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
2c660 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
2c670 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
2c680 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
2c690 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
2c6a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2c6b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
2c6c0 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
2c6d0 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
2c6e0 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
2c6f0 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
2c700 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
2c710 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
2c720 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
2c730 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
2c740 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
2c750 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
2c760 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
2c770 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
2c780 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
2c790 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
2c7a0 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
2c7b0 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41  List;.    sNC.pA
2c7c0 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e  ggInfo = &sAggIn
2c7d0 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  fo;.    sAggInfo
2c7e0 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mnReg = pParse-
2c7f0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67  >nMem+1;.    sAg
2c800 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2c810 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
2c820 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
2c830 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  r : 0;.    sAggI
2c840 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
2c850 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
2c860 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2c870 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
2c880 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
2c890 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2c8a0 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e  ist(&sNC, sSort.
2c8b0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
2c8c0 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
2c8d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2c8e0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2c8f0 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
2c900 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
2c910 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
2c920 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
2c930 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
2c940 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
2c950 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
2c960 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2c970 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66  Property(sAggInf
2c980 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2c990 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2c9a0 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
2c9b0 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67  lags |= NC_InAgg
2c9c0 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
2c9d0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2c9e0 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
2c9f0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
2ca00 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
2ca10 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2ca20 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e   &= ~NC_InAggFun
2ca30 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  c;.    }.    sAg
2ca40 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50  gInfo.mxReg = pP
2ca50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2ca60 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2ca70 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2ca80 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
2ca90 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
2caa0 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
2cab0 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
2cac0 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
2cad0 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
2cae0 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
2caf0 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
2cb00 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
2cb10 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
2cb20 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
2cb30 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
2cb40 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
2cb50 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
2cb60 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
2cb70 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20  .      int j1;  
2cb80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d             /* A-
2cb90 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
2cba0 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
2cbb0 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
2cbc0 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
2cbd0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
2cbe0 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
2cbf0 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
2cc00 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
2cc10 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
2cc20 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
2cc30 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
2cc40 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
2cc50 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
2cc60 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
2cc70 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
2cc80 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2cc90 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
2cca0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
2ccb0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
2ccc0 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
2ccd0 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
2cce0 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
2ccf0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2cd00 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2cd10 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
2cd20 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
2cd30 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
2cd40 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
2cd50 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
2cd60 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2cd70 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
2cd80 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
2cd90 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
2cda0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2cdb0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2cdc0 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
2cdd0 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
2cde0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
2cdf0 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
2ce00 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
2ce10 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
2ce20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
2ce30 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
2ce40 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
2ce50 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
2ce60 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
2ce70 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
2ce80 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
2ce90 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
2cea0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2ceb0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2cec0 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
2ced0 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
2cee0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2cef0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2cf00 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73  , pGroupBy, 0, s
2cf10 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29  AggInfo.nColumn)
2cf20 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
2cf30 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
2cf40 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2cf50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
2cf60 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2cf70 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
2cf80 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2cf90 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
2cfa0 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
2cfb0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2cfc0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
2cfd0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
2cfe0 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
2cff0 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
2d000 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
2d010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
2d020 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
2d030 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
2d040 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
2d050 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2d060 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
2d070 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2d080 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2d090 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
2d0a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2d0b0 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
2d0c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2d0d0 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
2d0e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2d0f0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2d100 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
2d110 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
2d120 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2d130 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2d140 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
2d150 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2d160 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2d170 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2d180 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
2d190 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2d1a0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2d1b0 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
2d1c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2d1d0 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
2d1e0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2d1f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d200 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2d210 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
2d220 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2d230 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
2d240 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
2d250 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
2d260 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2d270 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
2d280 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
2d290 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
2d2a0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
2d2b0 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
2d2c0 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
2d2d0 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
2d2e0 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
2d2f0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
2d300 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
2d310 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
2d320 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
2d330 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
2d340 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
2d350 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
2d360 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
2d370 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
2d380 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
2d390 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
2d3a0 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
2d3b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d3c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d3d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2d3e0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
2d3f0 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
2d400 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2d410 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2d420 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2d430 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20  pGroupBy, 0,.   
2d440 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f         WHERE_GRO
2d450 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47  UPBY | (orderByG
2d460 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42  rp ? WHERE_SORTB
2d470 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20  YGROUP : 0), 0. 
2d480 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
2d490 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
2d4a0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2d4b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2d4c0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2d4d0 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79  WInfo)==pGroupBy
2d4e0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2d4f0 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
2d500 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
2d510 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
2d520 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
2d530 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
2d540 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
2d550 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
2d560 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
2d570 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
2d580 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
2d590 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
2d5a0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
2d5b0 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
2d5c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d5d0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
2d5e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2d5f0 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
2d600 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
2d610 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
2d620 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
2d630 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
2d640 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
2d650 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
2d660 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
2d670 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
2d680 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
2d690 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
2d6a0 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
2d6b0 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
2d6c0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
2d6d0 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
2d6e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
2d6f0 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
2d700 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
2d710 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
2d720 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
2d730 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
2d740 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
2d750 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ble(pParse, .   
2d760 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69           (sDisti
2d770 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70  nct.isTnct && (p
2d780 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
2d790 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20  stinct)==0) ?.  
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7b0 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22    "DISTINCT" : "
2d7c0 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20  GROUP BY");..   
2d7d0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
2d7e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
2d7f0 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2d800 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2d810 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
2d820 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  y;.        j = n
2d830 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
2d840 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2d850 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
2d860 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2d870 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
2d880 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
2d890 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
2d8a0 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
2d8b0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
2d8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d8d0 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
2d8e0 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
2d8f0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2d900 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2d910 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2d920 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2d930 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2d940 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2d950 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
2d960 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
2d970 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2d980 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
2d990 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2d9a0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2d9b0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2d9c0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
2d9d0 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
2d9e0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
2d9f0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
2da00 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2da10 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
2da20 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
2da30 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2da40 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  r2;..           
2da50 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
2da60 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
2da70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
2da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da90 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2daa0 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
2dab0 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
2dac0 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
2dad0 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
2dae0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2daf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2db00 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
2db10 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
2db20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2db30 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
2db40 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2db50 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
2db60 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2db70 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
2db80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2db90 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
2dba0 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
2dbb0 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
2dbc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2dbd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2dbe0 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
2dbf0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2dc00 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  gIdx, regRecord)
2dc10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2dc20 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2dc30 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
2dc40 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2dc50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2dc60 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
2dc70 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ase, nCol);.    
2dc80 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2dc90 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2dca0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2dcb0 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73  rtingIdxPTab = s
2dcc0 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65  ortPTab = pParse
2dcd0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2dce0 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69    sortOut = sqli
2dcf0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2dd00 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2dd10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2dd20 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
2dd30 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72  o, sortPTab, sor
2dd40 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  tOut, nCol);.   
2dd50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2dd60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2dd70 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  terSort, sAggInf
2dd80 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2dd90 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
2dda0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2ddb0 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
2ddc0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2ddd0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  v);.        sAgg
2dde0 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
2ddf0 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
2de00 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2de10 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a  Clear(pParse);..
2de20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2de30 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f  * If the index o
2de40 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
2de50 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52  e used by the GR
2de60 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20  OUP BY sort.    
2de70 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61    ** will natura
2de80 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73  lly deliver rows
2de90 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65   in the order re
2dea0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
2deb0 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20  DER BY.      ** 
2dec0 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74  clause, cancel t
2ded0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
2dee0 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61  le open coded ea
2def0 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  rlier..      **.
2df00 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
2df10 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2df20 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61   - the correct a
2df30 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73  nswer should res
2df40 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a  ult regardless..
2df50 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65        ** Use the
2df60 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2df70 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
2df80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2df90 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20  PTIMIZER to .   
2dfa0 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
2dfb0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
2dfc0 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
2dfd0 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  oses.  */.      
2dfe0 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26  if( orderByGrp &
2dff0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2e000 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2e010 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a  _GroupByOrder) .
2e020 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70         && (group
2e030 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65  BySort || sqlite
2e040 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70  3WhereIsSorted(p
2e050 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b  WInfo)).      ){
2e060 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
2e070 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2e080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e090 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2e0a0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2e0b0 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
2e0c0 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
2e0d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2e0e0 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
2e0f0 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
2e100 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
2e110 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
2e120 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
2e130 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
2e140 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
2e150 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
2e160 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
2e170 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
2e180 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
2e190 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
2e1a0 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
2e1b0 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
2e1c0 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
2e1d0 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
2e1e0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
2e1f0 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
2e200 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2e210 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2e220 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2e230 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
2e240 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
2e250 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e260 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2e270 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41  P_SorterData, sA
2e280 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2e290 78 2c 20 73 6f 72 74 4f 75 74 2c 73 6f 72 74 50  x, sortOut,sortP
2e2a0 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
2e2b0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2e2c0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
2e2d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2e2e0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2e2f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2e300 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2e310 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50  OP_Column, sortP
2e320 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Tab, j, iBMem+j)
2e330 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2e340 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
2e350 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
2e360 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
2e370 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
2e380 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
2e390 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
2e3a0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
2e3b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2e3c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2e3d0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
2e3e0 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
2e3f0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e410 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
2e420 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
2e430 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
2e440 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a  EYINFO);.      j
2e450 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
2e460 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2e470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e480 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
2e490 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31  p, j1+1, 0, j1+1
2e4a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2e4b0 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  v);..      /* Ge
2e4c0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
2e4d0 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
2e4e0 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
2e4f0 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
2e500 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
2e510 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
2e520 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
2e530 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
2e540 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
2e550 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
2e560 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
2e570 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
2e580 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
2e590 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
2e5a0 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
2e5b0 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
2e5c0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
2e5d0 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
2e5e0 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
2e5f0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
2e600 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
2e610 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
2e620 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2e630 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
2e640 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
2e650 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
2e660 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
2e670 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e680 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
2e690 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
2e6a0 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
2e6b0 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
2e6c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e6d0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2e6e0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
2e6f0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2e700 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2e710 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
2e720 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
2e730 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e740 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
2e750 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
2e760 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
2e770 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
2e780 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
2e790 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
2e7a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e7b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2e7c0 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2e7d0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2e7e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2e7f0 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
2e800 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
2e810 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
2e820 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
2e830 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
2e840 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
2e850 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
2e860 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
2e870 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e880 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
2e890 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
2e8a0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
2e8b0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2e8c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e8d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2e8e0 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
2e8f0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2e900 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
2e910 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
2e920 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
2e930 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
2e940 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
2e950 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2e960 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2e970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e980 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
2e990 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2e9a0 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66  ngIdx, addrTopOf
2e9b0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56  Loop);.        V
2e9c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2e9d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e9e0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2e9f0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2ea00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ea10 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
2ea20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29   addrSortingIdx)
2ea30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2ea40 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
2ea50 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
2ea60 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
2ea70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ea80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2ea90 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
2eaa0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2eab0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2eac0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
2ead0 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
2eae0 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
2eaf0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
2eb00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2eb10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2eb20 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
2eb30 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
2eb40 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
2eb50 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
2eb60 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
2eb70 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2eb80 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
2eb90 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
2eba0 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
2ebb0 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
2ebc0 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
2ebd0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
2ebe0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
2ebf0 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
2ec00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
2ec10 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
2ec20 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
2ec30 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
2ec40 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
2ec50 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
2ec60 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
2ec70 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
2ec80 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
2ec90 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
2eca0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
2ecb0 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
2ecc0 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
2ecd0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
2ece0 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
2ecf0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2ed00 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2ed10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ed20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
2ed30 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
2ed40 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2ed50 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
2ed60 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2ed70 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2ed80 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2ed90 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2eda0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2edb0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2edc0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2edd0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
2ede0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2edf0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2ee00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ee10 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
2ee20 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
2ee30 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 20 56 64  OutputRow+2); Vd
2ee40 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2ee50 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2ee60 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
2ee70 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
2ee80 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
2ee90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2eea0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2eeb0 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
2eec0 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
2eed0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
2eee0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2eef0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ef00 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2ef10 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
2ef20 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
2ef30 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2ef40 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
2ef50 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2ef60 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  p, p->pEList, -1
2ef70 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20  , &sSort,.      
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef90 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
2efa0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2efb0 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
2efc0 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
2efd0 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
2efe0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2eff0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
2f000 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
2f010 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2f020 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
2f030 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
2f040 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
2f050 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2f060 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2f070 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
2f080 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
2f090 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2f0a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2f0b0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
2f0c0 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
2f0d0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
2f0e0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2f0f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f100 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2f110 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
2f120 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
2f130 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
2f140 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
2f150 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
2f160 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
2f170 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
2f180 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
2f190 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
2f1a0 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
2f1b0 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  T.      Table *p
2f1c0 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Tab;.      if( (
2f1d0 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43  pTab = isSimpleC
2f1e0 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66  ount(p, &sAggInf
2f1f0 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))!=0 ){.      
2f200 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65    /* If isSimple
2f210 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20  Count() returns 
2f220 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
2f230 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
2f240 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
2f250 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
2f260 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
2f270 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
2f280 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
2f290 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
2f2a0 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  tbl>.        **.
2f2b0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65          ** where
2f2c0 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2f2d0 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65  ture returned re
2f2e0 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c  presents table <
2f2f0 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tbl>..        **
2f300 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
2f310 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f   statement is so
2f320 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20   common that it 
2f330 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65  is optimized spe
2f340 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20  cially. The.    
2f350 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20      ** OP_Count 
2f360 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65  instruction is e
2f370 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f  xecuted either o
2f380 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62  n the intkey tab
2f390 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  le that.        
2f3a0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
2f3b0 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c  data for table <
2f3c0 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f  tbl> or on one o
2f3d0 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49  f its indexes. I
2f3e0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  t.        ** is 
2f3f0 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74  better to execut
2f400 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69  e the op on an i
2f410 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73  ndex, as indexes
2f420 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20   are almost.    
2f430 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70      ** always sp
2f440 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73  read across less
2f450 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69   pages than thei
2f460 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
2f470 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
2f480 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
2f490 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
2f4a0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
2f4b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
2f4c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
2f4d0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43      const int iC
2f4e0 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
2f4f0 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  b++;     /* Curs
2f500 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65  or to scan b-tre
2f510 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
2f520 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
2f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f540 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
2f550 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
2f560 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2f570 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nfo = 0;        
2f580 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
2f590 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e  o for scanned in
2f5a0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  dex */.        I
2f5b0 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
2f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5d0 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
2f5e0 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  x found so far *
2f5f0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
2f600 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  oot = pTab->tnum
2f610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2f620 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73  * Root page of s
2f630 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f  canned b-tree */
2f640 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
2f650 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
2f660 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
2f670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
2f680 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
2f690 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
2f6a0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
2f6b0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  );..        /* S
2f6c0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e  earch for the in
2f6d0 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65  dex that has the
2f6e0 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73   lowest scan cos
2f6f0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
2f700 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30        ** (2011-0
2f710 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20  4-15) Do not do 
2f720 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61  a full scan of a
2f730 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65  n unordered inde
2f740 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
2f750 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31        ** (2013-1
2f760 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75  0-03) Do not cou
2f770 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20 69  nt the entries i
2f780 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  n a partial inde
2f790 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
2f7a0 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63        ** In prac
2f7b0 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f  tice the KeyInfo
2f7c0 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20   structure will 
2f7d0 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20  not be used. It 
2f7e0 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20  is only .       
2f7f0 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65   ** passed to ke
2f800 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68  ep OP_OpenRead h
2f810 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  appy..        */
2f820 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61  .        if( !Ha
2f830 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70  sRowid(pTab) ) p
2f840 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72  Best = sqlite3Pr
2f850 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
2f860 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ab);.        for
2f870 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
2f880 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
2f890 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
2f8a0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
2f8b0 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
2f8c0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
2f8d0 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62  x->szIdxRow<pTab
2f8e0 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20  ->szTabRow.     
2f8f0 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70        && pIdx->p
2f900 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a  PartIdxWhere==0.
2f910 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 21             && (!
2f920 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73  pBest || pIdx->s
2f930 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73  zIdxRow<pBest->s
2f940 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20  zIdxRow).       
2f950 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2f960 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a    pBest = pIdx;.
2f970 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2f990 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( pBest ){.     
2f9a0 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65       iRoot = pBe
2f9b0 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  st->tnum;.      
2f9c0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
2f9d0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
2f9e0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42 65  ndex(pParse, pBe
2f9f0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  st);.        }..
2fa00 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2fa10 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
2fa20 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  or, execute the 
2fa30 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20  OP_Count, close 
2fa40 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20  the cursor. */. 
2fa50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2fa60 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
2fa70 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72  P_OpenRead, iCsr
2fa80 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29  , iRoot, iDb, 1)
2fa90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  ;.        if( pK
2faa0 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
2fab0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2fac0 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
2fad0 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  char *)pKeyInfo,
2fae0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2faf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fb00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fb10 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
2fb20 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  Csr, sAggInfo.aF
2fb30 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20  unc[0].iMem);.  
2fb40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fb50 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
2fb60 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  ose, iCsr);.    
2fb70 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c      explainSimpl
2fb80 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70  eCount(pParse, p
2fb90 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  Tab, pBest);.   
2fba0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
2fbb0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
2fbc0 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
2fbd0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
2fbe0 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65  Check if the que
2fbf0 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  ry is of one of 
2fc00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
2fc10 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rms:.        **.
2fc20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
2fc30 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  ECT min(x) FROM 
2fc40 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ....        **  
2fc50 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46   SELECT max(x) F
2fc60 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
2fc70 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  **.        ** If
2fc80 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b   it is, then ask
2fc90 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65   the code in whe
2fca0 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20  re.c to attempt 
2fcb0 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a  to sort results.
2fcc0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66          ** as if
2fcd0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f   there was an "O
2fce0 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f  RDER ON x" or "O
2fcf0 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20  RDER ON x DESC" 
2fd00 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20  clause. .       
2fd10 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69   ** If where.c i
2fd20 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63  s able to produc
2fd30 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64  e results sorted
2fd40 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20   in this order, 
2fd50 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
2fd60 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f  add vdbe code to
2fd70 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
2fd80 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f  e processing loo
2fd90 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20  p after the .   
2fda0 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74       ** first it
2fdb0 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74  eration (since t
2fdc0 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
2fdd0 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  on of the loop i
2fde0 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  s .        ** gu
2fdf0 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72  aranteed to oper
2fe00 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77  ate on the row w
2fe10 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  ith the minimum 
2fe20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20  or maximum .    
2fe30 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
2fe40 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20  x, the only row 
2fe50 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20  required)..     
2fe60 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2fe70 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20   A special flag 
2fe80 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74  must be passed t
2fe90 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
2fea0 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c  gin() to slightl
2feb0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  y.        ** mod
2fec0 69 66 79 20 62 65 68 61 76 69 6f 72 20 61 73 20  ify behavior as 
2fed0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20  follows:.       
2fee0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2fef0 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
2ff00 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
2ff10 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
2ff20 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
2ff30 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72       **     wher
2ff40 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69  e.c should not i
2ff50 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20  terate over any 
2ff60 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55  values with a NU
2ff70 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  LL value.       
2ff80 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20   **     for x.. 
2ff90 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2ffa0 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
2ffb0 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
2ffc0 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
2ffd0 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
2ffe0 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
2fff0 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64      index or ind
30000 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f  ices to use) sho
30010 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66  uld place a diff
30020 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f  erent priority o
30030 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  n .        **   
30040 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
30050 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
30060 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
30070 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
30080 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52          **     R
30090 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64  efer to code and
300a0 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65   comments in whe
300b0 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73  re.c for details
300c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
300d0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
300e0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
300f0 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48      u8 flag = WH
30100 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
30110 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20  AL;.        .   
30120 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
30130 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
30140 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
30150 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  lag==0 );.      
30160 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
30170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
30180 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75   flag = minMaxQu
30190 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26  ery(&sAggInfo, &
301a0 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20  pMinMax);.      
301b0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
301c0 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28  rt( flag==0 || (
301d0 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d  pMinMax!=0 && pM
301e0 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29  inMax->nExpr==1)
301f0 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
30200 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
30210 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c     pMinMax = sql
30220 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
30230 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b  db, pMinMax, 0);
30240 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20  .          pDel 
30250 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20  = pMinMax;.     
30260 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78       if( pMinMax
30270 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
30280 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
30290 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
302a0 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66  0].sortOrder = f
302b0 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag!=WHERE_ORDER
302c0 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20  BY_MIN ?1:0;.   
302d0 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
302e0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
302f0 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
30300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30310 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f    }.  .        /
30320 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
30330 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
30340 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
30350 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
30360 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
30370 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
30380 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
30390 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
303a0 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  e row.        **
303b0 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20   of output..    
303c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
303d0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
303e0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
303f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  o);.        pWIn
30400 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
30410 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
30420 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
30430 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c   pMinMax,0,flag,
30440 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
30450 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
30460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
30470 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
30480 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pDel);.        
30490 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
304a0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
304b0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
304c0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
304d0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
304e0 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d     assert( pMinM
304f0 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78  ax==0 || pMinMax
30500 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
30510 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
30520 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
30530 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20  pWInfo)>0 ){.   
30540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30550 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
30560 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 57  oto, 0, sqlite3W
30570 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
30580 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20  WInfo));.       
30590 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
305a0 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
305b0 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
305c0 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45      (flag==WHERE
305d0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69  _ORDERBY_MIN?"mi
305e0 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20  n":"max")));.   
305f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
30600 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
30610 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
30620 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
30630 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
30640 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d  ggInfo);.      }
30650 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  ..      sSort.pO
30660 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
30670 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
30680 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
30690 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
306a0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
306b0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
306c0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
306d0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d   p, p->pEList, -
306e0 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20  1, 0, 0, .      
306f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30700 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
30710 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
30720 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
30730 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
30740 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
30750 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
30760 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
30770 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
30780 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
30790 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73  y */..  if( sDis
307a0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d  tinct.eTnctType=
307b0 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
307c0 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20  UNORDERED ){.   
307d0 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
307e0 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  e(pParse, "DISTI
307f0 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NCT");.  }..  /*
30800 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
30810 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
30820 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
30830 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
30840 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
30850 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
30860 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
30870 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
30880 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
30890 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
308a0 6c 65 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74  le(pParse, sSort
308b0 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47  .nOBSat>0 ? "RIG
308c0 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52  HT PART OF ORDER
308d0 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29   BY":"ORDER BY")
308e0 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  ;.    generateSo
308f0 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
30900 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74  , &sSort, pEList
30910 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
30920 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
30930 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
30940 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
30950 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
30960 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
30970 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
30980 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
30990 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
309a0 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
309b0 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
309c0 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
309d0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
309e0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
309f0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
30a00 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
30a10 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
30a20 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
30a30 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
30a40 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
30a50 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
30a60 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
30a70 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
30a80 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
30a90 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65  ctId);..  /* Ide
30aa0 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
30ab0 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66  es if results of
30ac0 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
30ad0 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  to be output..  
30ae0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
30af0 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d  ITE_OK && pDest-
30b00 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
30b10 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
30b20 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
30b30 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
30b40 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
30b50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
30b60 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  , sAggInfo.aCol)
30b70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
30b80 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
30b90 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43  Func);.#if SELEC
30ba0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
30bb0 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
30bc0 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72  Parse,p,("end pr
30bd0 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20  ocessing\n"));. 
30be0 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
30bf0 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66  Indent--;.#endif
30c00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30c10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
30c20 45 42 55 47 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  EBUG./*.** Gener
30c30 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  ate a human-read
30c40 61 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e  able description
30c50 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63 74   of a the Select
30c60 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
30c70 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
30c80 53 65 6c 65 63 74 28 54 72 65 65 56 69 65 77 20  Select(TreeView 
30c90 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74 20 53 65  *pView, const Se
30ca0 6c 65 63 74 20 2a 70 2c 20 75 38 20 6d 6f 72 65  lect *p, u8 more
30cb0 54 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20 69 6e 74  ToFollow){.  int
30cc0 20 6e 20 3d 20 30 3b 0a 20 20 70 56 69 65 77 20   n = 0;.  pView 
30cd0 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65  = sqlite3TreeVie
30ce0 77 50 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72  wPush(pView, mor
30cf0 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 73 71  eToFollow);.  sq
30d00 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
30d10 65 28 70 56 69 65 77 2c 20 22 53 45 4c 45 43 54  e(pView, "SELECT
30d20 25 73 25 73 22 2c 0a 20 20 20 20 28 28 70 2d 3e  %s%s",.    ((p->
30d30 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
30d40 73 74 69 6e 63 74 29 20 3f 20 22 20 44 49 53 54  stinct) ? " DIST
30d50 49 4e 43 54 22 20 3a 20 22 22 29 2c 0a 20 20 20  INCT" : ""),.   
30d60 20 28 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26   ((p->selFlags &
30d70 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 3f   SF_Aggregate) ?
30d80 20 22 20 61 67 67 5f 66 6c 61 67 22 20 3a 20 22   " agg_flag" : "
30d90 22 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d  ").  );.  if( p-
30da0 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63  >pSrc && p->pSrc
30db0 2d 3e 6e 53 72 63 20 29 20 6e 2b 2b 3b 0a 20 20  ->nSrc ) n++;.  
30dc0 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
30dd0 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 47  n++;.  if( p->pG
30de0 72 6f 75 70 42 79 20 29 20 6e 2b 2b 3b 0a 20 20  roupBy ) n++;.  
30df0 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
30e00 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70   n++;.  if( p->p
30e10 4f 72 64 65 72 42 79 20 29 20 6e 2b 2b 3b 0a 20  OrderBy ) n++;. 
30e20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
30e30 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70   n++;.  if( p->p
30e40 4f 66 66 73 65 74 20 29 20 6e 2b 2b 3b 0a 20 20  Offset ) n++;.  
30e50 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
30e60 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 54 72  n++;.  sqlite3Tr
30e70 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70  eeViewExprList(p
30e80 56 69 65 77 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  View, p->pEList,
30e90 20 28 6e 2d 2d 29 3e 30 2c 20 22 72 65 73 75 6c   (n--)>0, "resul
30ea0 74 2d 73 65 74 22 29 3b 0a 20 20 69 66 28 20 70  t-set");.  if( p
30eb0 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72  ->pSrc && p->pSr
30ec0 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69  c->nSrc ){.    i
30ed0 6e 74 20 69 3b 0a 20 20 20 20 70 56 69 65 77 20  nt i;.    pView 
30ee0 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65  = sqlite3TreeVie
30ef0 77 50 75 73 68 28 70 56 69 65 77 2c 20 28 6e 2d  wPush(pView, (n-
30f00 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  -)>0);.    sqlit
30f10 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
30f20 56 69 65 77 2c 20 22 46 52 4f 4d 22 29 3b 0a 20  View, "FROM");. 
30f30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
30f40 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
30f50 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
30f60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
30f70 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
30f80 61 5b 69 5d 3b 0a 20 20 20 20 20 20 53 74 72 41  a[i];.      StrA
30f90 63 63 75 6d 20 78 3b 0a 20 20 20 20 20 20 63 68  ccum x;.      ch
30fa0 61 72 20 7a 4c 69 6e 65 5b 31 30 30 5d 3b 0a 20  ar zLine[100];. 
30fb0 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
30fc0 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 7a 4c 69  ccumInit(&x, zLi
30fd0 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ne, sizeof(zLine
30fe0 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  ), 0);.      sql
30ff0 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
31000 30 2c 20 22 7b 25 64 2c 2a 7d 22 2c 20 70 49 74  0, "{%d,*}", pIt
31010 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
31020 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
31030 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20  Database ){.    
31040 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
31050 74 66 28 26 78 2c 20 30 2c 20 22 20 25 73 2e 25  tf(&x, 0, " %s.%
31060 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  s", pItem->zData
31070 62 61 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  base, pItem->zNa
31080 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
31090 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
310a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
310b0 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
310c0 30 2c 20 22 20 25 73 22 2c 20 70 49 74 65 6d 2d  0, " %s", pItem-
310d0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
310e0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
310f0 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ->pTab ){.      
31100 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
31110 28 26 78 2c 20 30 2c 20 22 20 74 61 62 6e 61 6d  (&x, 0, " tabnam
31120 65 3d 25 51 22 2c 20 70 49 74 65 6d 2d 3e 70 54  e=%Q", pItem->pT
31130 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
31140 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
31150 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
31160 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
31170 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 28  rintf(&x, 0, " (
31180 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  AS %s)", pItem->
31190 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
311a0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
311b0 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
311c0 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LEFT ){.        
311d0 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
311e0 78 2c 20 30 2c 20 22 20 4c 45 46 54 2d 4a 4f 49  x, 0, " LEFT-JOI
311f0 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  N");.      }.   
31200 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
31210 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20  umFinish(&x);.  
31220 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
31230 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 7a  iewItem(pView, z
31240 4c 69 6e 65 2c 20 69 3c 70 2d 3e 70 53 72 63 2d  Line, i<p->pSrc-
31250 3e 6e 53 72 63 2d 31 29 3b 20 0a 20 20 20 20 20  >nSrc-1); .     
31260 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
31270 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
31280 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
31290 6c 65 63 74 28 70 56 69 65 77 2c 20 70 49 74 65  lect(pView, pIte
312a0 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  m->pSelect, 0);.
312b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
312c0 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
312d0 28 70 56 69 65 77 29 3b 0a 20 20 20 20 7d 0a 20  (pView);.    }. 
312e0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
312f0 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20  ewPop(pView);.  
31300 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  }.  if( p->pWher
31310 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
31320 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
31330 65 77 2c 20 22 57 48 45 52 45 22 2c 20 28 6e 2d  ew, "WHERE", (n-
31340 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  -)>0);.    sqlit
31350 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
31360 56 69 65 77 2c 20 70 2d 3e 70 57 68 65 72 65 2c  View, p->pWhere,
31370 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
31380 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
31390 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  w);.  }.  if( p-
313a0 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
313b0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
313c0 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20  ExprList(pView, 
313d0 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 28 6e 2d  p->pGroupBy, (n-
313e0 2d 29 3e 30 2c 20 22 47 52 4f 55 50 42 59 22 29  -)>0, "GROUPBY")
313f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
31400 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71  Having ){.    sq
31410 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
31420 6d 28 70 56 69 65 77 2c 20 22 48 41 56 49 4e 47  m(pView, "HAVING
31430 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20  ", (n--)>0);.   
31440 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31450 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70  Expr(pView, p->p
31460 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20  Having, 0);.    
31470 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
31480 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20  op(pView);.  }. 
31490 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
314a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
314b0 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28  reeViewExprList(
314c0 70 56 69 65 77 2c 20 70 2d 3e 70 4f 72 64 65 72  pView, p->pOrder
314d0 42 79 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 4f 52  By, (n--)>0, "OR
314e0 44 45 52 42 59 22 29 3b 0a 20 20 7d 0a 20 20 69  DERBY");.  }.  i
314f0 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
31500 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
31510 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22  iewItem(pView, "
31520 4c 49 4d 49 54 22 2c 20 28 6e 2d 2d 29 3e 30 29  LIMIT", (n--)>0)
31530 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
31540 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
31550 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 30 29 3b 0a   p->pLimit, 0);.
31560 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
31570 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20  iewPop(pView);. 
31580 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66   }.  if( p->pOff
31590 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  set ){.    sqlit
315a0 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28 70  e3TreeViewItem(p
315b0 56 69 65 77 2c 20 22 4f 46 46 53 45 54 22 2c 20  View, "OFFSET", 
315c0 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71  (n--)>0);.    sq
315d0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
315e0 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 4f 66 66  r(pView, p->pOff
315f0 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  set, 0);.    sql
31600 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
31610 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66  pView);.  }.  if
31620 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
31630 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
31640 4f 70 20 3d 20 22 55 4e 49 4f 4e 22 3b 0a 20 20  Op = "UNION";.  
31650 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
31660 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  ){.      case TK
31670 5f 41 4c 4c 3a 20 20 20 20 20 20 20 20 20 7a 4f  _ALL:         zO
31680 70 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  p = "UNION ALL";
31690 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
316a0 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
316b0 3a 20 20 20 7a 4f 70 20 3d 20 22 49 4e 54 45 52  :   zOp = "INTER
316c0 53 45 43 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  SECT";  break;. 
316d0 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
316e0 45 50 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  EPT:      zOp = 
316f0 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 62 72  "EXCEPT";     br
31700 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eak;.    }.    s
31710 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74  qlite3TreeViewIt
31720 65 6d 28 70 56 69 65 77 2c 20 7a 4f 70 2c 20 28  em(pView, zOp, (
31730 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c  n--)>0);.    sql
31740 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
31750 63 74 28 70 56 69 65 77 2c 20 70 2d 3e 70 50 72  ct(pView, p->pPr
31760 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ior, 0);.    sql
31770 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
31780 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 73 71  pView);.  }.  sq
31790 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
317a0 28 70 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69  (pView);.}.#endi
317b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
317c0 47 20 2a 2f 0a                                   G */.