/ Hex Artifact Content
Login

Artifact 8859ea21c0c9c66d85d840aaba75a492d8c4c844:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 28 53 29 2d 3e 7a 53 65 6c  2-2,"",(S)->zSel
02e0: 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20 20 20 20  Name,(S)),\.    
02f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0300: 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66  tf X.#else.# def
0310: 69 6e 65 20 53 45 4c 45 43 54 54 52 41 43 45 28  ine SELECTTRACE(
0320: 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64 69 66 0a  K,P,S,X).#endif.
0330: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0340: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0350: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0370: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0380: 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  ** how to proces
0390: 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  s the DISTINCT k
03a0: 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c  eyword, to simpl
03b0: 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61 74  ify passing that
03c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
03d0: 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49  into the selectI
03e0: 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69  nnerLoop() routi
03f0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
0400: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0410: 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73  x DistinctCtx;.s
0420: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0430: 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b  x {.  u8 isTnct;
0440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0450: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0460: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0470: 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79   */.  u8 eTnctTy
0480: 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  pe;   /* One of 
0490: 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  the WHERE_DISTIN
04a0: 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a  CT_* operators *
04b0: 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b  /.  int tabTnct;
04c0: 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c      /* Ephemeral
04d0: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
04e0: 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
04f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ing */.  int add
0500: 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72  rTnct;   /* Addr
0510: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
0520: 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66  hemeral opcode f
0530: 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b  or tabTnct */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0550: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0560: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0570: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0580: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0590: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
05a0: 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
05b0: 61 75 73 65 20 6f 66 20 71 75 65 72 79 20 69 73  ause of query is
05c0: 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f   being coded..*/
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 53 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b  SortCtx SortCtx;
05f0: 0a 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20  .struct SortCtx 
0600: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
0610: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
0620: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
0630: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a  OUP BY clause) *
0640: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20  /.  int nOBSat; 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0660: 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
0670: 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
0680: 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  by indices */.  
0690: 69 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20  int iECursor;   
06a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
06b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73  number for the s
06c0: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  orter */.  int r
06d0: 65 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20  egReturn;       
06e0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
06f0: 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75  ding block-outpu
0700: 74 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  t return address
0710: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42   */.  int labelB
0720: 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  kOut;       /* S
0730: 74 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74  tart label for t
0740: 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  he block-output 
0750: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
0760: 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
0770: 78 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  x;    /* Address
0780: 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65   of the OP_Sorte
0790: 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e  rOpen or OP_Open
07a0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75  Ephemeral */.  u
07b0: 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20  8 sortFlags;    
07c0: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
07d0: 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20  more SORTFLAG_* 
07e0: 62 69 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  bits */.};.#defi
07f0: 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  ne SORTFLAG_UseS
0800: 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a  orter  0x01   /*
0810: 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20   Use SorterOpen 
0820: 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45  instead of OpenE
0830: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a  phemeral */../*.
0840: 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68  ** Delete all th
0850: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53  e content of a S
0860: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e  elect structure.
0870: 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Deallocate the
0880: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
0890: 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72  self only if bFr
08a0: 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ee is true..*/.s
08b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
08c0: 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Select(sqlite3 *
08d0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
08e0: 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69  nt bFree){.  whi
08f0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c  le( p ){.    Sel
0900: 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
0910: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c  >pPrior;.    sql
0920: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
0930: 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  te(db, p->pEList
0940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  );.    sqlite3Sr
0950: 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
0960: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71  p->pSrc);.    sq
0970: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0980: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  db, p->pWhere);.
0990: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
09a0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
09b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
09c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
09d0: 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  e(db, p->pHaving
09e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
09f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0a00: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
0a10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a20: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
0a30: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
0a40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0a50: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
0a60: 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
0a70: 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  e(db, p->pWith);
0a80: 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
0a90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0aa0: 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  b, p);.    p = p
0ab0: 50 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65  Prior;.    bFree
0ac0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
0ad0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0ae0: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0af0: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0b00: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0b10: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0b20: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0b30: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0b40: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
0b50: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
0b60: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
0b70: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
0b80: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
0b90: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
0ba0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0bb0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0bc0: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0bd0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0be0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0bf0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0c00: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0c10: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0c20: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0c30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0c40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0c50: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
0c60: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
0c70: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
0c80: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
0c90: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
0ca0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0cb0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0cc0: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0cd0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0ce0: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0cf0: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0d00: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0d10: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0d20: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0d30: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0d40: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
0d60: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
0d70: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0d80: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
0d90: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
0da0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0db0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0dc0: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0dd0: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0df0: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0e00: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0e10: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0e20: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0e30: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0e40: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
0e50: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
0e60: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
0e70: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
0e80: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
0e90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0ea0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0eb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0ec0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ed0: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0ee0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0ef0: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0f00: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0f10: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0f20: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0f30: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0f40: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
0f50: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0f60: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
0f70: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
0f80: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
0f90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
0fa0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0fb0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0fc0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0fd0: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0fe0: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0ff0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
1000: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
1010: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1020: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1030: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1040: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
1050: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
1060: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
1070: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
1080: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
1090: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
10a0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
10b0: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
10c0: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
10d0: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
10e0: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
10f0: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
1100: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
1110: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1120: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
1130: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
1140: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
1150: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
1160: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1170: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1180: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1190: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [1] = -1;.  if( 
11a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11b0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
11c0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 2c 20 70  lect(db, pNew, p
11d0: 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a  New!=&standin);.
11e0: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
11f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1200: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
1210: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1220: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
1230: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
1240: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
1250: 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45  New;.}..#if SELE
1260: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1270: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
1280: 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f  me of a Select o
1290: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
12a0: 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
12b0: 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f  me(Select *p, co
12c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
12d0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61  {.  if( p && zNa
12e0: 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  me ){.    sqlite
12f0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1300: 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20  f(p->zSelName), 
1310: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73  p->zSelName, "%s
1320: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  ", zName);.  }.}
1330: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1340: 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e  Delete the given
1350: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
1360: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
1370: 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a   substructures..
1380: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1390: 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69  electDelete(sqli
13a0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
13b0: 2a 70 29 7b 0a 20 20 63 6c 65 61 72 53 65 6c 65  *p){.  clearSele
13c0: 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a  ct(db, p, 1);.}.
13d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
13e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  pointer to the r
13f0: 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
1400: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 61 20   statement in a 
1410: 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  compound..*/.sta
1420: 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69 6e 64  tic Select *find
1430: 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65 63 74  Rightmost(Select
1440: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
1450: 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20 70 2d  ->pNext ) p = p-
1460: 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  >pNext;.  return
1470: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
1480: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
1490: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
14a0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
14b0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
14c0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
14d0: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
14e0: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
14f0: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
1500: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
1510: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
1520: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
1530: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
1540: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
1550: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
1560: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
1570: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
1580: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
1590: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
15a0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
15b0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
15c0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
15d0: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
15e0: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
15f0: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
1600: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
1610: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
1620: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
1630: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
1640: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
1650: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
1660: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
1670: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1680: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
1690: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
16a0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
16b0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
16c0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
16d0: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
1700: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
1710: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
1720: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1730: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
1740: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
1750: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
1760: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1770: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
1780: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
1790: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
17a0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
17b0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
17c0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
17d0: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
17e0: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
17f0: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1800: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1810: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1820: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1830: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1840: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1850: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1860: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
1870: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
1880: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
1890: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
18a0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
18b0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
18e0: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
18f0: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1900: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1910: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1920: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1930: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1940: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1950: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1960: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
1970: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1980: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
1990: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
19a0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
19b0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
19c0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
19d0: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
19e0: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
19f0: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1a00: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1a10: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1a20: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1a30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1a40: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1a50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1a60: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
1a70: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
1a80: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1a90: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
1aa0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
1ab0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
1ac0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1ad0: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1ae0: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1af0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b10: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1b20: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1b30: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1b40: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1b50: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1b60: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1b70: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
1b80: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
1b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ba0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
1bb0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
1bc0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1bd0: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1be0: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1bf0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1c00: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1c10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c20: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1c30: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1c40: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1c50: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1c60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c70: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
1c80: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1c90: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
1ca0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
1cb0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
1cc0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1cd0: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1ce0: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1cf0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1d00: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1d10: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1d20: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1d30: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1d40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d50: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1d60: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
1d70: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
1d80: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
1d90: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
1da0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
1db0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
1dc0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1dd0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1de0: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1df0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1e00: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1e10: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1e20: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e40: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1e50: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1e60: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
1e70: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1e80: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
1e90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1ea0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
1eb0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
1ec0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1ed0: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1ee0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1ef0: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1f00: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1f10: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1f20: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1f30: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1f40: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1f50: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1f60: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
1f70: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
1f80: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
1f90: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
1fa0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
1fb0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
1fc0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1fd0: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1fe0: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1ff0: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
2000: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
2010: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
2020: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2030: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
2040: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
2050: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
2060: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2070: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
2080: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
2090: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
20a0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
20b0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
20c0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
20d0: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
20e0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
20f0: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
2100: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
2110: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
2120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2130: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
2140: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
2150: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
2160: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
2180: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
2190: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
21a0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
21b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
21c0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
21d0: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
21e0: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
21f0: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
2200: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
2210: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
2220: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
2230: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
2240: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
2250: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
2260: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
2270: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
2280: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
2290: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
22a0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
22b0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
22c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
22d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
22f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2300: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
2310: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
2320: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
2330: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
2340: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
2350: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2360: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
2370: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
2380: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
2390: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
23a0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
23b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
23c0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
23d0: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
23e0: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
23f0: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
2400: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
2410: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
2420: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
2430: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
2440: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
2450: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
2460: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
2470: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
2480: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
2490: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
24a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
24b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
24c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24d0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
2500: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
2510: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
2520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2530: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2540: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
2550: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
2560: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
2570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2580: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2590: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
25a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
25b0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
25c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25d0: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
25e0: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
25f0: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2620: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
2630: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
2640: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
2650: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2660: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
2670: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
2680: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
26b0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
26c0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
26d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
26e0: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
26f0: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
2700: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
2710: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
2720: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
2730: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
2740: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
2750: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
2760: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
2770: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
2780: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
2790: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
27a0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
27b0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
27c0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
27d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
27e0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
27f0: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2800: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2810: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2820: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2830: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2840: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2850: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2860: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2870: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2880: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2890: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
28a0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
28b0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
28c0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
28d0: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
28e0: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
28f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2900: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2910: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2920: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2930: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2940: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2950: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2960: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
2970: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
2980: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
2990: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
29a0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
29b0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
29c0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
29d0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
29e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
29f0: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2a00: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2a10: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2a20: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2a30: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2a40: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2a50: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2a60: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
2a70: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
2a80: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
2a90: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2aa0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
2ab0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
2ac0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2ad0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2ae0: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2af0: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2b00: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2b10: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2b20: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2b30: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2b40: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2b50: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2b60: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2b70: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
2b80: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2b90: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
2ba0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
2bb0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
2bc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2bd0: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2be0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2bf0: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2c00: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2c10: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2c20: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2c30: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2c40: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2c50: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2c60: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
2c70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2c80: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
2c90: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
2ca0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
2cb0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
2cc0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2cd0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2ce0: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2cf0: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2d00: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2d10: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2d20: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2d30: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2d40: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2d50: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2d60: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
2d70: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
2d80: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
2d90: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
2da0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
2db0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
2dc0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2dd0: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2de0: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2df0: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2e00: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2e10: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2e20: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2e30: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2e40: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2e50: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2e60: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2e70: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2e80: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
2e90: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2ea0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
2eb0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2ec0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2ed0: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2ee0: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2ef0: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2f00: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2f10: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2f20: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2f40: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2f50: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2f60: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
2f70: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
2f80: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2f90: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
2fa0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
2fb0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2fc0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2fd0: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2fe0: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2ff0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
3000: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
3010: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
3020: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
3030: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
3040: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
3050: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
3060: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
3070: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
3080: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
3090: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
30a0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
30b0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
30c0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
30d0: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
30e0: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
30f0: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
3100: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
3110: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
3120: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
3130: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
3140: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
3150: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
3160: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
3170: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
3180: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
3190: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
31a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
31b0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
31c0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
31d0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
31e0: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
31f0: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
3200: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
3210: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
3240: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3250: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
3260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3270: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
3280: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
3290: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32a0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
32b0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
32c0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
32d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32e0: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
32f0: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
3300: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
3310: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
3320: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
3330: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
3340: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
3350: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
3360: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
3370: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
3380: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
3390: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
33a0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
33b0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
33c0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
33d0: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
33e0: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
33f0: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
3400: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
3410: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
3420: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
3430: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3440: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3450: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3460: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3470: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3480: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3490: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
34a0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
34b0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
34c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
34d0: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
34e0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
34f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
3500: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
3510: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
3520: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3530: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
3540: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
3550: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
3560: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
3570: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
3580: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
3590: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
35a0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
35b0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
35c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
35d0: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
35e0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
35f0: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
3600: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3610: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
3620: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
3630: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3640: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
3650: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
3660: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
3670: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
3680: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
3690: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
36a0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
36b0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
36c0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
36d0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
36e0: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
36f0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3700: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3710: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
3720: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3740: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3750: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3760: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3770: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
3780: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
3790: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
37a0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
37b0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
37c0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
37d0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
37e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
37f0: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3800: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3810: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3820: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3830: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3840: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3850: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3860: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
3870: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
3880: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
3890: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
38a0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
38b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
38c0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
38d0: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
38e0: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
38f0: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3900: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3910: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3920: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3930: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3940: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3950: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3960: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
3970: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
3980: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
3990: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
39a0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
39b0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
39c0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
39d0: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
39e0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
39f0: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3a00: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3a10: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3a20: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3a30: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3a40: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3a50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3a60: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
3a70: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
3a80: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
3a90: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
3aa0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
3ab0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
3ac0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3ad0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3ae0: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3af0: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3b00: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3b10: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3b20: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3b30: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3b40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3b50: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3b70: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
3b80: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
3b90: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
3ba0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
3bb0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3bc0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3bd0: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3be0: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3bf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3c00: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3c10: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3c20: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3c30: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3c40: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3c50: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3c60: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
3c70: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
3c80: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
3c90: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
3ca0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
3cb0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
3cc0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3cd0: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3ce0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3cf0: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3d00: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3d10: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3d20: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3d30: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3d40: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3d60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3d70: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
3d80: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
3d90: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
3da0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
3db0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
3dc0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3dd0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3de0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3df0: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3e00: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3e10: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3e20: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3e50: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3e60: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3e70: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
3e80: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3e90: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
3ea0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
3eb0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
3ec0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3ed0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3ee0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
3ef0: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
3f00: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
3f10: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
3f20: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
3f30: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
3f40: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
3f50: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
3f60: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
3f70: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
3f80: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
3f90: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
3fa0: 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a  he end */.);../*
3fb0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
3fc0: 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  e that will push
3fd0: 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 72   the record in r
3fe0: 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74 61  egisters regData
3ff0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67 44  .** through regD
4000: 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f  ata+nData-1 onto
4010: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
4020: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
4030: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
4040: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4050: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
4060: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74  ontext */.  Sort
4070: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
4080: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
4090: 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45  n about the ORDE
40a0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
40b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
40c0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
40d0: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
40e0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
40f0: 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  egData,         
4100: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4110: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4120: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
4130: 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  .  int nData,   
4140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4150: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4160: 69 6e 20 74 68 65 20 64 61 74 61 20 61 72 72 61  in the data arra
4170: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  y */.  int nPref
4180: 69 78 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a  ixReg         /*
4190: 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69 6f   No. of reg prio
41a0: 72 20 74 6f 20 72 65 67 44 61 74 61 20 61 76 61  r to regData ava
41b0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a  ilable for use *
41c0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
41d0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74 20          /* Stmt 
4200: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4210: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71  on */.  int bSeq
4220: 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74   = ((pSort->sort
4230: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
4240: 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b  _UseSorter)==0);
4250: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70  .  int nExpr = p
4260: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
4270: 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
4280: 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52      /* No. of OR
4290: 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
42a0: 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45    int nBase = nE
42b0: 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44 61  xpr + bSeq + nDa
42c0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
42d0: 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20     /* Fields in 
42e0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
42f0: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72 20      /* Regs for 
4330: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
4340: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
4350: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4360: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4370: 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64      /* Assembled
4380: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4390: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d  /.  int nOBSat =
43a0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20   pSort->nOBSat; 
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
43d0: 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a   terms to skip *
43e0: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
4410: 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20 72   to add sorter r
4420: 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72 20  ecord to sorter 
4430: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53  */..  assert( bS
4440: 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31  eq==0 || bSeq==1
4450: 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69   );.  if( nPrefi
4460: 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65  xReg ){.    asse
4470: 72 74 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  rt( nPrefixReg==
4480: 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20  nExpr+bSeq );.  
4490: 20 20 72 65 67 42 61 73 65 20 3d 20 72 65 67 44    regBase = regD
44a0: 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53  ata - nExpr - bS
44b0: 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eq;.  }else{.   
44c0: 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
44d0: 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
44e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
44f0: 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20 73 71   nBase;.  }.  sq
4500: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
4510: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
4520: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72  ort->pOrderBy, r
4530: 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 45  egBase, SQLITE_E
4540: 43 45 4c 5f 44 55 50 29 3b 0a 20 20 69 66 28 20  CEL_DUP);.  if( 
4550: 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69  bSeq ){.    sqli
4560: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4570: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
4580: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4590: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
45a0: 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78   }.  if( nPrefix
45b0: 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Reg==0 ){.    sq
45c0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
45d0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74  e(pParse, regDat
45e0: 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  a, regBase+nExpr
45f0: 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20  +bSeq, nData);. 
4600: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62   }..  sqlite3Vdb
4610: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4620: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
4630: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
4640: 6e 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f 72  nOBSat, regRecor
4650: 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61 74  d);.  if( nOBSat
4660: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  >0 ){.    int re
4670: 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54  gPrevKey;   /* T
4680: 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20  he first nOBSat 
4690: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70  columns of the p
46a0: 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20  revious row */. 
46b0: 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74     int addrFirst
46c0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
46d0: 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20  of the OP_IfNot 
46e0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e  opcode */.    in
46f0: 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20  t addrJmp;      
4700: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
4710: 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65  e OP_Jump opcode
4720: 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   */.    VdbeOp *
4730: 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63  pOp;      /* Opc
4740: 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74  ode that opens t
4750: 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
4760: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20   int nKey;      
4770: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4780: 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75  sorting key colu
4790: 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f  mns, including O
47a0: 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  P_Sequence */.  
47b0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20    KeyInfo *pKI; 
47c0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
47d0: 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73  KeyInfo on the s
47e0: 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a  orter table */..
47f0: 20 20 20 20 72 65 67 50 72 65 76 4b 65 79 20 3d      regPrevKey =
4800: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
4810: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4820: 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  m += pSort->nOBS
4830: 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e  at;.    nKey = n
4840: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f  Expr - pSort->nO
4850: 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20 20  BSat + bSeq;.   
4860: 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20   if( bSeq ){.   
4870: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
4880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4890: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
48a0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20  gBase+nExpr); . 
48b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
48c0: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
48d0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
48e0: 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74   OP_SequenceTest
48f0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
4900: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64  r);.    }.    Vd
4910: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4930: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
4940: 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20  re, regPrevKey, 
4950: 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e  regBase, pSort->
4960: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f 70  nOBSat);.    pOp
4970: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4980: 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64  tOp(v, pSort->ad
4990: 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
49a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
49b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
49c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70   return;.    pOp
49d0: 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44  ->p2 = nKey + nD
49e0: 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70  ata;.    pKI = p
49f0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
4a00: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d  .    memset(pKI-
4a10: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  >aSortOrder, 0, 
4a20: 70 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a  pKI->nField); /*
4a30: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62   Makes OP_Jump b
4a40: 65 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f  elow testable */
4a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4a60: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
4a70: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
4a80: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
4a90: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 58 46 69  tcase( pKI->nXFi
4aa0: 65 6c 64 3e 32 20 29 3b 0a 20 20 20 20 70 4f 70  eld>2 );.    pOp
4ab0: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20  ->p4.pKeyInfo = 
4ac0: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
4ad0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
4ae0: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42  t->pOrderBy, nOB
4af0: 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Sat,.           
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 2d 31 29 3b  pKI->nXField-1);
4b30: 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73  .    addrJmp = s
4b40: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
4b50: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
4b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4b70: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
4b80: 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d  Jmp+1, 0, addrJm
4b90: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
4ba0: 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  ge(v);.    pSort
4bb0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73  ->labelBkOut = s
4bc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4bd0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72  bel(v);.    pSor
4be0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  t->regReturn = +
4bf0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
4c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c10: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
4c20: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
4c30: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
4c40: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
4c50: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4c60: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
4c70: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4c80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4c90: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
4ca0: 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71  drFirst);.    sq
4cb0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
4cc0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
4cd0: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70  e, regPrevKey, p
4ce0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20  Sort->nOBSat);. 
4cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4d00: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d  mpHere(v, addrJm
4d10: 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  p);.  }.  if( pS
4d20: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
4d30: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
4d40: 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ter ){.    op = 
4d50: 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b  OP_SorterInsert;
4d60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
4d70: 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b   = OP_IdxInsert;
4d80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4d90: 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
4da0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
4db0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69   regRecord);.  i
4dc0: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  f( pSelect->iLim
4dd0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
4de0: 64 72 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d  dr;.    int iLim
4df0: 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  it;.    if( pSel
4e00: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ect->iOffset ){.
4e10: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
4e20: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
4e30: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
4e40: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
4e50: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  lect->iLimit;.  
4e60: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
4e70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4e80: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f  (v, OP_IfNotZero
4e90: 2c 20 69 4c 69 6d 69 74 2c 20 30 2c 20 2d 31 29  , iLimit, 0, -1)
4ea0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4eb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ec0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c  beAddOp1(v, OP_L
4ed0: 61 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ast, pSort->iECu
4ee0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4ef0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4f00: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74  OP_Delete, pSort
4f10: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4f20: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4f30: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
4f40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
4f50: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
4f60: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
4f70: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
4f80: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
4f90: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
4fa0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
4fb0: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
4fc0: 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20  nt iOffset,     
4fd0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
4fe0: 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20  ding the offset 
4ff0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5000: 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f   iContinue     /
5010: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
5020: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
5030: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
5040: 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a  f( iOffset>0 ){.
5050: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
5060: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
5070: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5080: 5f 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c  _IfNeg, iOffset,
5090: 20 30 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76   0, -1); VdbeCov
50a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
50b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
50c0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
50d0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
50e0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
50f0: 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f  skip OFFSET reco
5100: 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  rds"));.    sqli
5110: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5120: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
5130: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
5140: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
5150: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
5160: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
5170: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
5180: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
5190: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
51a0: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
51b0: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
51c0: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
51d0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
51e0: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
51f0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
5200: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
5210: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
5220: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
5230: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
5240: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
5250: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
5260: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
5270: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
5280: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
5290: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
52a0: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
52b0: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
52c0: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
52d0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
52e0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
52f0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5300: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
5310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
5320: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
5330: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
5340: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
5350: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
5360: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
5370: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
5380: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
5390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
53a0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
53b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
53c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
53d0: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
53e0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
53f0: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
5400: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
5410: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5420: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
5430: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5440: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
5450: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
5460: 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62  t, iMem, N); Vdb
5470: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5490: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
54a0: 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29  rd, iMem, N, r1)
54b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
54c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
54d0: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29  nsert, iTab, r1)
54e0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
54f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5500: 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  , r1);.}..#ifnde
5510: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
5520: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
5530: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
5540: 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45  essage when a SE
5550: 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74  LECT is used wit
5560: 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73  hin a subexpress
5570: 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a  ion.** (example:
5580: 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20    "a IN (SELECT 
5590: 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20  * FROM table)") 
55a0: 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20  but it has more 
55b0: 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a  than 1 result.**
55c0: 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20   column.  We do 
55d0: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
55e0: 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65  tine because the
55f0: 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f   error used to o
5600: 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69  ccur.** in multi
5610: 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68  ple places.  (Th
5620: 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63  e error only occ
5630: 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65  urs in one place
5640: 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20   now, but we.** 
5650: 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f  retain the subro
5660: 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a  utine to minimiz
5670: 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f  e code disruptio
5680: 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  n.).*/.static in
5690: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
56a0: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
56b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
56c0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
56d0: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
56e0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
56f0: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
5700: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
5710: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
5720: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
5730: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
5740: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
5750: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
5760: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
5770: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
5780: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
5790: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
57a0: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
57b0: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
57c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
57d0: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
57e0: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
57f0: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
5800: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
5810: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
5820: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
5830: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5840: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5850: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
5860: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5870: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
5880: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
5890: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
58a0: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
58b0: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
58c0: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
58d0: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
58e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
58f0: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
5900: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
5910: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
5920: 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20  row.  If srcTab 
5930: 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f  is.** zero or mo
5940: 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73  re, then data is
5950: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
5960: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
5970: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
5980: 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f  to get number co
5990: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61  lumns and the da
59a0: 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20  tatype for each 
59b0: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
59c0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
59d0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
59e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
59f0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5a00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
5a10: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
5a20: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
5a30: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
5a40: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
5a50: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
5a60: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
5a70: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
5a80: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
5a90: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
5aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5ab0: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
5ac0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
5ad0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
5ae0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
5af0: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
5b00: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f  how to process O
5b10: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73  RDER BY */.  Dis
5b20: 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69  tinctCtx *pDisti
5b30: 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  nct, /* If not N
5b40: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
5b50: 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54   to process DIST
5b60: 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74  INCT */.  Select
5b70: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
5b80: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
5b90: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
5ba0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
5bb0: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
5bc0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
5bd0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
5be0: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
5bf0: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
5c00: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5c10: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
5c20: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
5c30: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5c40: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5c50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5c60: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
5c70: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5c80: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
5c90: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
5ca0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
5cb0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5cc0: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
5cd0: 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  ry holding resul
5ce0: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65  t set */.  int e
5cf0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
5d00: 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f  est;   /* How to
5d10: 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75   dispose of resu
5d20: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
5d30: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
5d40: 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72  arm; /* First ar
5d50: 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73  gument to dispos
5d60: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
5d70: 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20  nt nResultCol;  
5d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5d90: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
5da0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
5db0: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20  nPrefixReg = 0; 
5dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5dd0: 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
5de0: 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52  ters before regR
5df0: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esult */..  asse
5e00: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
5e10: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
5e20: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
5e30: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
5e40: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
5e50: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
5e60: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
5e70: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
5e80: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
5e90: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
5ea0: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
5eb0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
5ec0: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
5ed0: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
5ee0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
5ef0: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
5f00: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
5f10: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
5f20: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
5f30: 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ultCol = pEList-
5f40: 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
5f50: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
5f60: 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  {.    if( pSort 
5f70: 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78  ){.      nPrefix
5f80: 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  Reg = pSort->pOr
5f90: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
5fa0: 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d      if( !(pSort-
5fb0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
5fc0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
5fd0: 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b   ) nPrefixReg++;
5fe0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
5ff0: 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65  Mem += nPrefixRe
6000: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65  g;.    }.    pDe
6010: 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72  st->iSdst = pPar
6020: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6030: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6040: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
6050: 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69  lse if( pDest->i
6060: 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20  Sdst+nResultCol 
6070: 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  > pParse->nMem )
6080: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
6090: 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74   an error condit
60a0: 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73  ion that can res
60b0: 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ult, for example
60c0: 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a  , when a SELECT.
60d0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69      ** on the ri
60e0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
60f0: 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61   an INSERT conta
6100: 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20  ins more result 
6110: 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20  columns than.   
6120: 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f   ** there are co
6130: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
6140: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20  le on the left. 
6150: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
6160: 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a  be caught.    **
6170: 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
6180: 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ter.  But we nee
6190: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65  d to make sure e
61a0: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20  nough memory is 
61b0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
61c0: 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20   to avoid other 
61d0: 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20  spurious errors 
61e0: 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e  in the meantime.
61f0: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
6200: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
6210: 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d  ol;.  }.  pDest-
6220: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
6230: 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74  Col;.  regResult
6240: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
6250: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
6260: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6270: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6280: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6290: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
62a0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
62b0: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
62c0: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
62d0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
62e0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
62f0: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
6300: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
6310: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
6320: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
6330: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
6340: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
6350: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
6360: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
6370: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
6380: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
6390: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
63a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
63b0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
63c0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
63d0: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
63e0: 20 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d 53         (eDest==S
63f0: 52 54 5f 4f 75 74 70 75 74 7c 7c 65 44 65 73 74  RT_Output||eDest
6400: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29  ==SRT_Coroutine)
6410: 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50  ?SQLITE_ECEL_DUP
6420: 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  :0);.  }..  /* I
6430: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
6440: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
6450: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
6460: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
6470: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
6480: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
6490: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
64a0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
64b0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
64c0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
64d0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
64e0: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
64f0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
6500: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
6510: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
6520: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
6530: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
6540: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
6550: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
6560: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
6570: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
6580: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
6590: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
65a0: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
65b0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
65c0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
65d0: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
65e0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
65f0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
6600: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
6610: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
6620: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
6630: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
6640: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6650: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
6660: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
6670: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
6680: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
6690: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
66a0: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
66b0: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
66c0: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
66d0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
66e0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
66f0: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
6700: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
6710: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
6720: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
6730: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
6740: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
6750: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
6760: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
6770: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
6780: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
6790: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
67a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
67b0: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
67c0: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
67d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
67e0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
67f0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
6800: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
6810: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
6820: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
6830: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
6840: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
6850: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
6860: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
6870: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6880: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
6890: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
68a0: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
68b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
68c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
68d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
68e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
68f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6900: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6910: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
6920: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
6930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6940: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
6950: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
6960: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
6970: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
6980: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
6990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
69a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
69b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
69c0: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
69d0: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
69e0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
69f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6a00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
6a10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6a20: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
6a30: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
6a40: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
6a50: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
6a60: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6a70: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
6a80: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
6a90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6ab0: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
6ac0: 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  p || pParse->db-
6ad0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6ae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6af0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6b00: 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74  _Copy, regResult
6b10: 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75  , regPrev, nResu
6b20: 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ltCol-1);.      
6b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6b40: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  ..      case WHE
6b50: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
6b60: 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
6b70: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
6b80: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
6b90: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
6ba0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6bb0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
6bc0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
6bd0: 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63  assert( pDistinc
6be0: 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  t->eTnctType==WH
6bf0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
6c00: 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20  RDERED );.      
6c10: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
6c20: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
6c30: 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74  ->tabTnct, iCont
6c40: 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  inue, nResultCol
6c50: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
6c60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6c70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6c80: 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20  f( pSort==0 ){. 
6c90: 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28       codeOffset(
6ca0: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
6cb0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
6cc0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
6cd0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
6ce0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
6cf0: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
6d00: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
6d10: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
6d20: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
6d30: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
6d40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6d50: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
6d60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
6d70: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
6d80: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
6d90: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6da0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
6db0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6dc0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
6dd0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
6de0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b  nResultCol, r1);
6df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6e00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6e10: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
6e20: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
6e30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
6e40: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
6e50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6e60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
6e70: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
6e80: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
6e90: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
6ea0: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
6eb0: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
6ec0: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
6ed0: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
6ee0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
6ef0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
6f00: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
6f10: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
6f20: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
6f30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6f40: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
6f50: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
6f60: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
6f70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6f80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6f90: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
6fa0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
6fb0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
6fc0: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
6fd0: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
6fe0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
6ff0: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
7000: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
7010: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
7020: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
7030: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
7040: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7050: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
7060: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
7070: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
7080: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7090: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
70a0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
70b0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
70c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
70d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
70e0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
70f0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7100: 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  l, r1+nPrefixReg
7110: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
7120: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20  E_OMIT_CTE.     
7130: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
7140: 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20  DistFifo ){.    
7150: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
7160: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
7170: 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73  tFifo, then curs
7180: 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20  or (iParm+1) is 
7190: 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
71a0: 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  on an ephemeral 
71b0: 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75  index. If the cu
71c0: 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72  rrent row is alr
71d0: 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20  eady present.   
71e0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
71f0: 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69  ndex, do not wri
7200: 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74  te it to the out
7210: 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64  put. If not, add
7220: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7230: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74  current row to t
7240: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f  he index and pro
7250: 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e  ceed with writin
7260: 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20  g it to the.    
7270: 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61      ** output ta
7280: 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f  ble as well.  */
7290: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
72a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
72b0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
72c0: 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  4;.        sqlit
72d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
72e0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
72f0: 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20  rm+1, addr, r1, 
7300: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
7310: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
7320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7330: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
7340: 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20  iParm+1, r1);.  
7350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
7360: 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ort==0 );.      
7370: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
7380: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
7390: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
73a0: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
73b0: 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52  , p, r1+nPrefixR
73c0: 65 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  eg, 1, nPrefixRe
73d0: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
73e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
73f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7400: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7420: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
7430: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
7440: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7450: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7460: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
7470: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
7480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7490: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
74a0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
74b0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
74c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
74d0: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
74e0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
74f0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
7500: 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65  e, r1, nPrefixRe
7510: 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  g+1);.      brea
7520: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
7530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7540: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
7550: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
7560: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
7570: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
7580: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
7590: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
75a0: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
75b0: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
75c0: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
75d0: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
75e0: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
75f0: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
7600: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
7610: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
7620: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
7630: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
7640: 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
7650: 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  st =.           
7660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
7670: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
7680: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7690: 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
76a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
76b0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rt ){.        /*
76c0: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
76d0: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
76e0: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
76f0: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
7700: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
7710: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
7720: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
7730: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
7740: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
7750: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
7760: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
7770: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
7780: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
7790: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
77a0: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
77b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
77c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
77d0: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
77e0: 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66  Result, 1, nPref
77f0: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
7800: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
7810: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
7820: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
7830: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7840: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
7850: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7860: 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44  Result,1,r1, &pD
7870: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
7880: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7890: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
78a0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
78b0: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
78c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
78d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
78e0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
78f0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
7900: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7910: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
7920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7930: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7940: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
7950: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
7960: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
7970: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
7980: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
7990: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
79a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
79b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
79c0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
79d0: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
79e0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
79f0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
7a00: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7a10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7a20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
7a30: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
7a40: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
7a50: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
7a60: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
7a70: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
7a80: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
7a90: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
7aa0: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
7ab0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
7ac0: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
7ad0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
7ae0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
7af0: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31  t( nResultCol==1
7b00: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7b10: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7b20: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7b30: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7b40: 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50  regResult, 1, nP
7b50: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
7b60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b70: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
7b80: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
7b90: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
7ba0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
7bb0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
7bc0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
7bd0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7be0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
7bf0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
7c00: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
7c10: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
7c20: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
7c30: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
7c40: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
7c50: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
7c60: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
7c70: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
7c80: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
7c90: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7ca0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
7cb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7cc0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7cd0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7ce0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7cf0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7d00: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7d10: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7d20: 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65  ltCol, nPrefixRe
7d30: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
7d40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
7d50: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
7d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7d70: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
7d80: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
7d90: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
7da0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7db0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7dc0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
7dd0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7de0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
7df0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
7e00: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
7e10: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  e, regResult, nR
7e20: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
7e30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7e40: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
7e50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
7e60: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
7e70: 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70  results into a p
7e80: 72 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68  riority queue th
7e90: 61 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f  at is order acco
7ea0: 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20  rding to.    ** 
7eb0: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20  pDest->pOrderBy 
7ec0: 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74  (in pSO).  pDest
7ed0: 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50  ->iSDParm (in iP
7ee0: 61 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73  arm) is the curs
7ef0: 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  or for an.    **
7f00: 20 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d   index with pSO-
7f10: 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73  >nExpr+2 columns
7f20: 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75  .  Build a key u
7f30: 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65  sing pSO for the
7f40: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53   first.    ** pS
7f50: 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73  O->nExpr columns
7f60: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
7f70: 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e   all keys are un
7f80: 69 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61  ique by adding a
7f90: 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50  .    ** final OP
7fa0: 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e  _Sequence column
7fb0: 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75  .  The last colu
7fc0: 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64  mn is the record
7fd0: 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20   as a blob..    
7fe0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
7ff0: 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63  DistQueue:.    c
8000: 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b  ase SRT_Queue: {
8010: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  .      int nKey;
8020: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
8030: 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74  2, r3;.      int
8040: 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20   addrTest = 0;. 
8050: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8060: 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20  SO;.      pSO = 
8070: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b  pDest->pOrderBy;
8080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8090: 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79  SO );.      nKey
80a0: 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20   = pSO->nExpr;. 
80b0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
80c0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
80d0: 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  se);.      r2 = 
80e0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
80f0: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79  nge(pParse, nKey
8100: 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  +2);.      r3 = 
8110: 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20  r2+nKey+1;.     
8120: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8130: 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20  DistQueue ){.   
8140: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
8150: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
8160: 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75  stQueue, then cu
8170: 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69  rsor (iParm+1) i
8180: 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
8190: 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70  * on a second ep
81a0: 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68  hemeral index th
81b0: 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c  at holds all val
81c0: 75 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f  ues every previo
81d0: 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  usly.        ** 
81e0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65  added to the que
81f0: 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ue. */.        a
8200: 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65  ddrTest = sqlite
8210: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
8220: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
8230: 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  m+1, 0, .       
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8270: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
8280: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
82a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
82b0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
82c0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
82d0: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a  ResultCol, r3);.
82e0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
82f0: 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
8300: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8310: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8320: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
8330: 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20  rm+1, r3);.     
8340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8350: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
8360: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
8370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
8380: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20  or(i=0; i<nKey; 
8390: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
83a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
83b0: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20  v, OP_SCopy,.   
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
83e0: 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78   + pSO->a[i].u.x
83f0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
8400: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8410: 20 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69              r2+i
8420: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8440: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
8450: 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65  e, iParm, r2+nKe
8460: 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y);.      sqlite
8470: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8480: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32  P_MakeRecord, r2
8490: 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20  , nKey+2, r1);. 
84a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
84b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
84c0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
84d0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  1);.      if( ad
84e0: 64 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33  drTest ) sqlite3
84f0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8500: 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20  addrTest);.     
8510: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
8520: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
8530: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8540: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
8550: 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b  e(pParse, r2, nK
8560: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65  ey+2);.      bre
8570: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8580: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8590: 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  CTE */....#if !d
85a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
85b0: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
85c0: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
85d0: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
85e0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
85f0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
8600: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
8610: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
8620: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
8630: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
8640: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
8650: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
8660: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
8670: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
8680: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
8690: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
86a0: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
86b0: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
86c0: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
86d0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
86e0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
86f0: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
8700: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
8710: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
8720: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
8730: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
8740: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
8750: 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a    Except, if.  *
8760: 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72  * there is a sor
8770: 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ter, in which ca
8780: 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  se the sorter ha
8790: 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65  s already limite
87a0: 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75  d.  ** the outpu
87b0: 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20  t for us..  */. 
87c0: 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26   if( pSort==0 &&
87d0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
87e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
87f0: 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
8800: 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  mpZero, p->iLimi
8810: 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
8820: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
8830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
8840: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
8850: 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66  ect sufficient f
8860: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e  or an index of N
8870: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64   key columns and
8880: 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75  .** X extra colu
8890: 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  mns..*/.KeyInfo 
88a0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41  *sqlite3KeyInfoA
88b0: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62  lloc(sqlite3 *db
88c0: 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b  , int N, int X){
88d0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
88e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
88f0: 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20 20 20  ero(0, .        
8900: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
8910: 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b  f(KeyInfo) + (N+
8920: 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  X)*(sizeof(CollS
8930: 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28 20  eq*)+1));.  if( 
8940: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
8950: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
8960: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
8970: 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75    p->nField = (u
8980: 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46  16)N;.    p->nXF
8990: 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20  ield = (u16)X;. 
89a0: 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28     p->enc = ENC(
89b0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
89c0: 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66   db;.    p->nRef
89d0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
89e0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
89f0: 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  led = 1;.  }.  r
8a00: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
8a10: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
8a20: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
8a30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
8a40: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
8a50: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
8a60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8a70: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
8a80: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
8a90: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
8aa0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
8ab0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
8ac0: 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e   Make a new poin
8ad0: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
8ae0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e   object.*/.KeyIn
8af0: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
8b00: 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  foRef(KeyInfo *p
8b10: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
8b20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
8b30: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
8b40: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ef++;.  }.  retu
8b50: 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn p;.}..#ifdef 
8b60: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
8b70: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8b80: 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  f a KeyInfo obje
8b90: 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ct can be change
8ba0: 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f  .  The KeyInfo o
8bb0: 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c  bject.** can onl
8bc0: 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20  y be changed if 
8bd0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73  this is just a s
8be0: 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20  ingle reference 
8bf0: 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a  to the object..*
8c00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8c10: 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69  e is used only i
8c20: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
8c30: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
8c40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49  .int sqlite3KeyI
8c50: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b  nfoIsWriteable(K
8c60: 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75  eyInfo *p){ retu
8c70: 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d  rn p->nRef==1; }
8c80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8c90: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
8ca0: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
8cb0: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
8cc0: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
8cd0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
8ce0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
8cf0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
8d00: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
8d10: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
8d20: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8d30: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
8d40: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
8d50: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
8d60: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
8d70: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
8d80: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8d90: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
8da0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
8db0: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
8dc0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
8dd0: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
8de0: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
8df0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
8e00: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
8e10: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
8e20: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
8e30: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
8e40: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
8e50: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
8e60: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
8e70: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
8e80: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
8e90: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8ea0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
8eb0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
8ec0: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
8ed0: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
8ee0: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
8ef0: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
8f00: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
8f10: 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
8f20: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
8f30: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
8f40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8f50: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
8f60: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8f70: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8f80: 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68  ,     /* Form th
8f90: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
8fa0: 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c   from this ExprL
8fb0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ist */.  int iSt
8fc0: 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  art,          /*
8fd0: 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73   Begin with this
8fe0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74   column of pList
8ff0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
9000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
9010: 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72  d this many extr
9020: 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  a columns to the
9030: 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   end */.){.  int
9040: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
9050: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
9060: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9070: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
9080: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9090: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  >db;.  int i;.. 
90a0: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
90b0: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
90c0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
90d0: 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69  lloc(db, nExpr-i
90e0: 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29  Start, nExtra+1)
90f0: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
9100: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
9110: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
9120: 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b  teable(pInfo) );
9130: 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72  .    for(i=iStar
9140: 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  t, pItem=pList->
9150: 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70  a+iStart; i<nExp
9160: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
9170: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
9180: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
9190: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
91a0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
91b0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
91c0: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
91d0: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
91e0: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
91f0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69  pInfo->aColl[i-i
9200: 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  Start] = pColl;.
9210: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
9220: 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74  rtOrder[i-iStart
9230: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
9240: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
9250: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
9260: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
9270: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9280: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
9290: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
92a0: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
92b0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
92c0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
92d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
92e0: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
92f0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
9300: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
9310: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
9320: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
9330: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
9340: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
9350: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
9360: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
9370: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
9380: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
9390: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
93a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
93b0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
93c0: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
93d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
93e0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
93f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9400: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
9410: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9420: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
9430: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
9440: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
9450: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
9460: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
9470: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
9480: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
9490: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
94a0: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
94b0: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
94c0: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
94d0: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
94e0: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
94f0: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
9500: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
9510: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
9520: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
9530: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
9540: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
9550: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
9560: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9570: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
9580: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9590: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
95a0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
95b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
95c0: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
95d0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
95e0: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
95f0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
9600: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
9610: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9620: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
9630: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
9640: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
9650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9660: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9670: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9680: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9690: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
96a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
96b0: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
96c0: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
96d0: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
96e0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
96f0: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
9700: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
9710: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
9720: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
9730: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
9740: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
9750: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
9760: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
9770: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
9780: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
9790: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
97a0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
97b0: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
97c0: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
97d0: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
97e0: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
97f0: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
9800: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
9810: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
9820: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
9830: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
9840: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
9850: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
9860: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9870: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
9880: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
9890: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
98a0: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
98b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
98c0: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
98d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
98e0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
98f0: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
9900: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
9910: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
9920: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
9930: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9940: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9950: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9960: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9970: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
9980: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
9990: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
99a0: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
99b0: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
99c0: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
99d0: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
99e0: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
99f0: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
9a00: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
9a10: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
9a20: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
9a30: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
9a40: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
9a50: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
9a60: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
9a70: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9a80: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
9a90: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
9aa0: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
9ab0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
9ac0: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
9ad0: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
9ae0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
9af0: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
9b00: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
9b10: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
9b20: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
9b30: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
9b40: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
9b50: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
9b60: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
9b70: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
9b80: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
9b90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9ba0: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
9bb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
9be0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9c10: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
9c20: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
9c30: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c50: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
9c60: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
9c90: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
9ca0: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
9cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9cc0: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
9cd0: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
9ce0: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
9cf0: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
9d00: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
9d10: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
9d20: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
9d30: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
9d40: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
9d50: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9d60: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
9d70: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
9d80: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
9d90: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
9da0: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
9db0: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
9dc0: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
9dd0: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
9de0: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
9df0: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
9e00: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
9e10: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
9e20: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
9e30: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
9e40: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
9e50: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
9e60: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
9e70: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
9e80: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
9e90: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
9ea0: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
9eb0: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
9ec0: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
9ed0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
9ee0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
9ef0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
9f00: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
9f10: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
9f20: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
9f30: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
9f40: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
9f50: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
9f60: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
9f70: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
9f80: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
9f90: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
9fa0: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
9fb0: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
9fc0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
9fd0: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
9fe0: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
9ff0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
a000: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
a010: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
a020: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a030: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
a040: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
a050: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
a060: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
a070: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
a080: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
a090: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
a0a0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
a0b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a0c0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
a0d0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
a0e0: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
a0f0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
a100: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
a110: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a120: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
a130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a140: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
a150: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
a160: 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
a170: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
a180: 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  v);     /* Jump 
a190: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
a1a0: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
a1b0: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
a1c0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a1d0: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
a1e0: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
a1f0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
a200: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
a210: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
a220: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
a230: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
a240: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
a250: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
a260: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
a270: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
a280: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
a290: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
a2a0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
a2b0: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2d0: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
a2e0: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
a2f0: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
a320: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
a330: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
a340: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a370: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
a380: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
a390: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
a3a0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
a3b0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63  COMMENTS.  struc
a3c0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a3d0: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
a3e0: 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a  ist->a;.#endif..
a3f0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
a400: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73  elBkOut ){.    s
a410: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a420: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
a430: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
a440: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a450: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
a460: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a470: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 42 72 65  Goto, 0, addrBre
a480: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
a490: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
a4a0: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
a4b0: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54  BkOut);.  }.  iT
a4c0: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  ab = pSort->iECu
a4d0: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
a4e0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
a4f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
a500: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 72 65 67  utine ){.    reg
a510: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72  Rowid = 0;.    r
a520: 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69  egRow = pDest->i
a530: 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44  Sdst;.    nSortD
a540: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
a550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52   }else{.    regR
a560: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
a570: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a580: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73  ;.    regRow = s
a590: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a5a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 6e 53  (pParse);.    nS
a5b0: 6f 72 74 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d  ortData = 1;.  }
a5c0: 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72  .  nKey = pOrder
a5d0: 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  By->nExpr - pSor
a5e0: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28  t->nOBSat;.  if(
a5f0: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
a600: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
a610: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e  Sorter ){.    in
a620: 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b  t regSortOut = +
a630: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
a640: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50     iSortTab = pP
a650: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
a660: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
a670: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20  elBkOut ){.     
a680: 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69   addrOnce = sqli
a690: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
a6a0: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
a6b0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
a6c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a6d0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
a6e0: 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65  do, iSortTab, re
a6f0: 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31  gSortOut, nKey+1
a700: 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20  +nSortData);.   
a710: 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20   if( addrOnce ) 
a720: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a730: 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29  ere(v, addrOnce)
a740: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  ;.    addr = 1 +
a750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a760: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
a770: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
a780: 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  reak);.    VdbeC
a790: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a7a0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
a7b0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
a7c0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c  ntinue);.    sql
a7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a7e0: 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
a7f0: 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75   iTab, regSortOu
a800: 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20  t, iSortTab);.  
a810: 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65    bSeq = 0;.  }e
a820: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  lse{.    addr = 
a830: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
a840: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
a850: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
a860: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
a870: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
a880: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
a890: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
a8a0: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
a8b0: 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20   iTab;.    bSeq 
a8c0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 1;.  }.  for(i
a8d0: 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b  =0; i<nSortData;
a8e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
a8f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a900: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
a910: 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69  Tab, nKey+bSeq+i
a920: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
a930: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
a940: 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d   "%s", aOutEx[i]
a950: 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b  .zName ? aOutEx[
a960: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
a970: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
a980: 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  }.  switch( eDes
a990: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
a9a0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
a9b0: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
a9c0: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
a9d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
a9e0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
a9f0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
aa00: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
aa10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aa20: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
aa30: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  wid, iParm, regR
aa40: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
aa50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
aa60: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
aa70: 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  rm, regRow, regR
aa80: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
aa90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
aaa0: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
aab0: 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  D);.      break;
aac0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
aad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
aae0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
aaf0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
ab00: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
ab10: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
ab20: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
ab30: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
ab40: 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69  gRow, 1, regRowi
ab50: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
ab60: 20 20 20 20 20 20 20 20 20 20 20 26 70 44 65 73             &pDes
ab70: 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a  t->affSdst, 1);.
ab80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ab90: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
aba0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
abb0: 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  Row, 1);.      s
abc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
abd0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
abe0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
abf0: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
ac00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ac10: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
ac20: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
ac30: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
ac40: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
ac50: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
ac60: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
ac70: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
ac80: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
ac90: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
aca0: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
acb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
acc0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
acd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
ace0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
acf0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
ad00: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
ad10: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
ad20: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
ad30: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ad40: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
ad50: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
ad60: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
ad70: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
ad80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad90: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
ada0: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
adb0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
adc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
add0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ade0: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
adf0: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
ae00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ae10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ae20: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ae30: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
ae40: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
ae50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ae60: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
ae70: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c  Rowid ){.    sql
ae80: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ae90: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
aea0: 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  w);.    sqlite3R
aeb0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
aec0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
aed0: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f  .  }.  /* The bo
aee0: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
aef0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
af00: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
af10: 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  v, addrContinue)
af20: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  ;.  if( pSort->s
af30: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
af40: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
af50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
af60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
af70: 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  terNext, iTab, a
af80: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
af90: 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(v);.  }else{.
afa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
afb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
afc0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
afd0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
afe0: 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d    }.  if( pSort-
aff0: 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c  >regReturn ) sql
b000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
b010: 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f  , OP_Return, pSo
b020: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  rt->regReturn);.
b030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b040: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
b050: 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rBreak);.}../*.*
b060: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
b070: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
b080: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
b090: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
b0a0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
b0b0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
b0c0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
b0d0: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
b0e0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
b0f0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74  **.** Also try t
b100: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73  o estimate the s
b110: 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ize of the retur
b120: 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65  ned value and re
b130: 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73  turn that.** res
b140: 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74  ult in *pEstWidt
b150: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  h..**.** The dec
b160: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
b170: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
b180: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
b190: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
b1a0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
b1b0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
b1c0: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
b1d0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
b1e0: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
b1f0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
b200: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
b210: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
b220: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
b230: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
b240: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
b250: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
b260: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
b270: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
b280: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
b290: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
b2a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b2b0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
b2c0: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
b2d0: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
b2e0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
b2f0: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
b300: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
b310: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
b320: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
b330: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
b340: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
b350: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
b360: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
b370: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
b380: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
b390: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
b3a0: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
b3b0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
b3c0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
b3d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b3e0: 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20  tine has either 
b3f0: 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72  3 or 6 parameter
b400: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  s depending on w
b410: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
b420: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
b430: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
b440: 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TA compile-time 
b450: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
b460: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
b470: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
b480: 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65  ETADATA.# define
b490: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
b4a0: 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54  C,D,E,F) columnT
b4b0: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
b4c0: 45 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73  E,F).static cons
b4d0: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
b4e0: 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f  peImpl(.  NameCo
b4f0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45  ntext *pNC, .  E
b500: 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f  xpr *pExpr,.  co
b510: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
b520: 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  gDb,.  const cha
b530: 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20  r **pzOrigTab,. 
b540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
b550: 4f 72 69 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70  OrigCol,.  u8 *p
b560: 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68  EstWidth.){.  ch
b570: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
b580: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
b590: 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  nst *zOrigTab = 
b5a0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
b5b0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
b5c0: 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69  else /* if !defi
b5d0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b5e0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b5f0: 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63  A) */.# define c
b600: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
b610: 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70  D,E,F) columnTyp
b620: 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61  eImpl(A,B,F).sta
b630: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
b640: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a  columnTypeImpl(.
b650: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
b660: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
b670: 70 72 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69  pr,.  u8 *pEstWi
b680: 64 74 68 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a  dth.){.#endif /*
b690: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b6a0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
b6b0: 45 54 41 44 41 54 41 29 20 2a 2f 0a 20 20 63 68  ETADATA) */.  ch
b6c0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
b6d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
b6e0: 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b  u8 estWidth = 1;
b6f0: 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  ..  if( NEVER(pE
b700: 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e  xpr==0) || pNC->
b710: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
b720: 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68  turn 0;.  switch
b730: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
b740: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
b750: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
b760: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
b770: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
b780: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
b790: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
b7a0: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
b7b0: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
b7c0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
b7d0: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
b7e0: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
b7f0: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
b800: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
b810: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
b820: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
b830: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
b840: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b850: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
b860: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
b870: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
b880: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
b890: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b8a0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
b8b0: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
b8c0: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
b8d0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
b8e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
b8f0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
b900: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
b910: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
b920: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
b930: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
b940: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
b950: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
b960: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
b970: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
b980: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54       SrcList *pT
b990: 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  abList = pNC->pS
b9a0: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  rcList;.        
b9b0: 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69  for(j=0;j<pTabLi
b9c0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
b9d0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
b9e0: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
b9f0: 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  e;j++);.        
ba00: 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  if( j<pTabList->
ba10: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
ba20: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
ba30: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
ba40: 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61          pS = pTa
ba50: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c  bList->a[j].pSel
ba60: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ect;.        }el
ba70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
ba80: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
ba90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
baa0: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
bab0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
bac0: 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20  /* At one time, 
bad0: 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45  code such as "SE
bae0: 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68  LECT new.x" with
baf0: 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75  in a trigger wou
bb00: 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ld.        ** ca
bb10: 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69  use this conditi
bb20: 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63  on to run.  Sinc
bb30: 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20  e then, we have 
bb40: 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77  restructured how
bb50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67  .        ** trig
bb60: 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65  ger code is gene
bb70: 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69  rated and so thi
bb80: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  s condition is n
bb90: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
bba0: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48    ** possible. H
bbb0: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73  owever, it can s
bbc0: 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72  till be true for
bbd0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
bbe0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
bbf0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
bc00: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
bc10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
bc20: 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b  t1(col INTEGER);
bc30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
bc40: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e  LECT (SELECT t1.
bc50: 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74  col) FROM FROM t
bc60: 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  1;.        **.  
bc70: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f        ** when co
bc80: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
bc90: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
bca0: 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20  ession "t1.col" 
bcb0: 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
bcc0: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49  ** sub-select. I
bcd0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74  n this case, set
bce0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
bcf0: 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20   to NULL, even. 
bd00: 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68         ** though
bd10: 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c   it should reall
bd20: 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a  y be "INTEGER"..
bd30: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
bd40: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
bd50: 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20  t a problem, as 
bd60: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
bd70: 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e  of "t1.col" is n
bd80: 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ever.        ** 
bd90: 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d  used. When colum
bda0: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
bdb0: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
bdc0: 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ion .        ** 
bdd0: 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29  "(SELECT t1.col)
bde0: 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  ", the correct t
bdf0: 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ype is returned 
be00: 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45  (see the TK_SELE
be10: 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72  CT.        ** br
be20: 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  anch below.  */.
be30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
be40: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
be50: 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45  sert( pTab && pE
be60: 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20  xpr->pTab==pTab 
be70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
be80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
be90: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
bea0: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
beb0: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
bec0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
bed0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
bee0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
bef0: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
bf00: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
bf10: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
bf20: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
bf30: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
bf40: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
bf50: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
bf60: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
bf70: 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Col>=0 && ALWAYS
bf80: 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74  (iCol<pS->pEList
bf90: 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
bfa0: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c        /* If iCol
bfb0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
bfc0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ro, then the exp
bfd0: 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73  ression requests
bfe0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
bff0: 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73  * rowid of the s
c000: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
c010: 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69  w. This expressi
c020: 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65  on is legal (see
c030: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
c040: 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32  est case misc2.2
c050: 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20  .2) - it always 
c060: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
c070: 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  L..          */.
c080: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f            NameCo
c090: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
c0a0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
c0b0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  S->pEList->a[iCo
c0c0: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  l].pExpr;.      
c0d0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
c0e0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
c0f0: 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74         sNC.pNext
c100: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20   = pNC;.        
c110: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
c120: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
c130: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
c140: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
c150: 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67  ,&zOrigDb,&zOrig
c160: 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  Tab,&zOrigCol, &
c170: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
c180: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
c190: 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68  e if( pTab->pSch
c1a0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ema ){.        /
c1b0: 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a  * A real table *
c1c0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
c1d0: 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20  ( !pS );.       
c1e0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
c1f0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
c200: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c210: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
c220: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
c230: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69  Tab->nCol) );.#i
c240: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c250: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c260: 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  TA.        if( i
c270: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
c280: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
c290: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
c2a0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69  zOrigCol = "rowi
c2b0: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
c2c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
c2d0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
c2e0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
c2f0: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
c300: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c310: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
c320: 20 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70      estWidth = p
c330: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c340: 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  szEst;.        }
c350: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61  .        zOrigTa
c360: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
c370: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
c380: 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  ->pParse ){.    
c390: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
c3a0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
c3b0: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
c3c0: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
c3d0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
c3e0: 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70  zOrigDb = pNC->p
c3f0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
c400: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  Db].zName;.     
c410: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
c420: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
c430: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
c440: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
c450: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c460: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
c470: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c480: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
c490: 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62   estWidth = pTab
c4a0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45  ->aCol[iCol].szE
c4b0: 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  st;.        }.#e
c4c0: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
c4d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c4e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c4f0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
c500: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
c510: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
c520: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
c530: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
c540: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
c550: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
c560: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
c570: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
c580: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
c590: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
c5a0: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
c5b0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
c5c0: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
c5d0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
c5e0: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
c5f0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
c600: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
c610: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  pS->pEList->a[0]
c620: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
c630: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
c640: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
c650: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
c660: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
c670: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
c680: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
c690: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
c6a0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
c6b0: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
c6c0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
c6d0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
c6e0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
c6f0: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
c700: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
c710: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
c720: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c730: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c740: 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70  TADATA  .  if( p
c750: 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61  zOrigDb ){.    a
c760: 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62  ssert( pzOrigTab
c770: 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b   && pzOrigCol );
c780: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d  .    *pzOrigDb =
c790: 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70   zOrigDb;.    *p
c7a0: 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67  zOrigTab = zOrig
c7b0: 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  Tab;.    *pzOrig
c7c0: 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a  Col = zOrigCol;.
c7d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
c7e0: 20 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45   pEstWidth ) *pE
c7f0: 73 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64  stWidth = estWid
c800: 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79  th;.  return zTy
c810: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  pe;.}../*.** Gen
c820: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
c830: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
c840: 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  BE the declarati
c850: 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75  on types of colu
c860: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
c870: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
c880: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
c890: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20  eColumnTypes(.  
c8a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c8b0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
c8c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
c8d0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
c8e0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
c8f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
c900: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
c910: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
c920: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
c930: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
c940: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
c950: 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  YPE.  Vdbe *v = 
c960: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
c970: 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
c980: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43  ntext sNC;.  sNC
c990: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
c9a0: 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72  List;.  sNC.pPar
c9b0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
c9c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
c9d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c9e0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
c9f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
ca00: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ca10: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
ca20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
ca30: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
ca40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
ca50: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
ca60: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
ca70: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
ca80: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
ca90: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
caa0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
cab0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
cac0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
cad0: 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  gCol, 0);..    /
cae0: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
caf0: 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70  make its own cop
cb00: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
cb10: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
cb20: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
cb30: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
cb40: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
cb50: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
cb60: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
cb70: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
cb80: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
cb90: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
cba0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cbb0: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
cbc0: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c  SE, zOrigDb, SQL
cbd0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
cbe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
cbf0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
cc00: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
cc10: 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f  OrigTab, SQLITE_
cc20: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
cc30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
cc40: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cc50: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
cc60: 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  gCol, SQLITE_TRA
cc70: 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20  NSIENT);.#else. 
cc80: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
cc90: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
cca0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
ccb0: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
ccc0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
ccd0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
cce0: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
ccf0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
cd00: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
cd10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
cd20: 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d  T_DECLTYPE) */.}
cd30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
cd40: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
cd50: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
cd60: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
cd70: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
cd80: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
cd90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
cda0: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
cdb0: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
cdc0: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
cdd0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
cde0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
cdf0: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
ce00: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
ce10: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
ce20: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
ce30: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
ce40: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
ce50: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
ce60: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
ce70: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
ce80: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
ce90: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
cea0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
ceb0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
cec0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ced0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
cee0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
cef0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
cf00: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
cf10: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
cf20: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
cf30: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
cf40: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
cf50: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
cf60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
cf70: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
cf80: 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52  amesSet || NEVER
cf90: 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  (v==0) || db->ma
cfa0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
cfb0: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
cfc0: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
cfd0: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
cfe0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
cff0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
d000: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
d010: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
d020: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
d030: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
d040: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
d050: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
d060: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
d070: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
d080: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
d090: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
d0a0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
d0b0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d      if( NEVER(p=
d0c0: 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
d0d0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
d0e0: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
d0f0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
d100: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
d110: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
d120: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d130: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d140: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
d150: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d160: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
d170: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
d180: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  || p->op==TK_AGG
d190: 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62  _COLUMN) && pTab
d1a0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
d1b0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
d1c0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
d1d0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
d1e0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
d1f0: 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28  for(j=0; ALWAYS(
d200: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
d210: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); j++){.       
d220: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
d230: 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e  [j].iCursor==p->
d240: 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a  iTable ) break;.
d250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
d260: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
d270: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
d280: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
d290: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
d2a0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
d2b0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
d2c0: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
d2d0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
d2e0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
d2f0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
d300: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
d310: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
d320: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
d330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
d340: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
d350: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
d360: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
d370: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
d380: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
d390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d3a0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d3b0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20  COLNAME_NAME, . 
d3c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d3d0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
d3e0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
d3f0: 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  n), SQLITE_DYNAM
d400: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
d410: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29   if( fullNames )
d420: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
d430: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
d440: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
d450: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
d460: 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
d470: 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  me, zCol);.     
d480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d490: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d4a0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
d4b0: 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  me, SQLITE_DYNAM
d4c0: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
d4d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d4e0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d4f0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d500: 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45  ME, zCol, SQLITE
d510: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d520: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
d530: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
d540: 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *z = pEList->a[
d550: 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  i].zSpan;.      
d560: 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74  z = z==0 ? sqlit
d570: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63  e3MPrintf(db, "c
d580: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a  olumn%d", i+1) :
d590: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
d5a0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  (db, z);.      s
d5b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d5c0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d5d0: 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49  ME_NAME, z, SQLI
d5e0: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
d5f0: 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74   }.  }.  generat
d600: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
d610: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
d620: 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  EList);.}../*.**
d630: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
d640: 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68  sion list (which
d650: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c   is really the l
d660: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
d670: 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20  ns.** that form 
d680: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
d690: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
d6a0: 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70  ment) compute ap
d6b0: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c  propriate.** col
d6c0: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20  umn names for a 
d6d0: 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64  table that would
d6e0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
d6f0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
d700: 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   All column name
d710: 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65  s will be unique
d720: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
d730: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   column names ar
d740: 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c  e computed.  Col
d750: 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d  umn.zType, Colum
d760: 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20  n.zColl,.** and 
d770: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
d780: 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65  Column are zeroe
d790: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
d7a0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
d7b0: 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f  cess.  If a memo
d7c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
d7d0: 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73  ror occurs,.** s
d7e0: 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61  tore NULL in *pa
d7f0: 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e  Col and 0 in *pn
d800: 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Col and return S
d810: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
d820: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
d830: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
d840: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
d850: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d860: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d870: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
d880: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
d890: 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f  /* Expr list fro
d8a0: 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76  m which to deriv
d8b0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
d8c0: 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20  /.  i16 *pnCol, 
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
d8e0: 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
d8f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20  of columns here 
d900: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61  */.  Column **pa
d910: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Col          /* 
d920: 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f  Write the new co
d930: 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a  lumn list here *
d940: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d950: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d960: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
d970: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
d980: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
d990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
d9a0: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
d9b0: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d9d0: 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d  Index added to m
d9e0: 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69  ake the name uni
d9f0: 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  que */.  Column 
da00: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20  *aCol, *pCol;   
da10: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
da20: 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20  ing over result 
da30: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
da40: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
da50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
da60: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
da70: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
da80: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20  */.  Expr *p;   
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
dab0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  or a single resu
dac0: 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  lt column */.  c
dad0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
dae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
daf0: 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  lumn name */.  i
db00: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
db10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
db20: 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e  ze of name in zN
db30: 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20  ame[] */..  if( 
db40: 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43  pEList ){.    nC
db50: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
db60: 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73  pr;.    aCol = s
db70: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
db80: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43  ro(db, sizeof(aC
db90: 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20  ol[0])*nCol);.  
dba0: 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c    testcase( aCol
dbb0: 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
dbc0: 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
dbd0: 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a    aCol = 0;.  }.
dbe0: 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b    *pnCol = nCol;
dbf0: 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c  .  *paCol = aCol
dc00: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  ;..  for(i=0, pC
dc10: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b  ol=aCol; i<nCol;
dc20: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
dc30: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
dc40: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
dc50: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
dc60: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
dc70: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
dc80: 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  te(pEList->a[i].
dc90: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
dca0: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
dcb0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
dcc0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
dcd0: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
dce0: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
dcf0: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
dd00: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
dd10: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
dd20: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
dd30: 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  p(db, zName);.  
dd40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
dd50: 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
dd60: 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  p;  /* The expre
dd70: 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68  ssion that is th
dd80: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
dd90: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61  name */.      Ta
dda0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
ddb0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f     /* Table asso
ddc0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
ddd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
dde0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c       while( pCol
ddf0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  Expr->op==TK_DOT
de00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
de10: 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Expr = pColExpr-
de20: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
de30: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
de40: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  r!=0 );.      }.
de50: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78        if( pColEx
de60: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
de70: 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c  N && ALWAYS(pCol
de80: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29  Expr->pTab!=0) )
de90: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
dea0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65   columns use the
deb0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d   column name nam
dec0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
ded0: 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72   iCol = pColExpr
dee0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
def0: 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78     pTab = pColEx
df00: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
df10: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
df20: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
df30: 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  y;.        zName
df40: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
df50: 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20  f(db, "%s",.    
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
df70: 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f  l>=0 ? pTab->aCo
df80: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20  l[iCol].zName : 
df90: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
dfa0: 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78  }else if( pColEx
dfb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pr->op==TK_ID ){
dfc0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
dfd0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
dfe0: 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49  y(pColExpr, EP_I
dff0: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
e000: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e010: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e020: 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75  %s", pColExpr->u
e030: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
e040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
e050: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
e060: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
e070: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
e080: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
e090: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
e0a0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
e0b0: 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d  b, "%s", pEList-
e0c0: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[i].zSpan);.  
e0d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e0e0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
e0f0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  iled ){.      sq
e100: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e110: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
e120: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
e130: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
e140: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
e150: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
e160: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
e170: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
e180: 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
e190: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
e1a0: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
e1b0: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
e1c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
e1d0: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
e1e0: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
e1f0: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
e200: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e210: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
e220: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
e230: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e240: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
e250: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66  int k;.        f
e260: 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e  or(k=nName-1; k>
e270: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  1 && sqlite3Isdi
e280: 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b  git(zName[k]); k
e290: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
e2a0: 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b  ( k>=0 && zName[
e2b0: 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20  k]==':' ) nName 
e2c0: 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = k;.        zNa
e2d0: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
e2e0: 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20         zNewName 
e2f0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e300: 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e  (db, "%s:%d", zN
e310: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
e320: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e330: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
e340: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a         zName = z
e350: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
e360: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
e370: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
e380: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
e390: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
e3a0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
e3b0: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
e3c0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e3d0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
e3e0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
e3f0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
e400: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
e410: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
e420: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
e430: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
e440: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
e450: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e460: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
e470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e480: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
e490: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
e4a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
e4b0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
e4c0: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
e4d0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
e4e0: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
e4f0: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
e500: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
e510: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
e520: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
e530: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
e540: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
e550: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
e560: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
e570: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
e580: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
e590: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
e5a0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
e5b0: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
e5c0: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
e5d0: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
e5e0: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
e5f0: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
e600: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
e610: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
e620: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
e630: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e640: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e650: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
e660: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
e670: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
e680: 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
e690: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
e6a0: 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
e6b0: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
e6c0: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
e6d0: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
e6e0: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
e6f0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e700: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e710: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
e720: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
e730: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
e740: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
e750: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
e760: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e770: 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c  m *a;.  u64 szAl
e780: 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
e790: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
e7a0: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
e7b0: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
e7c0: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
e7d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
e7e0: 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
e7f0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
e800: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e810: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
e820: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
e830: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
e840: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
e850: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
e860: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
e870: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
e880: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
e890: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
e8a0: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
e8b0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
e8c0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
e8d0: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
e8e0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
e8f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e900: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
e910: 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43  NC, p,0,0,0, &pC
e920: 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20  ol->szEst));.   
e930: 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e   szAll += pCol->
e940: 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d  szEst;.    pCol-
e950: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
e960: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
e970: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
e980: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
e990: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
e9a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
e9b0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
e9c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e9d0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
e9e0: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
e9f0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
ea00: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
ea10: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
ea20: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
ea30: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
ea40: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
ea50: 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  szAll*4);.}../*.
ea60: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
ea70: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
ea80: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
ea90: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
eaa0: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
eab0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
eac0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
ead0: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
eae0: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
eaf0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
eb00: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
eb10: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
eb20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
eb30: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
eb40: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
eb50: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
eb60: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
eb70: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
eb80: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
eb90: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
eba0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
ebb0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
ebc0: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
ebd0: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
ebe0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
ebf0: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
ec00: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
ec10: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
ec20: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
ec30: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
ec40: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
ec50: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
ec60: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
ec70: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
ec80: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
ec90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
eca0: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
ecb0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
ecc0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
ecd0: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
ece0: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
ecf0: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
ed00: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
ed10: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
ed20: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
ed30: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
ed40: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
ed50: 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
ed60: 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
ed70: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
ed80: 38 35 37 36 29 20 29 3b 0a 20 20 73 65 6c 65 63  8576) );.  selec
ed90: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
eda0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
edb0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
edc0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
edd0: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63  ->aCol);.  selec
ede0: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
edf0: 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
ee00: 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74  e, pTab, pSelect
ee10: 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
ee20: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d   = -1;.  if( db-
ee30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
ee40: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
ee50: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
ee60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
ee70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
ee80: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ab;.}../*.** Get
ee90: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
eea0: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
eeb0: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
eec0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
eed0: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
eee0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
eef0: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
ef00: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
ef10: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
ef20: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
ef30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
ef40: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ef50: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
ef60: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
ef70: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
ef80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
ef90: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  te(pParse);.    
efa0: 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56  if( v ) sqlite3V
efb0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
efc0: 49 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Init);.    if( p
efd0: 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
efe0: 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69  ==0.     && Opti
eff0: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
f000: 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
f010: 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
f020: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
f030: 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
f040: 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ctor = 1;.    }.
f050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
f060: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
f070: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
f080: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
f090: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
f0a0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
f0b0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
f0c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
f0d0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
f0e0: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
f0f0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
f100: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
f110: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
f120: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
f130: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
f140: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
f150: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
f160: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
f170: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
f180: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
f190: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
f1a0: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
f1b0: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
f1c0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
f1d0: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
f1e0: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
f1f0: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
f200: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
f210: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
f220: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
f230: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
f240: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
f250: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
f260: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
f270: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
f280: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
f290: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
f2a0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
f2b0: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
f2c0: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
f2d0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
f2e0: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
f2f0: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
f300: 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
f310: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
f320: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
f330: 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
f340: 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
f350: 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
f360: 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
f370: 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
f380: 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
f390: 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
f3a0: 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
f3b0: 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
f3c0: 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
f3d0: 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
f3e0: 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
f3f0: 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20  ly if pLimit!=0 
f400: 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f  or pOffset!=0 do
f410: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
f420: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
f430: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
f440: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
f450: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
f460: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
f470: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
f480: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
f490: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
f4a0: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
f4b0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
f4c0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
f4d0: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
f4e0: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
f4f0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
f500: 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b  *p, int iBreak){
f510: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a  .  Vdbe *v = 0;.
f520: 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
f530: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
f540: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b  .  int addr1, n;
f550: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
f560: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
f570: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
f580: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
f590: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
f5a0: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
f5b0: 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77  troversy about w
f5c0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
f5d0: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
f5e0: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
f5f0: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
f600: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
f610: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
f620: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
f630: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
f640: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
f650: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  se);.  assert( p
f660: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  ->pOffset==0 || 
f670: 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  p->pLimit!=0 );.
f680: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
f690: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
f6a0: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
f6b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f6c0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
f6d0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
f6e0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
f6f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
f700: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
f710: 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20  pLimit, &n) ){. 
f720: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f730: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
f740: 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29  eger, n, iLimit)
f750: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
f760: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
f770: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
f780: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
f790: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f7a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
f7b0: 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20  o, 0, iBreak);. 
f7c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
f7d0: 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  >=0 && p->nSelec
f7e0: 74 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20  tRow>(u64)n ){. 
f7f0: 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
f800: 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20  tRow = n;.      
f810: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
f820: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f830: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
f840: 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  imit, iLimit);. 
f850: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f860: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
f870: 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
f880: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f890: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
f8a0: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
f8b0: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
f8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f8d0: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
f8e0: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
f8f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f910: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
f920: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
f930: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
f940: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
f950: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
f960: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
f970: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
f980: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
f990: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
f9a0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f9b0: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
f9c0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
f9d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f9e0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f9f0: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
fa00: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fa10: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fa20: 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
fa30: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64  er"));.      add
fa40: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
fa50: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
fa60: 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64  os, iOffset); Vd
fa70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
fa80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fa90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
faa0: 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74  eger, 0, iOffset
fab0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fac0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
fad0: 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71  addr1);.      sq
fae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
faf0: 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69  v, OP_Add, iLimi
fb00: 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66  t, iOffset, iOff
fb10: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64  set+1);.      Vd
fb20: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
fb30: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
fb40: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
fb50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fb60: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69  v, OP_IfPos, iLi
fb70: 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
fb80: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
fb90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fba0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31  , OP_Integer, -1
fbb0: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
fbc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
fbd0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
fbe0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
fbf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fc00: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
fc10: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
fc20: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
fc30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fc40: 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
fc50: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
fc60: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
fc70: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
fc80: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
fc90: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
fca0: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
fcb0: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
fcc0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
fcd0: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
fce0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
fcf0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
fd00: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
fd10: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
fd20: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
fd30: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
fd40: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
fd50: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
fd60: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
fd70: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
fd80: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
fd90: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
fda0: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
fdb0: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
fdc0: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
fdd0: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
fde0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
fdf0: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
fe00: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
fe10: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
fe20: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
fe30: 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d  0 );.  if( pRet=
fe40: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45  =0 && iCol<p->pE
fe50: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
fe60: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
fe70: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
fe80: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
fe90: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
fea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
feb0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
fec0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
fed0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
fee0: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
fef0: 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
ff00: 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20  LECT.** with an 
ff10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
ff20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
ff30: 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74  llocates and ret
ff40: 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a  urns a KeyInfo.*
ff50: 2a 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74  * structure suit
ff60: 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65  able for impleme
ff70: 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  nting the ORDER 
ff80: 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  BY..**.** Space 
ff90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
ffa0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
ffb0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
ffc0: 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69  alloc. The calli
ffd0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
ffe0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
fff0: 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
10000 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
10010 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
10020 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
10030 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53   KeyInfo *multiS
10040 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
10050 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
10060 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
10070 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70  t nExtra){.  Exp
10080 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
10090 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
100a0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20   int nOrderBy = 
100b0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
100c0 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr;.  sqlite3 *d
100d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
100e0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20    KeyInfo *pRet 
100f0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
10100 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72  Alloc(db, nOrder
10110 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20  By+nExtra, 1);. 
10120 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
10130 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
10140 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
10150 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
10160 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
10170 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64  m *pItem = &pOrd
10180 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  erBy->a[i];.    
10190 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20    Expr *pTerm = 
101a0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
101b0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
101c0 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ll;..      if( p
101d0 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50  Term->flags & EP
101e0 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  _Collate ){.    
101f0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
10200 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
10210 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20  Parse, pTerm);. 
10220 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10230 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
10240 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
10250 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d  Parse, p, pItem-
10260 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
10270 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  -1);.        if(
10280 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
10290 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
102a0 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  l;.        pOrde
102b0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
102c0 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
102d0 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
102e0 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20  eString(pParse, 
102f0 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  pTerm, pColl->zN
10300 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
10310 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10320 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
10330 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20  eable(pRet) );. 
10340 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c       pRet->aColl
10350 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
10360 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72     pRet->aSortOr
10370 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
10380 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
10390 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
103a0 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
103b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
103c0 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68  MIT_CTE./*.** Th
103d0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
103e0 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74  ates VDBE code t
103f0 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
10400 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20  ntent of a WITH 
10410 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65  RECURSIVE.** que
10420 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ry of the form:.
10430 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69  **.**   <recursi
10440 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73  ve-table> AS (<s
10450 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f  etup-query> UNIO
10460 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69  N [ALL] <recursi
10470 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20  ve-query>).**   
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
104a0 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  __/             
104b0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
104c0 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
104e0 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20  ->pPrior        
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a                p.
10500 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  **.**.** There i
10510 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65  s exactly one re
10520 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72  ference to the r
10530 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69  ecursive-table i
10540 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
10550 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76  e.** of recursiv
10560 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20  e-query, marked 
10570 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74  with the SrcList
10580 2d 3e 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76  ->a[].isRecursiv
10590 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  e flag..**.** Th
105a0 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75  e setup-query ru
105b0 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72  ns once to gener
105c0 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73  ate an initial s
105d0 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  et of rows that 
105e0 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65  go.** into a Que
105f0 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20  ue table.  Rows 
10600 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
10610 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62  om the Queue tab
10620 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65  le one by.** one
10630 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72  .  Each row extr
10640 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
10650 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44   is output to pD
10660 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73  est.  Then the s
10670 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74  ingle.** extract
10680 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74  ed row (now in t
10690 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c  he iCurrent tabl
106a0 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  e) becomes the c
106b0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  ontent of the.**
106c0 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
106d0 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65   for a recursive
106e0 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65  -query run.  The
106f0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72   output of the r
10700 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a  ecursive-query.*
10710 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20  * is added back 
10720 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
10730 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74  able.  Then anot
10740 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61  her row is extra
10750 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a  cted from Queue.
10760 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ** and the itera
10770 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75  tion continues u
10780 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74  ntil the Queue t
10790 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
107a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70  *.** If the comp
107b0 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61  ound query opera
107c0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65  tor is UNION the
107d0 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72  n no duplicate r
107e0 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20  ows are ever.** 
107f0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
10800 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
10810 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61  The iDistinct ta
10820 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79  ble keeps a copy
10830 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20   of all rows.** 
10840 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62  that have ever b
10850 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
10860 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73  o Queue and caus
10870 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f  es duplicates to
10880 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64   be.** discarded
10890 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  .  If the operat
108a0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c  or is UNION ALL,
108b0 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73   then duplicates
108c0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
108d0 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72   .** If the quer
108e0 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42  y has an ORDER B
108f0 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20  Y, then entries 
10900 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62  in the Queue tab
10910 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a  le are kept in.*
10920 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  * ORDER BY order
10930 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65   and the first e
10940 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65  ntry is extracte
10950 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65  d for each cycle
10960 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e  .  Without.** an
10970 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51   ORDER BY, the Q
10980 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75  ueue table is ju
10990 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a  st a FIFO..**.**
109a0 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   If a LIMIT clau
109b0 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20  se is provided, 
109c0 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69  then the iterati
109d0 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c  on stops after L
109e0 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76  IMIT rows.** hav
109f0 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f  e been output to
10a00 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54   pDest.  A LIMIT
10a10 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74   of zero means t
10a20 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73  o output no rows
10a30 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69   and a.** negati
10a40 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74  ve LIMIT means t
10a50 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77  o output all row
10a60 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
10a70 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63  also an OFFSET c
10a80 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20  lause.** with a 
10a90 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20  positive value, 
10aa0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f  then the first O
10ab0 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72  FFSET outputs ar
10ac0 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68  e discarded rath
10ad0 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67  er.** than being
10ae0 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20   sent to pDest. 
10af0 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74   The LIMIT count
10b00 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
10b10 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53  until after OFFS
10b20 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20  ET.** rows have 
10b30 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  been skipped..*/
10b40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
10b50 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
10b60 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65  veQuery(.  Parse
10b70 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10b80 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10b90 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10ba0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
10bb0 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20  * The recursive 
10bc0 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64  SELECT to be cod
10bd0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
10be0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
10bf0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
10c00 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
10c10 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
10c20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
10c30 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
10c40 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72   clause of the r
10c50 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
10c60 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  /.  int nCol = p
10c70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
10c80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
10c90 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
10ca0 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f  cursive table */
10cb0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10cc0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
10cd0 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
10ce0 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
10cf0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
10d00 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75  .  Select *pSetu
10d10 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20  p = p->pPrior;  
10d20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75   /* The setup qu
10d30 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ery */.  int add
10d40 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
10d50 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
10d60 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
10d70 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  nt addrCont, add
10d80 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20  rBreak;      /* 
10d90 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45  CONTINUE and BRE
10da0 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  AK addresses */.
10db0 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
10dc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10dd0 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74  /* The Current t
10de0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
10df0 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  gCurrent;       
10e00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
10e10 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72  ter holding Curr
10e20 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
10e30 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20  nt iQueue;      
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e50 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  The Queue table 
10e60 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e  */.  int iDistin
10e70 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ct = 0;         
10e80 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
10e90 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69  unique results i
10ea0 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74  f UNION */.  int
10eb0 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66   eDest = SRT_Fif
10ec0 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  o;         /* Ho
10ed0 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75  w to write to Qu
10ee0 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  eue */.  SelectD
10ef0 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20  est destQueue;  
10f00 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
10f10 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20  Dest targetting 
10f20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10f30 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10f60 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
10f90 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  code */.  ExprLi
10fa0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
10fb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
10fc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
10fd0 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
10fe0 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20  , *pOffset;     
10ff0 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54    /* Saved LIMIT
11000 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20   and OFFSET */. 
11010 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72   int regLimit, r
11020 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  egOffset;      /
11030 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64  * Registers used
11040 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   by LIMIT and OF
11050 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  FSET */..  /* Ob
11060 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  tain authorizati
11070 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72  on to do a recur
11080 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
11090 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
110a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
110b0 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30  ITE_RECURSIVE, 0
110c0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
110d0 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
110e0 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
110f0 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66  FSET clauses, if
11100 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20   they exist */. 
11110 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
11120 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11130 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
11140 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
11150 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65  arse, p, addrBre
11160 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20  ak);.  pLimit = 
11170 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66  p->pLimit;.  pOf
11180 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
11190 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20  t;.  regLimit = 
111a0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67  p->iLimit;.  reg
111b0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
111c0 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  set;.  p->pLimit
111d0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20   = p->pOffset = 
111e0 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  0;.  p->iLimit =
111f0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
11200 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
11210 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a  >pOrderBy;..  /*
11220 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73   Locate the curs
11230 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
11240 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
11250 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57  /.  for(i=0; ALW
11260 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63  AYS(i<pSrc->nSrc
11270 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
11280 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65   pSrc->a[i].isRe
11290 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
112a0 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63   iCurrent = pSrc
112b0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[i].iCursor;.
112c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
112d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
112e0 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75  ocate cursors nu
112f0 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20  mbers for Queue 
11300 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54  and Distinct.  T
11310 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
11320 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69   for.  ** the Di
11330 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73  stinct table mus
11340 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  t be exactly one
11350 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75   greater than Qu
11360 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a  eue in order.  *
11370 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69  * for the SRT_Di
11380 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44  stFifo and SRT_D
11390 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61  istQueue destina
113a0 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a  tions to work. *
113b0 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61  /.  iQueue = pPa
113c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
113d0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
113e0 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20  ON ){.    eDest 
113f0 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54  = pOrderBy ? SRT
11400 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54  _DistQueue : SRT
11410 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69  _DistFifo;.    i
11420 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
11430 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c  e->nTab++;.  }el
11440 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  se{.    eDest = 
11450 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51  pOrderBy ? SRT_Q
11460 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b  ueue : SRT_Fifo;
11470 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
11480 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
11490 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20  stQueue, eDest, 
114a0 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41  iQueue);..  /* A
114b0 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20  llocate cursors 
114c0 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65  for Current, Que
114d0 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74  ue, and Distinct
114e0 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e  . */.  regCurren
114f0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
11500 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
11510 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
11520 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65  enPseudo, iCurre
11530 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20  nt, regCurrent, 
11540 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72  nCol);.  if( pOr
11550 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
11560 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
11570 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
11580 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
11590 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71  e, p, 1);.    sq
115a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
115b0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
115c0 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  ral, iQueue, pOr
115d0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
115e0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
115f0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
11600 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
11610 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51  INFO);.    destQ
11620 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20  ueue.pOrderBy = 
11630 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73  pOrderBy;.  }els
11640 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
11650 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
11660 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
11670 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  ueue, nCol);.  }
11680 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
11690 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22  v, "Queue table"
116a0 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69  ));.  if( iDisti
116b0 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64  nct ){.    p->ad
116c0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
116d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
116e0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
116f0 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74  meral, iDistinct
11700 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c  , 0);.    p->sel
11710 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
11720 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a  Ephemeral;.  }..
11730 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20    /* Detach the 
11740 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11750 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e  from the compoun
11760 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d  d SELECT */.  p-
11770 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a  >pOrderBy = 0;..
11780 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
11790 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
117a0 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65  tup-query in Que
117b0 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d  ue. */.  pSetup-
117c0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63  >pNext = 0;.  rc
117d0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
117e0 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c  (pParse, pSetup,
117f0 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20   &destQueue);.  
11800 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20  pSetup->pNext = 
11810 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  p;.  if( rc ) go
11820 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  to end_of_recurs
11830 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a  ive_query;..  /*
11840 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72   Find the next r
11850 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20  ow in the Queue 
11860 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20  and output that 
11870 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  row */.  addrTop
11880 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11890 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
118a0 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42  d, iQueue, addrB
118b0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
118c0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72  age(v);..  /* Tr
118d0 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20  ansfer the next 
118e0 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65  row in Queue ove
118f0 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a  r to Current */.
11900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11910 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
11920 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a  w, iCurrent); /*
11930 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e   To reset column
11940 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20   cache */.  if( 
11950 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11970 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
11980 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
11990 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75  ->nExpr+1, regCu
119a0 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  rrent);.  }else{
119b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
119c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
119d0 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65  Data, iQueue, re
119e0 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20  gCurrent);.  }. 
119f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11a00 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
11a10 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
11a20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c  Output the singl
11a30 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
11a40 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d   */.  addrCont =
11a50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11a60 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65  Label(v);.  code
11a70 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66  Offset(v, regOff
11a80 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  set, addrCont);.
11a90 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
11aa0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
11ab0 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74  pEList, iCurrent
11ac0 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
11ad0 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
11ae0 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
11af0 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
11b00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b10 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
11b20 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
11b30 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
11b40 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11b50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
11b60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11b70 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
11b80 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
11b90 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
11ba0 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
11bb0 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
11bc0 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
11bd0 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
11be0 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
11bf0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
11c00 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
11c10 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
11c20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  0;.  sqlite3Sele
11c30 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
11c40 65 73 74 51 75 65 75 65 29 3b 0a 20 20 61 73 73  estQueue);.  ass
11c50 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
11c60 30 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  0 );.  p->pPrior
11c70 20 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f 2a   = pSetup;..  /*
11c80 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
11c90 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
11ca0 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
11cb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11cc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
11cd0 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  o, 0, addrTop);.
11ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11cf0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
11d00 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66  rBreak);..end_of
11d10 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
11d20 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
11d30 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
11d40 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
11d50 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42  y);.  p->pOrderB
11d60 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11d70 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
11d80 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  it;.  p->pOffset
11d90 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65   = pOffset;.  re
11da0 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
11db0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  * SQLITE_OMIT_CT
11dc0 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  E */../* Forward
11dd0 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73   references */.s
11de0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
11df0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
11e00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11e10 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11e20 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
11e30 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
11e40 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
11e50 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
11e60 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
11e70 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
11e80 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
11e90 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
11ea0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a   results */.);..
11eb0 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73  /*.** Error mess
11ec0 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f  age for when two
11ed0 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f   or more terms o
11ee0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
11ef0 65 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65  ect have differe
11f00 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c  nt.** size resul
11f10 74 20 73 65 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  t sets..*/.stati
11f20 63 20 76 6f 69 64 20 73 65 6c 65 63 74 57 72 6f  c void selectWro
11f30 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28  ngNumTermsError(
11f40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
11f50 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
11f60 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
11f70 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20  F_Values ){.    
11f80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11f90 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c  pParse, "all VAL
11fa0 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68  UES must have th
11fb0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
11fc0 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73   terms");.  }els
11fd0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
11fe0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11ff0 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
12000 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
12010 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
12020 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
12030 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
12040 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
12050 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
12060 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
12070 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
12080 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
12090 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
120a0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
120b0 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
120c0 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
120d0 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
120e0 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
120f0 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
12100 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
12110 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
12120 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
12130 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
12140 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
12150 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
12160 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
12170 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
12180 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
12190 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
121a0 2a 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20  **   (1) It has 
121b0 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53  no LIMIT or OFFS
121c0 45 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20  ET.**   (2) All 
121d0 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
121e0 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
121f0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
12200 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74  Y clause.*/.stat
12210 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
12220 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73  ctValues(.  Pars
12230 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12240 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
12250 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
12260 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12270 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
12280 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
12290 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
122a0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
122b0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
122c0 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
122d0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ults */.){.  Sel
122e0 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69  ect *pPrior;.  i
122f0 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
12300 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
12310 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
12320 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  nt rc = 0;.  ass
12330 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
12340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
12350 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
12360 6c 6c 56 61 6c 75 65 73 20 29 3b 0a 20 20 64 6f  llValues );.  do
12370 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
12380 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56  >selFlags & SF_V
12390 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73  alues );.    ass
123a0 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  ert( p->op==TK_A
123b0 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b  LL || (p->op==TK
123c0 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50  _SELECT && p->pP
123d0 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20  rior==0) );.    
123e0 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
123f0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t==0 );.    asse
12400 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
12410 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
12420 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 6e  pEList->nExpr!=n
12430 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 65  Expr ){.      se
12440 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d  lectWrongNumTerm
12450 73 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  sError(pParse, p
12460 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12470 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
12480 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
12490 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
124a0 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  t( p->pPrior->pN
124b0 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20  ext==p );.    p 
124c0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
124d0 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c   nRow++;.  }whil
124e0 65 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  e(1);.  while( p
124f0 20 29 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   ){.    pPrior =
12500 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
12510 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
12520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
12530 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
12540 20 70 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e   pDest);.    p->
12550 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
12560 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
12570 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  eak;.    p->nSel
12580 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  ectRow = nRow;. 
12590 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
125a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
125b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
125c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
125d0 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63  d to process a c
125e0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f  ompound query fo
125f0 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f  rm from.** two o
12600 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
12610 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e  queries using UN
12620 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  ION, UNION ALL, 
12630 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e  EXCEPT, or.** IN
12640 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70  TERSECT.**.** "p
12650 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
12660 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
12670 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
12680 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
12690 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70  .** left is p->p
126a0 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74  Prior.  The left
126b0 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73   query could als
126c0 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  o be a compound 
126d0 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63  query.** in whic
126e0 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  h case this rout
126f0 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
12700 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
12710 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
12720 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  ts of the total 
12730 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20  query are to be 
12740 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64  written into a d
12750 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  estination.** of
12760 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68   type eDest with
12770 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d   parameter iParm
12780 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
12790 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74  1:  Consider a t
127a0 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e  hree-way compoun
127b0 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
127c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
127d0 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
127e0 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
127f0 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
12800 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20  c FROM t3.**.** 
12810 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
12820 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66  s parsed up as f
12830 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12840 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20    SELECT c FROM 
12850 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20  t3.**      |.** 
12860 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45       `----->  SE
12870 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a  LECT b FROM t2.*
12880 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12890 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
128a0 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53       `------>  S
128b0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a  ELECT a FROM t1.
128c0 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73  **.** The arrows
128d0 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20   in the diagram 
128e0 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20  above represent 
128f0 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f  the Select.pPrio
12900 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f  r pointer..** So
12910 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
12920 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
12930 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  p equal to the t
12940 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  3 query, then.**
12950 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20   pPrior will be 
12960 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70  the t2 query.  p
12970 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f  ->op will be TK_
12980 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61  UNION in this ca
12990 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65  se..**.** Notice
129a0 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66   that because of
129b0 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20   the way SQLite 
129c0 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20  parses compound 
129d0 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20  SELECTs, the.** 
129e0 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
129f0 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20  ts always group 
12a00 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
12a10 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ht..*/.static in
12a20 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20  t multiSelect(. 
12a30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12a40 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12a50 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
12a60 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
12a70 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
12a80 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
12a90 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
12aa0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
12ab0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
12ac0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
12ad0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
12ae0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12af0 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65  E_OK;   /* Succe
12b00 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
12b10 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
12b20 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
12b30 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
12b40 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
12b50 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
12b60 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
12b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
12b80 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
12b90 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
12ba0 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
12bb0 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76     /* Alternativ
12bc0 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69  e data destinati
12bd0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
12be0 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a  pDelete = 0;  /*
12bf0 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65   Chain of simple
12c00 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65   selects to dele
12c10 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
12c20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
12c30 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
12c40 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20  tion */.#ifndef 
12c50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
12c60 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20  AIN.  int iSub1 
12c70 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
12c80 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
12c90 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
12ca0 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20  t iSub2 = 0;    
12cb0 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
12cc0 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
12cd0 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  y */.#endif..  /
12ce0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
12cf0 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
12d00 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
12d10 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
12d20 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
12d30 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
12d40 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
12d50 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
12d60 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
12d70 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
12d80 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
12d90 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
12da0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
12db0 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
12dc0 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ch */.  assert( 
12dd0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
12de0 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20  F_Recursive)==0 
12df0 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  || p->op==TK_ALL
12e00 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   || p->op==TK_UN
12e10 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  ION );.  db = pP
12e20 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69  arse->db;.  pPri
12e30 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
12e40 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b    dest = *pDest;
12e50 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
12e60 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
12e70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12e80 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20  Parse,"ORDER BY 
12e90 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
12ea0 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
12eb0 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
12ec0 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
12ed0 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
12ee0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
12ef0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
12f00 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
12f10 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
12f20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12f30 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
12f40 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
12f50 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
12f60 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
12f70 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
12f80 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
12f90 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
12fa0 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
12fb0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12fc0 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
12fd0 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
12fe0 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
12ff0 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
13000 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
13010 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
13020 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
13030 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
13040 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
13050 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
13060 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
13070 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13080 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
13090 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
130a0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
130b0 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  al, dest.iSDParm
130c0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
130d0 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
130e0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
130f0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
13100 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74  ;.    dest.eDest
13110 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
13120 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
13130 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63  handling for a c
13140 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74  ompound-select t
13150 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61  hat originates a
13160 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  s a VALUES claus
13170 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
13180 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
13190 6c 6c 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20  llValues ){.    
131a0 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
131b0 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70  Values(pParse, p
131c0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f  , &dest);.    go
131d0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
131e0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
131f0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
13200 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
13210 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
13220 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
13230 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
13240 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
13250 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13260 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
13270 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
13280 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
13290 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
132a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
132b0 0a 20 20 20 20 73 65 6c 65 63 74 57 72 6f 6e 67  .    selectWrong
132c0 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70 50  NumTermsError(pP
132d0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 72 63  arse, p);.    rc
132e0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
132f0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13300 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
13310 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
13320 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
13330 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
13340 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69  {.    generateWi
13350 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
13360 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
13370 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  t);.  }else.#end
13380 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e  if..  /* Compoun
13390 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
133a0 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
133b0 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
133c0 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
133d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
133e0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
133f0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
13400 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
13410 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , pDest);.  }els
13420 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  e..  /* Generate
13430 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
13440 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
13450 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
13460 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
13470 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
13480 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
13490 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
134a0 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
134b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
134c0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
134d0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
134e0 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  iLimit = p->iLim
134f0 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
13500 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
13510 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50  Offset;.      pP
13520 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
13530 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
13540 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
13550 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
13560 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13570 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
13580 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13590 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
135a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
135b0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
135c0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
135d0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
135e0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
135f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
13600 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
13610 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
13620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
13630 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
13640 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
13650 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
13660 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
13670 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
13680 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  t;.      if( p->
13690 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
136a0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
136b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
136c0 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69  _IfNot, p->iLimi
136d0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
136e0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
136f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75  eComment((v, "Ju
13700 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
13710 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
13720 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c      }.      expl
13730 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
13740 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
13750 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
13760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
13770 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
13780 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74   &dest);.      t
13790 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
137a0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
137b0 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
137c0 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
137d0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
137e0 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
137f0 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
13800 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
13810 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
13820 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  it.       && sql
13830 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
13840 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
13850 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20  , &nLimit).     
13860 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26    && nLimit>0 &&
13870 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
13880 20 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20   (u64)nLimit .  
13890 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
138a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
138b0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
138c0 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
138d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
138e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
138f0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
13900 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13910 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
13920 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
13930 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
13940 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
13950 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
13960 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
13970 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
13980 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
13990 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
139a0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
139b0 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
139c0 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
139d0 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
139e0 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
139f0 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
13a00 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
13a10 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
13a20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
13a30 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
13a40 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
13a50 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
13a60 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
13a70 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
13a80 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
13a90 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
13aa0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
13ab0 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
13ac0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
13ad0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
13ae0 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
13af0 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
13b00 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
13b10 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
13b20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
13b30 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
13b40 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
13b50 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
13b60 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
13b70 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
13b80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13b90 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
13ba0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
13bb0 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
13bc0 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
13bd0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13be0 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
13bf0 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
13c00 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
13c10 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
13c20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
13c30 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
13c40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
13c50 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
13c60 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
13c70 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13c80 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
13c90 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
13ca0 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
13cb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13cc0 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
13cd0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
13ce0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13cf0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
13d00 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
13d10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13d20 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
13d30 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
13d40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13d50 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
13d60 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
13d70 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
13d80 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
13d90 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
13da0 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
13db0 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
13dc0 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
13dd0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13de0 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
13df0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
13e00 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13e10 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
13e20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
13e30 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
13e40 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
13e50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
13e60 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
13e70 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
13e80 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  Tab);.      expl
13e90 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
13ea0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
13eb0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
13ec0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
13ed0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
13ee0 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
13ef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
13f00 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
13f10 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13f20 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13f30 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
13f40 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
13f50 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
13f60 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
13f70 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
13f80 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
13f90 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
13fa0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
13fb0 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
13fc0 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
13fd0 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
13fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
13ff0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
14000 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
14010 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
14020 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
14030 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
14040 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
14050 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
14060 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
14070 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78  t = op;.      ex
14080 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
14090 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
140a0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
140b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
140c0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
140d0 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
140e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
140f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
14100 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
14110 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
14120 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
14130 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
14140 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
14150 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
14160 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
14170 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
14180 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
14190 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
141a0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
141b0 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
141c0 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
141d0 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
141e0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
141f0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
14200 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
14210 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
14220 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e  =TK_UNION ) p->n
14230 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
14240 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
14250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14260 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
14270 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
14280 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
14290 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
142a0 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
142b0 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
142c0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
142d0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  fset = 0;..     
142e0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
142f0 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
14300 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
14310 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
14320 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
14330 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
14340 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
14350 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
14360 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50  onTab==dest.iSDP
14370 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73  arm || dest.eDes
14380 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20  t!=priorOp );.  
14390 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
143a0 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st!=priorOp ){. 
143b0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
143c0 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
143d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
143e0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
143f0 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
14400 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
14410 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  t ){.          S
14420 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
14430 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
14440 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
14450 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
14460 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
14470 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
14480 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
14490 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
144a0 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
144b0 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
144c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
144d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
144e0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
144f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14500 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
14510 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
14520 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
14530 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
14540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14550 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
14560 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
14570 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14580 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
14590 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
145a0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
145b0 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
145c0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
145d0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
145e0 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  onTab,.         
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
14600 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
14610 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
14620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14630 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
14640 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
14650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14660 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
14670 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
14680 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14690 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
146a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
146b0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
146c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
146d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
146e0 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
146f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14700 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14710 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
14720 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
14730 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
14740 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
14750 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
14760 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
14770 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
14780 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
14790 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
147a0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
147b0 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
147c0 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
147d0 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
147e0 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
147f0 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
14800 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
14810 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
14820 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
14830 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
14840 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
14850 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
14860 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
14870 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
14880 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
14890 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
148a0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
148b0 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
148c0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
148d0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
148e0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
148f0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14900 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
14910 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
14920 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
14930 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
14940 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
14950 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
14960 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
14970 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
14980 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
14990 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
149a0 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
149b0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
149c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
149d0 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
149e0 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
149f0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
14a00 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
14a10 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
14a20 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
14a30 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
14a40 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
14a50 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14a60 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
14a70 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14a80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14a90 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14aa0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
14ab0 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
14ac0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
14ad0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
14ae0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
14af0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
14b00 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
14b10 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
14b20 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
14b30 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
14b40 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
14b50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14b60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
14b70 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
14b80 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
14b90 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
14ba0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
14bb0 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
14bc0 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
14bd0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
14be0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
14bf0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
14c00 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
14c10 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
14c20 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
14c30 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
14c40 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
14c50 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
14c60 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
14c70 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
14c80 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14c90 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
14ca0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
14cb0 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
14cc0 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
14cd0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14ce0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
14cf0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
14d00 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14d10 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
14d20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
14d30 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
14d40 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
14d50 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
14d60 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
14d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14d80 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
14d90 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
14da0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
14db0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
14dc0 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a  set = pOffset;..
14dd0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
14de0 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
14df0 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
14e00 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
14e10 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
14e20 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
14e30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14e40 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
14e50 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
14e60 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
14e70 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
14e80 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
14e90 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
14ea0 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
14eb0 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
14ec0 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
14ed0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
14ee0 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
14ef0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
14f00 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20   }.      iBreak 
14f10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14f20 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
14f30 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
14f40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14f50 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
14f60 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
14f70 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
14f80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14f90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14fa0 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
14fb0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
14fc0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31  age(v);.      r1
14fd0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14fe0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
14ff0 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
15000 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15010 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62  , OP_RowKey, tab
15020 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  1, r1);.      sq
15030 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
15040 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
15050 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20  d, tab2, iCont, 
15060 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  r1, 0); VdbeCove
15070 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
15080 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15090 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
150a0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
150b0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
150c0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
150d0 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b1,.            
150e0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
150f0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
15100 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
15110 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15120 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
15130 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15140 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
15150 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
15160 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15170 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
15180 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15190 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
151a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
151b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
151c0 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
151d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
151e0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
151f0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
15200 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15210 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d   }..  explainCom
15220 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
15230 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
15240 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  b2, p->op!=TK_AL
15250 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  L);..  /* Comput
15260 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
15270 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
15280 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
15290 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
152a0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
152b0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
152c0 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
152d0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
152e0 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
152f0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
15300 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
15310 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
15320 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
15330 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
15340 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
15350 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
15360 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
15370 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
15380 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
15390 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
153a0 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
153b0 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
153c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
153d0 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
153e0 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
153f0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
15400 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
15410 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
15420 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15440 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15450 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
15460 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
15470 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
15480 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
15490 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
154a0 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
154b0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
154c0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
154d0 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
154e0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
154f0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
15500 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
15510 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
15520 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
15530 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
15540 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
15550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15560 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
15570 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
15580 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
15590 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
155a0 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
155b0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
155c0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
155d0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
155e0 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
155f0 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
15600 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
15610 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15620 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
15630 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
15640 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  }.    for(i=0, a
15650 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
15660 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
15670 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
15680 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
15690 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
156a0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
156b0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
156c0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
156d0 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   *apColl = db->p
156e0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
156f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
15700 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
15710 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
15720 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  rior){.      for
15730 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
15740 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
15750 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  r = pLoop->addrO
15760 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20  penEphm[i];.    
15770 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29      if( addr<0 )
15780 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
15790 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20  f [0] is unused 
157a0 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f  then [1] is also
157b0 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20   unused.  So we 
157c0 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  can.          **
157d0 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61   always safely a
157e0 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20  bort as soon as 
157f0 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64  the first unused
15800 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a   slot is found *
15810 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
15820 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  rt( pLoop->addrO
15830 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a  penEphm[1]<0 );.
15840 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
15870 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
15880 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
15890 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
158a0 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P4(v, addr, (cha
158b0 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
158c0 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a  oRef(pKeyInfo),.
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
158f0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
15900 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
15910 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[i] = -1;.  
15920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15930 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
15940 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ref(pKeyInfo);. 
15950 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
15960 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69  _end:.  pDest->i
15970 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73  Sdst = dest.iSds
15980 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  t;.  pDest->nSds
15990 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a  t = dest.nSdst;.
159a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
159b0 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74  elete(db, pDelet
159c0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
159d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
159e0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
159f0 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
15a00 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
15a10 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
15a20 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
15a30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
15a40 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
15a50 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
15a60 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
15a70 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
15a80 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68   pIn->iSdst.  Th
15a90 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e  ere are.** pIn->
15aa0 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f  nSdst columns to
15ab0 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
15ac0 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
15ad0 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
15ae0 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
15af0 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
15b00 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
15b10 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
15b20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
15b30 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
15b40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
15b50 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
15b60 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
15b70 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
15b80 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
15b90 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
15ba0 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
15bb0 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
15bc0 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
15bd0 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
15be0 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
15bf0 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
15c00 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
15c10 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
15c20 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
15c30 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
15c40 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
15c50 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
15c60 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
15c70 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
15c80 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
15c90 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
15ca0 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
15cb0 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
15cc0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
15cd0 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
15ce0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
15cf0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
15d00 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
15d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
15d20 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
15d30 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
15d40 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
15d50 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
15d60 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
15d70 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
15d80 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
15d90 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
15da0 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
15db0 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
15dc0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
15dd0 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
15de0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
15df0 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
15e00 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
15e10 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
15e20 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
15e30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
15e40 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
15e50 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
15e60 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
15e70 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ry */.  int iBre
15e80 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
15e90 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
15ea0 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
15eb0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
15ec0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
15ed0 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
15ee0 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
15ef0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
15f00 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15f10 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
15f20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15f30 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
15f40 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
15f50 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
15f60 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
15f70 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
15f80 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
15f90 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20   int j1, j2;.   
15fa0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
15fb0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
15fc0 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56  Not, regPrev); V
15fd0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15fe0 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33      j2 = sqlite3
15ff0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16000 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
16010 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
16020 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20   pIn->nSdst,.   
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
16050 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
16060 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
16070 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
16080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16090 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32  3(v, OP_Jump, j2
160a0 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a  +2, iContinue, j
160b0 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  2+2); VdbeCovera
160c0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
160d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
160e0 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , j1);.    sqlit
160f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16100 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53  OP_Copy, pIn->iS
16110 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
16120 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20  pIn->nSdst-1);. 
16130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16140 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
16150 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
16160 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
16170 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
16180 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
16190 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
161a0 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
161b0 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
161c0 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
161d0 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
161e0 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
161f0 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
16200 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  ;..  switch( pDe
16210 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
16220 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
16230 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
16240 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
16250 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16260 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
16270 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
16280 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
16290 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
162a0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
162b0 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
162c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
162d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74  pParse);.      t
162e0 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e  estcase( pDest->
162f0 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
16300 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16310 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  se( pDest->eDest
16320 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
16330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16340 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16350 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
16360 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16370 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  st, r1);.      s
16380 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16390 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
163a0 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
163b0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
163c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
163d0 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73   OP_Insert, pDes
163e0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20  t->iSDParm, r1, 
163f0 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
16400 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
16410 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
16420 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16430 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16440 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
16450 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16460 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16470 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
16480 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
16490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
164a0 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
164b0 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
164c0 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
164d0 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
164e0 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
164f0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
16500 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
16510 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
16520 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
16530 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
16540 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
16550 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
16560 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
16570 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
16580 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
16590 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
165a0 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  dst==1 );.      
165b0 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
165c0 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74   .         sqlit
165d0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
165e0 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
165f0 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
16600 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  affSdst);.      
16610 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
16620 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
16630 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16640 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
16650 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
16660 53 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44  Sdst, 1, r1, &pD
16670 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b  est->affSdst,1);
16680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16690 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
166a0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
166b0 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20  n->iSdst, 1);.  
166c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
166d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
166e0 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
166f0 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  DParm, r1);.    
16700 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16710 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16720 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
16730 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20  ;.    }..#if 0  
16740 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20  /* Never occurs 
16750 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71  on an ORDER BY q
16760 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  uery */.    /* I
16770 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
16780 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
16790 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
167a0 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
167b0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
167c0 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
167d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
167e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
167f0 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 53  er, 1, pDest->iS
16800 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  DParm);.      /*
16810 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
16820 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
16830 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
16840 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
16850 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
16860 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
16870 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
16880 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
16890 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
168a0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
168b0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
168c0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
168d0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
168e0 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
168f0 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
16900 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
16910 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
16920 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
16930 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20  ->nSdst==1 );.  
16940 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16950 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
16960 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
16970 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a  t->iSDParm, 1);.
16980 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
16990 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
169a0 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
169b0 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
169c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
169d0 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
169e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
169f0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
16a00 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
16a10 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
16a20 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
16a30 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
16a40 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
16a50 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Sdst.  Then the 
16a60 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64  co-routine yield
16a70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
16a80 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
16a90 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  : {.      if( pD
16aa0 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
16ab0 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16ac0 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47  iSdst = sqlite3G
16ad0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
16ae0 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  se, pIn->nSdst);
16af0 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16b00 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64  nSdst = pIn->nSd
16b10 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
16b20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16b30 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
16b40 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
16b50 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e  >iSdst, pDest->n
16b60 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
16b70 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16b80 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
16b90 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
16ba0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16bb0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20  .    /* If none 
16bc0 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68  of the above, th
16bd0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65  en the result de
16be0 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62  stination must b
16bf0 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74  e.    ** SRT_Out
16c00 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  put.  This routi
16c10 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
16c20 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
16c30 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61  r.    ** destina
16c40 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
16c50 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64  the ones handled
16c60 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75   above or SRT_Ou
16c70 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tput..    **.   
16c80 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70   ** For SRT_Outp
16c90 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20  ut, results are 
16ca0 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
16cb0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16cc0 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e  s.  .    ** Then
16cd0 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
16ce0 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  w opcode is used
16cf0 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65   to cause sqlite
16d00 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20  3_step() to.    
16d10 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65  ** return the ne
16d20 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  xt row of result
16d30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
16d40 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
16d50 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
16d60 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
16d70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16d80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16d90 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
16da0 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
16db0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16dc0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
16dd0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
16de0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
16df0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
16e00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
16e10 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
16e20 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
16e30 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
16e40 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
16e50 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
16e60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
16e70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16e80 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d  DecrJumpZero, p-
16e90 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
16ea0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16eb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
16ec0 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
16ed0 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
16ee0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
16ef0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
16f00 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
16f10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16f20 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
16f30 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
16f40 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
16f50 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
16f60 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
16f70 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
16f80 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
16f90 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
16fa0 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
16fb0 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
16fc0 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
16fd0 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
16fe0 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
16ff0 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
17000 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
17010 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
17020 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
17030 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
17040 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
17050 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
17060 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
17070 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
17080 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
17090 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
170a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
170b0 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
170c0 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
170d0 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
170e0 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
170f0 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
17100 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
17110 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
17120 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
17130 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
17140 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
17150 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
17160 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
17170 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
17180 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
17190 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
171a0 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
171b0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
171c0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
171d0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
171e0 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
171f0 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
17200 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
17210 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
17220 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
17230 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
17240 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
17250 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
17260 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
17270 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
17280 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
17290 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
172a0 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
172b0 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
172c0 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
172d0 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
172e0 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
172f0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
17300 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
17310 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
17320 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
17330 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
17340 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
17350 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
17360 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
17370 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
17380 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
17390 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
173a0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
173b0 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
173c0 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
173d0 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
173e0 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
173f0 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
17400 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
17410 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
17420 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
17430 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
17440 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
17450 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
17460 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
17470 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
17480 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
17490 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
174a0 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
174b0 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
174c0 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
174d0 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
174e0 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
174f0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
17500 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
17510 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
17520 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
17530 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
17540 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
17550 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
17560 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
17570 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
17580 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
17590 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
175a0 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
175b0 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
175c0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
175d0 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
175e0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
175f0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
17600 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
17610 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
17620 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
17630 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
17640 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
17650 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
17660 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
17670 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
17680 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
17690 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
176a0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
176b0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
176c0 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
176d0 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
176e0 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
176f0 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
17700 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
17710 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
17720 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
17730 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
17740 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
17750 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
17760 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
17770 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
17780 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
17790 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
177a0 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
177b0 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
177c0 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
177d0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
177e0 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
177f0 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
17800 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
17810 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
17820 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
17830 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
17840 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
17850 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
17860 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
17870 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
17880 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
17890 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
178a0 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
178b0 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
178c0 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
178d0 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
178e0 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
178f0 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
17900 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
17910 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17920 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
17930 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
17940 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
17950 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
17960 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
17970 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
17980 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
17990 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
179a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
179b0 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
179c0 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
179d0 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
179e0 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
179f0 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
17a00 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
17a10 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
17a20 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
17a30 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
17a40 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
17a50 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
17a60 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
17a70 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
17a80 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
17a90 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
17aa0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
17ab0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
17ac0 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
17ad0 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
17ae0 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
17af0 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
17b00 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
17b10 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
17b20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
17b30 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
17b40 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
17b50 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
17b60 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
17b70 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
17b80 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
17b90 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
17ba0 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
17bb0 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
17bc0 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
17bd0 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
17be0 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
17bf0 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
17c00 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
17c10 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
17c20 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
17c30 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
17c40 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
17c50 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
17c60 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
17c70 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
17c80 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
17c90 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
17ca0 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
17cb0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
17cc0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
17cd0 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
17ce0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
17cf0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
17d00 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
17d10 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
17d20 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
17d30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
17d40 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
17d50 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
17d60 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
17d70 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
17d80 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
17d90 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
17da0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
17db0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
17dc0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17dd0 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
17de0 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
17df0 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
17e00 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
17e10 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
17e20 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
17e30 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
17e40 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
17e50 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
17e60 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
17e70 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
17e80 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
17e90 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
17ea0 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
17eb0 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
17ec0 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
17ed0 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
17ee0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
17ef0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
17f00 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
17f10 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20  nt regAddrB;    
17f20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
17f30 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
17f40 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
17f50 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
17f60 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
17f70 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
17f80 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
17f90 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
17fa0 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
17fb0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
17fc0 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
17fd0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
17fe0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
17ff0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
18000 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
18010 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18020 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
18030 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18040 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
18050 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
18060 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18070 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
18080 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18090 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
180a0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
180b0 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
180c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
180d0 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
180e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
180f0 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
18100 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
18110 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
18120 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
18130 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18140 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a  EofA_noB;     /*
18150 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45   Alternate addrE
18160 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e  ofA if B is unin
18170 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
18180 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20  nt addrEofB;    
18190 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
181a0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d  of the select-B-
181b0 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
181c0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
181d0 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20  drAltB;         
181e0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
181f0 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65  e A<B subroutine
18200 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65   */.  int addrAe
18210 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  qB;         /* A
18220 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d  ddress of the A=
18230 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  =B subroutine */
18240 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b  .  int addrAgtB;
18250 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18260 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73  ess of the A>B s
18270 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18280 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20  nt regLimitA;   
18290 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
182a0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
182b0 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
182c0 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f  LimitB;        /
182d0 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
182e0 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
182f0 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20  .  int regPrev; 
18300 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61           /* A ra
18310 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
18320 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75   to hold previou
18330 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  s output */.  in
18340 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20  t savedLimit;   
18350 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
18360 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20  ue of p->iLimit 
18370 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66  */.  int savedOf
18380 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61  fset;      /* Sa
18390 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
183a0 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74  iOffset */.  int
183b0 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20   labelCmpr;     
183c0 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
183d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
183e0 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d   merge algorithm
183f0 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45   */.  int labelE
18400 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  nd;         /* L
18410 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64  abel for the end
18420 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   of the overall 
18430 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20  SELECT stmt */. 
18440 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20   int j1;        
18450 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69         /* Jump i
18460 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
18470 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64   get retargetted
18480 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
18490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
184a0 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b  ne of TK_ALL, TK
184b0 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
184c0 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  T, TK_INTERSECT 
184d0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
184e0 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f  eyDup = 0; /* Co
184f0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
18500 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
18510 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20  te removal */.  
18520 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72  KeyInfo *pKeyMer
18530 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ge;   /* Compari
18540 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
18550 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73  for merging rows
18560 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
18570 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
18580 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18590 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
185a0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
185b0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
185c0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ause */.  int nO
185d0 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
185e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
185f0 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
18600 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
18610 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
18620 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
18630 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65  from ORDER BY te
18640 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65  rms to result se
18650 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66  t columns */.#if
18660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18670 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
18680 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
18690 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
186a0 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
186b0 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
186c0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
186d0 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
186e0 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
186f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
18700 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
18710 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
18720 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
18730 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
18740 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
18750 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
18760 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
18770 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
18780 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
18790 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79        /* Already
187a0 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f   thrown the erro
187b0 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20  r if VDBE alloc 
187c0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65  failed */.  labe
187d0 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
187e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
187f0 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71    labelCmpr = sq
18800 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
18810 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61  el(v);...  /* Pa
18820 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52  tch up the ORDER
18830 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a   BY clause.  */.
18840 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a    op = p->op;  .
18850 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
18860 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
18870 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
18880 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42  ==0 );.  pOrderB
18890 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
188a0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
188b0 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42  rBy );.  nOrderB
188c0 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
188d0 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f  xpr;..  /* For o
188e0 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74  perators other t
188f0 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65  han UNION ALL we
18900 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75   have to make su
18910 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
18920 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18930 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65   covers every te
18940 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
18950 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20   set.  Add.  ** 
18960 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44  terms to the ORD
18970 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20  ER BY clause as 
18980 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
18990 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c    if( op!=TK_ALL
189a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
189b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
189c0 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45  d==0 && i<=p->pE
189d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
189e0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
189f0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18a00 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
18a10 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  j=0, pItem=pOrde
18a20 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72  rBy->a; j<nOrder
18a30 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; j++, pItem++
18a40 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
18a50 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
18a60 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
18a70 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
18a80 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
18a90 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==i ) break;.  
18aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18ab0 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  j==nOrderBy ){. 
18ac0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
18ad0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
18ae0 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
18af0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
18b00 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
18b10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18b20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
18b30 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
18b40 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
18b50 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20  >u.iValue = i;. 
18b60 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20         pOrderBy 
18b70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
18b80 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
18b90 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
18ba0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
18bb0 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
18bc0 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
18bd0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
18be0 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
18bf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
18c00 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
18c10 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
18c20 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
18c30 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
18c40 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
18c50 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
18c60 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
18c70 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
18c80 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
18c90 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
18ca0 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
18cb0 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
18cc0 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
18cd0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18ce0 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
18cf0 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
18d00 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
18d10 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
18d20 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
18d30 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
18d40 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
18d50 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
18d60 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
18d70 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
18d80 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72   sizeof(int)*nOr
18d90 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50  derBy);.  if( aP
18da0 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74  ermute ){.    st
18db0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
18dc0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66  em *pItem;.    f
18dd0 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(i=0, pItem=pO
18de0 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72  rderBy->a; i<nOr
18df0 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
18e00 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
18e10 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
18e20 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20  OrderByCol>0.   
18e30 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d         && pItem-
18e40 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
18e50 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
18e60 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72  pr );.      aPer
18e70 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  mute[i] = pItem-
18e80 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
18e90 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
18ea0 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74  pKeyMerge = mult
18eb0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
18ec0 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
18ed0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
18ee0 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
18ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
18f00 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
18f10 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
18f20 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
18f30 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
18f40 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
18f50 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
18f60 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
18f70 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
18f80 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
18f90 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
18fa0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
18fb0 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
18fc0 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
18fd0 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
18fe0 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
18ff0 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
19000 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
19010 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
19020 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
19030 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
19040 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
19050 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
19060 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
19070 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
19080 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
19090 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
190a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
190b0 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
190c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
190d0 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
190e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
190f0 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
19100 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
19110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19120 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19130 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
19140 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
19150 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
19160 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31  loc(db, nExpr, 1
19170 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
19180 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  up ){.      asse
19190 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
191a0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
191b0 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20  eyDup) );.      
191c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
191d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
191e0 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
191f0 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
19200 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
19210 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
19220 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
19230 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
19240 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
19250 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
19260 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
19270 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
19280 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
19290 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
192a0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
192b0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
192c0 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
192d0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
192e0 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
192f0 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
19300 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
19310 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
19320 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
19330 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
19340 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
19350 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
19360 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
19370 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
19380 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
19390 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
193a0 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
193b0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
193c0 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
193d0 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
193e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
193f0 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
19400 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19420 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
19430 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
19440 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
19450 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
19460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
19480 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
19490 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
194a0 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
194b0 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
194c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
194d0 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
194e0 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
194f0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
19500 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
19510 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
19520 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
19530 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
19540 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66  ffset);.  p->pOf
19550 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  fset = 0;..  reg
19560 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
19570 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
19580 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
19590 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
195a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
195b0 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
195c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
195d0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
195e0 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
195f0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
19600 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
19610 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
19620 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
19630 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
19640 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19650 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
19660 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
19670 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
19680 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
19690 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
196a0 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
196b0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
196c0 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
196d0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
196e0 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a  Addr(v) + 1;.  j
196f0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
19700 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
19710 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19720 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drA, 0, addrSele
19730 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctA);.  VdbeComm
19740 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45  ent((v, "left SE
19750 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f  LECT"));.  pPrio
19760 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  r->iLimit = regL
19770 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e  imitA;.  explain
19780 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
19790 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
197a0 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
197b0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
197c0 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41  , pPrior, &destA
197d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
197e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
197f0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19800 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drA);.  sqlite3V
19810 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
19820 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  1);..  /* Genera
19830 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
19840 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
19850 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
19860 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
19870 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
19880 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
19890 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
198a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
198b0 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73  v) + 1;.  j1 = s
198c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
198d0 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
198e0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20  tine, regAddrB, 
198f0 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  0, addrSelectB);
19900 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
19910 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54  v, "right SELECT
19920 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69  "));.  savedLimi
19930 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
19940 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70   savedOffset = p
19950 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
19960 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
19970 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  tB;.  p->iOffset
19980 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69   = 0;  .  explai
19990 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
199a0 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
199b0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c  SelectId);.  sql
199c0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
199d0 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20  e, p, &destB);. 
199e0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76   p->iLimit = sav
199f0 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f  edLimit;.  p->iO
19a00 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66  ffset = savedOff
19a10 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  set;.  sqlite3Vd
19a20 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
19a30 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  ndCoroutine, reg
19a40 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65  AddrB);..  /* Ge
19a50 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19a60 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
19a70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
19a80 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
19a90 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
19aa0 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
19ab0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
19ac0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
19ad0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
19ae0 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
19af0 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
19b00 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
19b10 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
19b20 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
19b30 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
19b40 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
19b50 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
19b60 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
19b70 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
19b80 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
19b90 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
19ba0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
19bb0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
19bc0 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
19bd0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
19be0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
19bf0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
19c00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
19c10 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
19c20 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
19c30 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19c40 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
19c50 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
19c60 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
19c70 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
19c80 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
19ca0 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
19cb0 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
19cc0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
19cd0 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
19ce0 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  End);.  }.  sqli
19cf0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
19d00 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20  pKeyDup);..  /* 
19d10 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19d20 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
19d30 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
19d40 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
19d50 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
19d60 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
19d70 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
19d80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
19d90 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
19da0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
19db0 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  {.    addrEofA_n
19dc0 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20  oB = addrEofA = 
19dd0 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73  labelEnd;.  }els
19de0 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
19df0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
19e00 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
19e10 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20  );.    addrEofA 
19e20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19e30 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
19e40 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
19e50 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  tB);.    addrEof
19e60 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56  A_noB = sqlite3V
19e70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19e80 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
19e90 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ec0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19ee0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19ef0 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29  to, 0, addrEofA)
19f00 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
19f10 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
19f20 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a  SelectRow;.  }..
19f30 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19f40 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
19f50 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
19f60 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42  ts from select B
19f70 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
19f80 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
19f90 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65  a in select A re
19fa0 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
19fb0 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
19fc0 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
19fd0 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20  fB = addrEofA;. 
19fe0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
19ff0 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e  tRow > pPrior->n
1a000 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
1a010 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
1a020 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
1a030 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1a040 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a050 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75  v, "eof-B subrou
1a060 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1a070 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56  rEofB = sqlite3V
1a080 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a090 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
1a0a0 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
1a0b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a0c0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1a0d0 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64  gAddrA, labelEnd
1a0e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a0f0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1a100 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a110 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
1a120 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
1a130 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1a140 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1a150 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
1a160 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a170 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
1a180 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
1a190 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1a1a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1a1b0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1a1c0 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
1a1d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a1e0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1a1f0 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64  A, addrEofA); Vd
1a200 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a220 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1a230 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1a240 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a250 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1a260 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
1a270 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1a280 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
1a290 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1a2a0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
1a2b0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1a2c0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1a2d0 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
1a2e0 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
1a2f0 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1a300 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
1a310 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1a320 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
1a330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a340 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a350 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1a360 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1a370 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1a380 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a390 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
1a3a0 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
1a3b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1a3c0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1a3d0 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
1a3e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1a3f0 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
1a400 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1a410 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
1a420 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1a430 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
1a440 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
1a450 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
1a460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a470 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1a480 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1a490 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1a4a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a4b0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1a4c0 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1a4d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1a4e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a4f0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
1a500 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1a510 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f  This code runs o
1a520 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
1a530 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20  e everything..  
1a540 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1a550 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
1a560 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a570 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a580 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1a590 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43  EofA_noB); VdbeC
1a5a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1a5b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a5c0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a5d0 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1a5e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a5f0 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
1a600 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
1a610 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
1a620 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1a630 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
1a640 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
1a650 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
1a660 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
1a670 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
1a680 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
1a690 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
1a6a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1a6b0 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
1a6c0 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
1a6d0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6f0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
1a700 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
1a710 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a720 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
1a730 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73  AG_PERMUTE);.  s
1a740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a750 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
1a760 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c  rAltB, addrAeqB,
1a770 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65   addrAgtB); Vdbe
1a780 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1a790 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
1a7a0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
1a7b0 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
1a7c0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1a7d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1a7e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1a7f0 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65  elEnd);..  /* Se
1a800 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1a810 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20  output columns. 
1a820 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
1a830 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
1a840 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ut ){.    Select
1a850 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f   *pFirst = pPrio
1a860 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46  r;.    while( pF
1a870 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
1a880 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
1a890 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65  pPrior;.    gene
1a8a0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
1a8b0 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
1a8c0 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t->pEList);.  }.
1a8d0 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
1a8e0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
1a8f0 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
1a900 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
1a910 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
1a920 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1a930 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
1a940 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
1a950 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1a960 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  e(db, p->pPrior)
1a970 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f  ;.  }.  p->pPrio
1a980 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50  r = pPrior;.  pP
1a990 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
1a9a0 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
1a9b0 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
1a9c0 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
1a9d0 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
1a9e0 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
1a9f0 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
1aa00 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
1aa10 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20  (pParse, p->op, 
1aa20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29  iSub1, iSub2, 0)
1aa30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1aa40 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
1aa50 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1aa60 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1aa70 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1aa80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1aa90 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c  ./* Forward Decl
1aaa0 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  arations */.stat
1aab0 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
1aac0 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20  rList(sqlite3*, 
1aad0 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20  ExprList*, int, 
1aae0 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
1aaf0 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
1ab00 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65  ect(sqlite3*, Se
1ab10 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
1ab20 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  rList *);../*.**
1ab30 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
1ab40 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
1ab50 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
1ab60 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
1ab70 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
1ab80 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
1ab90 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
1aba0 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
1abb0 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
1abc0 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
1abd0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1abe0 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
1abf0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
1ac00 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1ac10 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
1ac20 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
1ac30 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
1ac40 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
1ac50 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
1ac60 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
1ac70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
1ac80 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
1ac90 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1aca0 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
1acb0 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
1acc0 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
1acd0 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
1ace0 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
1acf0 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
1ad00 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
1ad10 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
1ad20 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
1ad30 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
1ad40 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
1ad50 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1ad60 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
1ad70 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
1ad80 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
1ad90 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
1ada0 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
1adb0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65  db,        /* Re
1adc0 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
1add0 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65  rs to this conne
1ade0 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
1adf0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
1ae00 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
1ae10 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
1ae20 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  urs */.  int iTa
1ae30 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ble,         /* 
1ae40 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
1ae50 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
1ae60 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
1ae70 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65   /* Substitute e
1ae80 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b  xpressions */.){
1ae90 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
1aea0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1aeb0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1aec0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
1aed0 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
1aee0 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
1aef0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
1af00 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1af10 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
1af20 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
1af30 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
1af40 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
1af50 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
1af60 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
1af70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1af80 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
1af90 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
1afa0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
1afb0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
1afc0 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61  up(db, pEList->a
1afd0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1afe0 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
1aff0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1b000 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
1b010 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
1b020 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ew;.    }.  }els
1b030 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  e{.    pExpr->pL
1b040 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  eft = substExpr(
1b050 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
1b060 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b070 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  );.    pExpr->pR
1b080 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72  ight = substExpr
1b090 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  (db, pExpr->pRig
1b0a0 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
1b0b0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  st);.    if( Exp
1b0c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1b0d0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1b0e0 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
1b0f0 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72  Select(db, pExpr
1b100 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61  ->x.pSelect, iTa
1b110 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1b130 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b140 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
1b150 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b160 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b170 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74  turn pExpr;.}.st
1b180 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1b190 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74  xprList(.  sqlit
1b1a0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1b1b0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
1b1c0 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
1b1d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1b1e0 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74  t,     /* List t
1b1f0 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68  o scan and in wh
1b200 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1b210 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74  titutes */.  int
1b220 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1b230 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
1b240 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
1b250 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1b260 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
1b270 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
1b280 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1b290 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1b2a0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1b2b0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1b2c0 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ++){.    pList->
1b2d0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62  a[i].pExpr = sub
1b2e0 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74  stExpr(db, pList
1b2f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
1b300 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b310 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
1b320 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20   substSelect(.  
1b330 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1b340 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
1b350 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
1b360 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
1b370 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
1b380 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1b390 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1b3a0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a   substitutions *
1b3b0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1b3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1b3d0 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  e to be replaced
1b3e0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1b3f0 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
1b400 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
1b410 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
1b420 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20  *pSrc;.  struct 
1b430 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1b440 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
1b450 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
1b460 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
1b470 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
1b480 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b490 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
1b4a0 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
1b4b0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b4c0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
1b4d0 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
1b4e0 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
1b4f0 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e  st);.  p->pHavin
1b500 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
1b510 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
1b520 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b530 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62   p->pWhere = sub
1b540 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
1b550 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
1b560 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
1b570 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
1b580 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
1b590 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  st);.  pSrc = p-
1b5a0 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1b5b0 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65   pSrc );  /* Eve
1b5c0 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29  n for (SELECT 1)
1b5d0 20 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d   we have: pSrc!=
1b5e0 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63  0 but pSrc->nSrc
1b5f0 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ==0 */.  if( ALW
1b600 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20  AYS(pSrc) ){.   
1b610 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1b620 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
1b630 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
1b640 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
1b650 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65  tSelect(db, pIte
1b660 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  m->pSelect, iTab
1b670 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b680 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20   }.  }.}.#endif 
1b690 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
1b6a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1b6b0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1b6c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1b6d0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
1b6e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1b6f0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1b700 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1b710 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  IEW)./*.** This 
1b720 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1b730 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
1b740 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66  ueries as a perf
1b750 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
1b760 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
1b770 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20  utine returns 1 
1b780 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
1b790 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
1b7a0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72  flattening occur
1b7b0 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
1b7c0 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
1b7d0 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
1b7e0 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
1b7f0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
1b800 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
1b810 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
1b820 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
1b830 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
1b840 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
1b850 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
1b860 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
1b870 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
1b880 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
1b890 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
1b8a0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1b8b0 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
1b8c0 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
1b8d0 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
1b8e0 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
1b8f0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1b900 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
1b910 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
1b920 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
1b930 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
1b940 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
1b950 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
1b960 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
1b970 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
1b980 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
1b990 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
1b9a0 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
1b9b0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
1b9c0 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
1b9d0 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
1b9e0 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
1b9f0 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
1ba00 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
1ba10 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1ba20 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
1ba30 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
1ba40 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
1ba50 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
1ba60 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69  or this simplifi
1ba70 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
1ba80 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
1ba90 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
1baa0 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
1bab0 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
1bac0 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
1bad0 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
1bae0 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
1baf0 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
1bb00 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
1bb10 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
1bb20 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
1bb30 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
1bb40 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1bb50 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1bb60 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
1bb70 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
1bb80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1bb90 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
1bba0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1bbb0 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
1bbc0 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1bbd0 67 72 65 67 61 74 65 20 6f 72 20 28 32 61 29 20  gregate or (2a) 
1bbe0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1bbf0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a  is not a join.**
1bc00 20 20 20 20 20 20 20 20 61 6e 64 20 28 32 62 29          and (2b)
1bc10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1bc20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 75   does not use su
1bc30 62 71 75 65 72 69 65 73 20 6f 74 68 65 72 20 74  bqueries other t
1bc40 68 61 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a 20 20  han the one.**  
1bc50 20 20 20 20 20 20 46 52 4f 4d 2d 63 6c 61 75 73        FROM-claus
1bc60 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  e subquery that 
1bc70 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
1bc80 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  or flattening.  
1bc90 28 32 62 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  (2b is.**       
1bca0 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74 20 5b   due to ticket [
1bcb0 32 66 37 31 37 30 64 37 33 62 66 39 61 62 66 38  2f7170d73bf9abf8
1bcc0 30 5d 20 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d  0] from 2015-02-
1bcd0 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  09.).**.**   (3)
1bce0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1bcf0 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
1bd00 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1bd10 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20  t outer join.** 
1bd20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c         (Original
1bd30 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20  ly ticket #306. 
1bd40 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79   Strengthened by
1bd50 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a   ticket #3300).*
1bd60 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1bd70 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1bd80 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1bd90 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1bda0 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1bdb0 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1bdc0 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1bdd0 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1bde0 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1bdf0 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1be00 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1be10 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1be20 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1be30 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1be40 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1be50 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1be60 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1be70 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
1be80 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1be90 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1bea0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1beb0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1bec0 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1bed0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
1bee0 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1bef0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
1bf00 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
1bf10 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
1bf20 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
1bf30 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
1bf40 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
1bf50 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  ose with the spe
1bf60 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1bf70 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1bf80 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1bf90 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1bfa0 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1bfb0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1bfc0 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1bfd0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1bfe0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1bff0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1c000 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1c010 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
1c020 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c030 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1c040 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1c050 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
1c060 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
1c070 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  tes..**.**  (**)
1c080 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31    Restriction (1
1c090 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66  0) was removed f
1c0a0 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20  rom the code on 
1c0b0 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77  2005-02-05 but w
1c0c0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69  e.**        acci
1c0d0 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74  dently carried t
1c0e0 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61  he comment forwa
1c0f0 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39  rd until 2014-09
1c100 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a  -15.  Original.*
1c110 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a 20 22  *        text: "
1c120 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c130 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
1c140 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
1c150 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1c160 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
1c170 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31  IMIT.".**.**  (1
1c180 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1c190 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
1c1a0 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1c1b0 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
1c1c0 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
1c1d0 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65  **)  Not impleme
1c1e0 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20  nted.  Subsumed 
1c1f0 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  into restriction
1c200 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69   (3).  Was previ
1c210 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ously.**        
1c220 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72  a separate restr
1c230 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20  iction deriving 
1c240 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30  from ticket #350
1c250 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ..**.**  (13)  T
1c260 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1c270 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1c280 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1c290 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1c2a0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c2b0 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
1c2c0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54  ..**.**  (15)  T
1c2d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1c2e0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
1c2f0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
1c300 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
1c310 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1c320 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20  ot have a LIMIT 
1c330 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
1c340 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
1c350 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b  339 and ticket [
1c360 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a  02a8e81d44])..**
1c370 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f  .**  (16)  The o
1c380 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1c390 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
1c3a0 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64  r the subquery d
1c3b0 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f  oes.**        no
1c3c0 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
1c3d0 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
1c3e0 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
1c3f0 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
1c400 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
1c410 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
1c420 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
1c430 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
1c440 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71   (17)  The sub-q
1c450 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f  uery is not a co
1c460 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f  mpound select, o
1c470 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20  r it is a UNION 
1c480 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63  ALL .**        c
1c490 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d  ompound clause m
1c4a0 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20  ade up entirely 
1c4b0 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  of non-aggregate
1c4c0 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a   queries, and .*
1c4d0 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72  *        the par
1c4e0 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  ent query:.**.**
1c4f0 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1c500 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f  ot itself part o
1c510 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
1c520 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ect,.**         
1c530 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67   * is not an agg
1c540 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e  regate or DISTIN
1c550 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a  CT query, and.**
1c560 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1c570 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20  ot a join.**.** 
1c580 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
1c590 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
1c5a0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
1c5b0 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
1c5c0 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
1c5d0 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
1c5e0 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
1c5f0 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1c600 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
1c610 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
1c620 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
1c630 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
1c640 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
1c650 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1c660 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
1c670 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
1c680 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
1c690 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
1c6a0 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
1c6b0 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
1c6c0 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
1c6d0 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
1c6e0 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
1c6f0 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
1c700 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
1c710 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
1c720 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
1c730 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
1c740 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
1c750 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
1c760 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
1c770 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
1c780 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
1c790 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1c7a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c7b0 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
1c7c0 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
1c7d0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1c7e0 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
1c7f0 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
1c800 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
1c810 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
1c820 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
1c830 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
1c840 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
1c850 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
1c860 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
1c870 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1c880 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1c890 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
1c8a0 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
1c8b0 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62  *        ORDER b
1c8c0 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  y clause of the 
1c8d0 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
1c8e0 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
1c8f0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
1c900 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
1c910 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
1c920 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65  (19)  The subque
1c930 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c940 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1c950 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
1c960 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
1c970 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
1c980 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
1c990 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1c9a0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1c9b0 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
1c9c0 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
1c9d0 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
1c9e0 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
1c9f0 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
1ca00 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
1ca10 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
1ca20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
1ca30 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
1ca40 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
1ca50 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
1ca60 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
1ca70 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
1ca80 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
1ca90 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1caa0 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20    But we.**     
1cab0 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70     have other op
1cac0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d  timizations in m
1cad0 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ind to deal with
1cae0 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a   that case..**.*
1caf0 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62  *  (21)  The sub
1cb00 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1cb10 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1cb20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1cb30 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1cb40 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
1cb50 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
1cb60 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
1cb70 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1cb80 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1cb90 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29  CTE..**.**  (23)
1cba0 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73 20    The parent is 
1cbb0 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1cbc0 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62 2d  CTE, or the sub-
1cbd0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a  query is not a.*
1cbe0 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
1cbf0 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72 65  d query. This re
1cc00 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
1cc10 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
1cc20 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
1cc30 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
1cc40 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
1cc50 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
1cc60 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
1cc70 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
1cc80 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
1cc90 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
1cca0 32 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  24)  The subquer
1ccb0 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1ccc0 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20  egate that uses 
1ccd0 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
1cce0 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20  () or .**       
1ccf0 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
1cd00 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74  ons.  (Without t
1cd10 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c  his restriction,
1cd20 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a   a query like:.*
1cd30 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  *        "SELECT
1cd40 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
1cd50 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74  max(y), x FROM t
1cd60 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65  1)" would not ne
1cd70 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20  cessarily.**    
1cd80 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76      return the v
1cd90 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68  alue X for which
1cda0 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29   Y was maximal.)
1cdb0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  .**.**.** In thi
1cdc0 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
1cdd0 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
1cde0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1cdf0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
1ce00 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1ce10 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
1ce20 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
1ce30 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
1ce40 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
1ce50 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
1ce60 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
1ce70 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1ce80 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1ce90 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
1cea0 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
1ceb0 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
1cec0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1ced0 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
1cee0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1cef0 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
1cf00 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1cf10 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
1cf20 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1cf30 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
1cf40 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
1cf50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
1cf60 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
1cf70 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
1cf80 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
1cf90 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
1cfa0 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
1cfb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1cfc0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1cfd0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1cfe0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1cff0 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
1d000 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
1d010 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
1d020 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
1d030 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
1d040 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
1d050 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
1d060 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
1d070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d080 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
1d090 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
1d0a0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
1d0b0 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
1d0c0 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
1d0d0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1d0e0 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1d0f0 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
1d100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
1d110 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
1d120 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1d130 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
1d140 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74  Parent;.  Select
1d150 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
1d160 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
1d170 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
1d180 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1d190 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
1d1a0 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
1d1b0 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
1d1c0 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
1d1d0 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
1d1e0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1d1f0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1d200 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
1d210 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
1d220 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1d230 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1d240 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
1d250 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
1d260 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1d270 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d280 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
1d290 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
1d2a0 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
1d2b0 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
1d2c0 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
1d2d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
1d2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1d2f0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1d300 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d320 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1d330 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1d340 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d350 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
1d360 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1d370 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1d380 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
1d390 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1d3a0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1d3b0 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
1d3c0 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
1d3d0 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
1d3e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1d3f0 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20  Prior==0 );  /* 
1d400 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65  Unable to flatte
1d410 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69  n compound queri
1d420 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  es */.  if( Opti
1d430 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1d440 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
1d450 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
1d460 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
1d470 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
1d480 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
1d490 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
1d4a0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
1d4b0 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
1d4c0 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
1d4d0 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
1d4e0 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
1d4f0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1d500 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
1d510 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
1d520 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1d530 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
1d540 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d570 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 20 2a  triction (1)   *
1d580 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
1d590 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
1d5a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d5c0 73 74 72 69 63 74 69 6f 6e 20 28 32 61 29 20 20  striction (2a)  
1d5d0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  */.    if( (p->p
1d5e0 57 68 65 72 65 20 26 26 20 45 78 70 72 48 61 73  Where && ExprHas
1d5f0 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 57 68 65  Property(p->pWhe
1d600 72 65 2c 45 50 5f 53 75 62 71 75 65 72 79 29 29  re,EP_Subquery))
1d610 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  .     || (sqlite
1d620 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
1d630 2d 3e 70 45 4c 69 73 74 29 20 26 20 45 50 5f 53  ->pEList) & EP_S
1d640 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20  ubquery)!=0.    
1d650 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72   || (sqlite3Expr
1d660 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72  ListFlags(p->pOr
1d670 64 65 72 42 79 29 20 26 20 45 50 5f 53 75 62 71  derBy) & EP_Subq
1d680 75 65 72 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a  uery)!=0.    ){.
1d690 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d6d0 72 69 63 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f  riction (2b)  */
1d6e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a  .    }.  }.    .
1d6f0 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
1d700 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1d710 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
1d720 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
1d730 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
1d740 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1d750 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
1d760 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
1d770 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
1d780 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61  xpressions, we a
1d790 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
1d7a0 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
1d7b0 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1d7c0 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
1d7d0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
1d7e0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
1d7f0 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
1d800 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1d810 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
1d820 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
1d830 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
1d840 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
1d850 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
1d860 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
1d870 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1d880 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
1d890 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d8a0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d8b0 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
1d8c0 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74  b->pOffset ) ret
1d8d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d900 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  14) */.  if( (p-
1d910 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
1d920 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70  ompound)!=0 && p
1d930 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
1d940 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d970 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d980 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
1d990 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
1d9a0 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
1d9b0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d9d0 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
1d9e0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
1d9f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1da00 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
1da10 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1da20 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20  estriction (5)  
1da30 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1da40 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
1da50 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
1da60 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1da70 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1da80 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
1da90 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
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 26 26  _Distinct)!=0 &&
1dac0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1dad0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1dae0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1daf0 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
1db00 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
1db10 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
1db20 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1db30 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1db70 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (11) */.  }. 
1db80 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53   if( isAgg && pS
1db90 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
1dba0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1dbb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dbc0 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20  iction (16) */. 
1dbd0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1dbe0 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29  t && p->pWhere )
1dbf0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1dc00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dc10 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20  iction (19) */. 
1dc20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1dc30 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
1dc40 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1dc50 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
1dc60 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1dc70 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31   Restriction (21
1dc80 29 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63  ) */.  }.  testc
1dc90 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c  ase( pSub->selFl
1dca0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
1dcb0 76 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ve );.  testcase
1dcc0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1dcd0 20 26 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20   & SF_MinMaxAgg 
1dce0 29 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  );.  if( pSub->s
1dcf0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65  elFlags & (SF_Re
1dd00 63 75 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61  cursive|SF_MinMa
1dd10 78 41 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74  xAgg) ){.    ret
1dd20 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
1dd30 63 74 69 6f 6e 73 20 28 32 32 29 20 61 6e 64 20  ctions (22) and 
1dd40 28 32 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (24) */.  }.  if
1dd50 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1dd60 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26   SF_Recursive) &
1dd70 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  & pSub->pPrior )
1dd80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1dd90 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1dda0 32 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  23) */.  }..  /*
1ddb0 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1ddc0 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 1:.  ** Restri
1ddd0 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
1dde0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
1ddf0 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
1de00 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
1de10 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
1de20 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1de30 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
1de40 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
1de50 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
1de60 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
1de70 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1de80 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
1de90 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
1dea0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
1deb0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
1dec0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
1ded0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
1dee0 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
1def0 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
1df00 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
1df10 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
1df20 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
1df30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f  ..  **.  ** OBSO
1df40 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a  LETE COMMENT 2:.
1df50 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
1df60 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
1df70 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1df80 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1df90 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
1dfa0 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
1dfb0 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
1dfc0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1dfd0 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
1dfe0 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
1dff0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1e000 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1e010 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1e020 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
1e030 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
1e040 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
1e050 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
1e060 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
1e070 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
1e080 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
1e090 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
1e0a0 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
1e0b0 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
1e0c0 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
1e0d0 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
1e0e0 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
1e0f0 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
1e100 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
1e110 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
1e120 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
1e130 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53  ..  **.  ** THIS
1e140 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c   OVERRIDES OBSOL
1e150 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41  ETE COMMENTS 1 A
1e160 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a  ND 2 ABOVE:.  **
1e170 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68   Ticket #3300 sh
1e180 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ows that flatten
1e190 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65  ing the right te
1e1a0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1e1b0 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68  N.  ** is fraugh
1e1c0 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20  t with danger.  
1e1d0 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  Best to avoid th
1e1e0 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20  e whole thing.  
1e1f0 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  If the.  ** subq
1e200 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1e210 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
1e220 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e   JOIN, then do n
1e230 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f  ot flatten..  */
1e240 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
1e250 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
1e260 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
1e270 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1e280 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e290 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d   17: If the sub-
1e2a0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1e2b0 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  und SELECT, then
1e2c0 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73   it must.  ** us
1e2d0 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e  e only the UNION
1e2e0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41   ALL operator. A
1e2f0 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  nd none of the s
1e300 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65  imple select que
1e310 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ries.  ** that m
1e320 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f  ake up the compo
1e330 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61  und SELECT are a
1e340 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67  llowed to be agg
1e350 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e  regate or distin
1e360 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ct.  ** queries.
1e370 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
1e380 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1e390 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
1e3a0 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  By ){.      retu
1e3b0 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69  rn 0;  /* Restri
1e3c0 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20  ction 20 */.    
1e3d0 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
1e3e0 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
1e3f0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1e400 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
1e410 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
1e420 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1e430 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
1e440 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
1e450 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
1e460 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
1e470 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1e480 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1e490 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1e4a0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
1e4b0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1e4c0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1e4d0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1e4e0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
1e4f0 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
1e500 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
1e510 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
1e520 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c   if( (pSub1->sel
1e530 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1e540 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1e550 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e))!=0.       ||
1e560 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
1e570 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
1e580 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c  _ALL) .       ||
1e590 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
1e5a0 72 63 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20 70  rc<1.       || p
1e5b0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
1e5c0 70 72 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr!=pSub1->pELis
1e5d0 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29  t->nExpr.      )
1e5e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1e5f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1e600 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1e610 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  1->pSrc->nSrc>1 
1e620 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1e630 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e   Restriction 18.
1e640 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
1e650 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1e660 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
1e670 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
1e680 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
1e690 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
1e6a0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
1e6b0 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  a[ii].u.x.iOrder
1e6c0 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  ByCol==0 ) retur
1e6d0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
1e6e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a   }.  }..  /*****
1e6f0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
1e700 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e  s point, flatten
1e710 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1e720 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43  . *****/.  SELEC
1e730 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
1e740 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25  p,("flatten %s.%
1e750 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e  p from term %d\n
1e760 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1e770 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c        pSub->zSel
1e780 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f  Name, pSub, iFro
1e790 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  m));..  /* Autho
1e7a0 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
1e7b0 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
1e7c0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
1e7d0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
1e7e0 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73   TESTONLY(i =) s
1e7f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1e800 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
1e810 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
1e820 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d  .  testcase( i==
1e830 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20  SQLITE_DENY );. 
1e840 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1e850 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
1e860 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
1e870 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1e880 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1e890 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1e8a0 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
1e8b0 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
1e8c0 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
1e8d0 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
1e8e0 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
1e8f0 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
1e900 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
1e910 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
1e920 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
1e930 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
1e940 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
1e950 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
1e960 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
1e970 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1e980 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
1e990 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
1e9a0 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
1e9b0 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
1e9c0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1e9d0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
1e9e0 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
1e9f0 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
1ea00 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
1ea10 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
1ea20 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
1ea30 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
1ea40 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
1ea50 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
1ea60 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
1ea70 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
1ea80 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
1ea90 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
1eaa0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
1eab0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
1eac0 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
1ead0 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
1eae0 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
1eaf0 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1eb00 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1eb10 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1eb20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
1eb30 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1eb40 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1eb50 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1eb60 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
1eb70 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
1eb80 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
1eb90 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
1eba0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
1ebb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1ebc0 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
1ebd0 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
1ebe0 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
1ebf0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
1ec00 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
1ec10 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
1ec20 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
1ec30 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1ec40 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
1ec50 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
1ec60 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
1ec70 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
1ec80 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
1ec90 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
1eca0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
1ecb0 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
1ecc0 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
1ecd0 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
1ece0 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1ecf0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
1ed00 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1ed10 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1ed20 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
1ed30 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
1ed40 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  imit;.    Expr *
1ed50 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
1ed60 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  fset;.    Select
1ed70 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
1ed80 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
1ed90 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
1eda0 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
1edb0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
1edc0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
1edd0 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74  ;.    p->pOffset
1ede0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
1edf0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
1ee00 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
1ee10 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
1ee20 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62  tName(pNew, pSub
1ee30 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20  ->zSelName);.   
1ee40 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
1ee50 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c  ffset;.    p->pL
1ee60 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
1ee70 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1ee80 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
1ee90 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
1eea0 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c     p->op = TK_AL
1eeb0 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  L;.    if( pNew=
1eec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 ){.      p->p
1eed0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1eee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eef0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
1ef00 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
1ef10 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
1ef20 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
1ef30 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65  .      pNew->pNe
1ef40 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d  xt = p;.      p-
1ef50 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a  >pPrior = pNew;.
1ef60 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
1ef70 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  E(2,pParse,p,.  
1ef80 20 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e         ("compoun
1ef90 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
1efa0 65 6e 65 72 20 63 72 65 61 74 65 73 20 25 73 2e  ener creates %s.
1efb0 25 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20  %p as peer\n",. 
1efc0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53          pNew->zS
1efd0 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a  elName, pNew));.
1efe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
1eff0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1f000 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1f010 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74    /* Begin flatt
1f020 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d  ening the iFrom-
1f030 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
1f040 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a  FROM clause .  *
1f050 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  * in the outer q
1f060 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75  uery..  */.  pSu
1f070 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62  b = pSub1 = pSub
1f080 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  item->pSelect;..
1f090 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
1f0a0 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
1f0b0 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
1f0c0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
1f0d0 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f  ** subquery.  */
1f0e0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f0f0 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1f100 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c  Database);.  sql
1f110 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f120 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
1f130 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f140 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1f150 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74  Alias);.  pSubit
1f160 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
1f170 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
1f180 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  Name = 0;.  pSub
1f190 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30  item->zAlias = 0
1f1a0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  ;.  pSubitem->pS
1f1b0 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  elect = 0;..  /*
1f1c0 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20   Defer deleting 
1f1d0 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
1f1e0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1f1f0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1f200 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ry until code ge
1f210 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  neration is.  **
1f220 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65   complete, since
1f230 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c   there may still
1f240 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62   exist Expr.pTab
1f250 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20   entries that.  
1f260 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ** refer to the 
1f270 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66  subquery even af
1f280 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  ter flattening. 
1f290 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20   Ticket #3346.. 
1f2a0 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65   **.  ** pSubite
1f2b0 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79  m->pTab is alway
1f2c0 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65  s non-NULL by te
1f2d0 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  st restrictions 
1f2e0 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e  and tests above.
1f2f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  .  */.  if( ALWA
1f300 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  YS(pSubitem->pTa
1f310 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62  b!=0) ){.    Tab
1f320 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20  le *pTabToDel = 
1f330 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a  pSubitem->pTab;.
1f340 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65      if( pTabToDe
1f350 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20  l->nRef==1 ){.  
1f360 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c      Parse *pTopl
1f370 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1f380 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1f390 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54  se);.      pTabT
1f3a0 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69  oDel->pNextZombi
1f3b0 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70  e = pToplevel->p
1f3c0 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20  ZombieTab;.     
1f3d0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
1f3e0 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44  bieTab = pTabToD
1f3f0 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  el;.    }else{. 
1f400 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1f410 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nRef--;.    }.  
1f420 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
1f430 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1f440 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
1f450 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
1f460 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
1f470 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1f480 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
1f490 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
1f4a0 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
1f4b0 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
1f4c0 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
1f4d0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
1f4e0 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
1f4f0 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
1f500 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
1f510 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
1f520 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
1f530 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
1f540 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
1f550 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
1f560 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
1f570 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1f580 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
1f590 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1f5a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1f5b0 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
1f5c0 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
1f5d0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
1f5e0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
1f5f0 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
1f600 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
1f610 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
1f620 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
1f630 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
1f640 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
1f650 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
1f660 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
1f670 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
1f680 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
1f690 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
1f6a0 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
1f6b0 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
1f6c0 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
1f6d0 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
1f6e0 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
1f6f0 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
1f700 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
1f710 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
1f720 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
1f730 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
1f740 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
1f750 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
1f760 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
1f770 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
1f780 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
1f790 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
1f7a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
1f7b0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
1f7c0 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
1f7d0 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
1f7e0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
1f7f0 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
1f800 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
1f810 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
1f820 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
1f830 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1f840 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
1f850 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
1f860 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1f870 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
1f880 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
1f890 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
1f8a0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
1f8b0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
1f8c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f8d0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
1f8e0 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e  =p );  /* 2nd an
1f8f0 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d  d subsequent tim
1f900 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  es through the l
1f910 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72  oop */.      pSr
1f920 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
1f930 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1f940 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
1f950 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
1f960 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
1f970 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1f980 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1f990 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1f9a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f9b0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
1f9c0 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  y uses a single 
1f9d0 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  slot of the FROM
1f9e0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1f9f0 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72  uter.    ** quer
1fa00 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75  y.  If the subqu
1fa10 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61  ery has more tha
1fa20 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e  n one element in
1fa30 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
1fa40 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78  ,.    ** then ex
1fa50 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
1fa60 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61  uery to make spa
1fa70 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c  ce for it to hol
1fa80 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20  d all elements. 
1fa90 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62     ** of the sub
1faa0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
1fab0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1fac0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
1fad0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
1fae0 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  A, (SELECT * FRO
1faf0 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74  M sub1, sub2), t
1fb00 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  abB;.    **.    
1fb10 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  ** The outer que
1fb20 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69  ry has 3 slots i
1fb30 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
1fb40 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20  e.  One slot of 
1fb50 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
1fb60 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64   query (the midd
1fb70 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64  le slot) is used
1fb80 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79   by the subquery
1fb90 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  .  The next.    
1fba0 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ** block of code
1fbb0 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65   will expand the
1fbc0 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34 20   out query to 4 
1fbd0 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64  slots.  The midd
1fbe0 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  le.    ** slot i
1fbf0 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
1fc00 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
1fc10 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1fc20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77  or the.    ** tw
1fc30 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
1fc40 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1fc50 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
1fc60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
1fc70 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
1fc80 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1fc90 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
1fca0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1fcb0 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
1fcc0 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
1fcd0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1fce0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
1fcf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1fd00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1fd10 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
1fd20 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
1fd30 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
1fd40 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
1fd50 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
1fd60 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
1fd70 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
1fd80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
1fd90 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1fda0 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
1fdb0 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
1fdc0 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
1fdd0 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
1fde0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
1fdf0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
1fe00 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
1fe10 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
1fe20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
1fe30 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  m].jointype = jo
1fe40 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f  intype;.  .    /
1fe50 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
1fe60 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
1fe70 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
1fe80 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
1fe90 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
1fea0 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
1feb0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fec0 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  y..    ** .    *
1fed0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1fee0 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
1fef0 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
1ff00 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
1ff10 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
1ff20 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
1ff30 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  .    **   \     
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
1ff60 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
1ff70 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
1ff80 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f     **    \______
1ff90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
1ffa0 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
1ffb0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ffc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20  __________/.    
1ffd0 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f  **.    ** We loo
1ffe0 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
1fff0 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
20000 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
20010 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
20020 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75      ** "a" we su
20030 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
20040 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
20050 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
20060 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
20070 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74      */.    pList
20080 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69   = pParent->pELi
20090 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
200a0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
200b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
200c0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
200d0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
200e0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
200f0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
20100 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  b, pList->a[i].z
20110 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  Span);.        s
20120 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
20130 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ame);.        pL
20140 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
20150 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  = zName;.      }
20160 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74  .    }.    subst
20170 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
20180 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50  rent->pEList, iP
20190 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
201a0 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ist);.    if( is
201b0 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62  Agg ){.      sub
201c0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
201d0 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
201e0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
201f0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
20200 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20210 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
20220 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
20230 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
20240 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
20250 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
20260 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
20270 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
20280 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20  t, any non-zero 
20290 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75  iOrderByCol valu
202a0 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  es indicate that
202b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52   the.      ** OR
202c0 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78  DER BY column ex
202d0 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e  pression is iden
202e0 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72  tical to the iOr
202f0 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20  derByCol'th.    
20300 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
20310 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
20320 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75  CT statement pSu
20330 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76  b. Since these v
20340 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64  alues.      ** d
20350 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  o not necessaril
20360 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  y correspond to 
20370 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43  columns in SELEC
20380 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72  T statement pPar
20390 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65  ent,.      ** ze
203a0 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74  ro them before t
203b0 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f  ransfering the O
203c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
203d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
203e0 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73  * Not doing this
203f0 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72   may cause an er
20400 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75  ror if a subsequ
20410 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ent call to this
20420 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
20430 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  on attempts to f
20440 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e  latten a compoun
20450 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f  d sub-query into
20460 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a   pParent.      *
20470 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  * (the only way 
20480 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
20490 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75  is if the compou
204a0 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a  nd sub-query is.
204b0 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
204c0 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d  ly part of pSub-
204d0 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b  >pSrc). See tick
204e0 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e  et [d11a6e908f].
204f0 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
20500 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
20510 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
20520 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
20530 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
20540 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
20550 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
20560 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
20570 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
20580 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
20590 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
205a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
205b0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  pSub->pPrior==0 
205c0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
205d0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
205e0 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
205f0 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
20600 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
20610 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
20620 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
20630 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
20640 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
20650 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
20660 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
20670 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
20680 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
20690 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
206a0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
206b0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
206c0 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
206d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
206e0 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
206f0 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
20700 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
20710 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
20720 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20730 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
20740 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
20750 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
20760 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
20770 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
20780 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
20790 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
207a0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
207b0 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
207c0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
207d0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
207e0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
207f0 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20820 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
20830 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
20840 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
20850 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
20860 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
20870 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
20880 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
20890 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
208a0 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
208b0 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
208c0 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
208d0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
208e0 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
208f0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
20900 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
20910 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
20920 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
20930 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
20940 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
20950 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
20960 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
20970 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
20980 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
20990 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
209a0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
209b0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
209c0 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
209d0 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
209e0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
209f0 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
20a00 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
20a10 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
20a20 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
20a30 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
20a40 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
20a50 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
20a60 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
20a70 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
20a80 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
20a90 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
20aa0 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
20ab0 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
20ac0 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
20ad0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
20ae0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
20af0 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
20b00 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
20b10 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
20b20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
20b30 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
20b40 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
20b50 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
20b60 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
20b70 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
20b80 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
20b90 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
20ba0 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
20bb0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
20bc0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
20bd0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
20be0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
20bf0 50 72 69 6e 74 66 28 22 41 66 74 65 72 20 66 6c  Printf("After fl
20c00 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 3b 0a 20  attening:\n");. 
20c10 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
20c20 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
20c30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
20c40 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
20c50 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
20c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
20c70 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
20c80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
20c90 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61  EW) */../*.** Ba
20ca0 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
20cb0 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e  nts of the AggIn
20cc0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  fo structure ind
20cd0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
20ce0 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  rst.** argument,
20cf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
20d00 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c  hecks if the fol
20d10 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
20d20 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
20d30 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a  query contains j
20d40 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67  ust a single agg
20d50 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
20d60 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67  .**    * the agg
20d70 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
20d80 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20  is either min() 
20d90 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a  or max(), and.**
20da0 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65      * the argume
20db0 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  nt to the aggreg
20dc0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
20dd0 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a  a column value..
20de0 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  **.** If all of 
20df0 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72  the above are tr
20e00 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f  ue, then WHERE_O
20e10 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
20e20 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a  ERE_ORDERBY_MAX.
20e30 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
20e40 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41  s appropriate. A
20e50 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  lso, *ppMinMax i
20e60 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
20e70 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f  o the .** list o
20e80 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
20e90 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ed to the aggreg
20ea0 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ate before retur
20eb0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ning..**.** Or, 
20ec0 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  if the condition
20ed0 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20  s above are not 
20ee0 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  met, *ppMinMax i
20ef0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
20f00 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
20f10 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e  NORMAL is return
20f20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ed..*/.static u8
20f30 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67   minMaxQuery(Agg
20f40 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20  Info *pAggInfo, 
20f50 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e  ExprList **ppMin
20f60 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  Max){.  int eRet
20f70 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
20f80 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20  _NORMAL;        
20f90 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
20fa0 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61  e */..  *ppMinMa
20fb0 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67  x = 0;.  if( pAg
20fc0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20  gInfo->nFunc==1 
20fd0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
20fe0 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  pr = pAggInfo->a
20ff0 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f  Func[0].pExpr; /
21000 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63  * Aggregate func
21010 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
21020 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
21030 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
21040 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
21050 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
21060 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
21070 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
21080 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
21090 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
210a0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
210b0 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
210c0 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
210d0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
210e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
210f0 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75  zFunc = pExpr->u
21100 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69  .zToken;.      i
21110 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
21120 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
21130 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
21140 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
21150 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
21160 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
21170 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  st;.      }else 
21180 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
21190 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
211a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
211b0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
211c0 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20  RBY_MAX;.       
211d0 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
211e0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
211f0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
21200 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  ( *ppMinMax==0 |
21210 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e  | (*ppMinMax)->n
21220 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Expr==1 );.  ret
21230 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
21240 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
21250 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
21260 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
21270 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
21280 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
21290 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
212a0 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
212b0 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
212c0 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
212d0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
212e0 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
212f0 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
21300 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
21310 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
21320 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
21330 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
21340 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
21350 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
21360 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
21370 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
21380 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
21390 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
213a0 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
213b0 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
213c0 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
213d0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
213e0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
213f0 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
21400 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
21410 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
21420 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
21430 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
21440 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
21450 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
21460 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
21470 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
21480 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
21490 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
214a0 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
214b0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
214c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
214d0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
214e0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
214f0 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
21500 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
21510 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
21520 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
21530 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
21540 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
21550 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
21560 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
21570 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
21580 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
21590 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
215a0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
215b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
215c0 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
215d0 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
215e0 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
215f0 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
21600 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
21610 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
21620 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
21630 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
21640 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
21650 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
21660 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
21670 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
21680 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
21690 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
216a0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
216b0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
216c0 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
216d0 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
216e0 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
216f0 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
21700 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
21710 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
21720 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
21730 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
21740 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
21750 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
21760 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
21770 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
21780 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
21790 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
217a0 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
217b0 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
217c0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
217d0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
217e0 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65   && pFrom->zInde
217f0 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  x ){.    Table *
21800 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
21810 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
21820 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49  ndex = pFrom->zI
21830 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20  ndex;.    Index 
21840 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
21850 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
21860 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
21870 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
21880 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
21890 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20  Index); .       
218a0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
218b0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
218c0 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
218d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
218e0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
218f0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
21900 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dex, 0);.      p
21910 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
21920 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
21930 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
21940 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
21950 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64  om->pIndex = pId
21960 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
21970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
21980 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75  ** Detect compou
21990 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
219a0 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e  ents that use an
219b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
219c0 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74   with .** an alt
219d0 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
219e0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
219f0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  **    SELECT ...
21a00 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
21a10 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
21a20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43  t2 ORDER BY .. C
21a30 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
21a40 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69   These are rewri
21a50 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65  tten as a subque
21a60 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ry:.**.**    SEL
21a70 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
21a80 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
21a90 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
21aa0 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20   FROM t2).**    
21ab0 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f   ORDER BY ... CO
21ac0 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
21ad0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
21ae0 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
21af0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c   because the mul
21b00 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
21b10 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f  ) routine.** abo
21b20 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  ve that generate
21b30 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
21b40 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
21b50 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
21b60 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73  Y clause.** uses
21b70 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74   a merge algorit
21b80 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73  hm that requires
21b90 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   the same collat
21ba0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
21bb0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
21bc0 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20  lumns as on the 
21bd0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
21be0 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20    See ticket.** 
21bf0 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
21c00 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36  e.org/src/info/6
21c10 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20  709574d2a.**.** 
21c20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
21c30 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ion is only need
21c40 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49  ed for EXCEPT, I
21c50 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e  NTERSECT, and UN
21c60 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f  ION..** The UNIO
21c70 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77  N ALL operator w
21c80 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d  orks fine with m
21c90 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
21ca0 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  y() even when.**
21cb0 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41   there are COLLA
21cc0 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  TE terms in the 
21cd0 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61  ORDER BY..*/.sta
21ce0 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43  tic int convertC
21cf0 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
21d00 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a  ubquery(Walker *
21d10 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
21d20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
21d30 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
21d40 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71  Select *pX;.  sq
21d50 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72  lite3 *db;.  str
21d60 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
21d70 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20  m *a;.  SrcList 
21d80 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73  *pNewSrc;.  Pars
21d90 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b  e *pParse;.  Tok
21da0 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28  en dummy;..  if(
21db0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
21dc0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
21dd0 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  nue;.  if( p->pO
21de0 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
21df0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
21e00 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20  .  for(pX=p; pX 
21e10 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41  && (pX->op==TK_A
21e20 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LL || pX->op==TK
21e30 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d  _SELECT); pX=pX-
21e40 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28  >pPrior){}.  if(
21e50 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pX==0 ) return 
21e60 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
21e70 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  a = p->pOrderBy-
21e80 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70  >a;.  for(i=p->p
21e90 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
21ea0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
21eb0 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72    if( a[i].pExpr
21ec0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
21ed0 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  late ) break;.  
21ee0 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  }.  if( i<0 ) re
21ef0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
21f00 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  e;..  /* If we r
21f10 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
21f20 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
21f30 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
21f40 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a  s required. */..
21f50 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
21f60 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
21f70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
21f80 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
21f90 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
21fa0 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
21fb0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
21fc0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
21fd0 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  t;.  memset(&dum
21fe0 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  my, 0, sizeof(du
21ff0 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63  mmy));.  pNewSrc
22000 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
22010 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
22020 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75  pParse,0,0,0,&du
22030 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20  mmy,pNew,0,0);. 
22040 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
22050 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
22060 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
22070 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
22080 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
22090 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
220a0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
220b0 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
220c0 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29  r(db, TK_ALL, 0)
220d0 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
220e0 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
220f0 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
22100 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
22110 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
22120 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
22130 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
22140 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e  Prior = 0;.  p->
22150 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  pNext = 0;.  p->
22160 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  pWith = 0;.  p->
22170 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
22180 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65  Compound;.  asse
22190 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
221a0 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29   & SF_Converted)
221b0 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46  ==0 );.  p->selF
221c0 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65  lags |= SF_Conve
221d0 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  rted;.  assert( 
221e0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
221f0 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
22200 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
22210 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
22220 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  = 0;.  pNew->pOf
22230 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  fset = 0;.  retu
22240 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
22250 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
22260 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
22270 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68  * Argument pWith
22280 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e   (which may be N
22290 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61  ULL) points to a
222a0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
222b0 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20  nested .** WITH 
222c0 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69  contexts, from i
222d0 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73  nner to outermos
222e0 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  t. If the table 
222f0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a  identified by .*
22300 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
22310 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72  ement pItem is r
22320 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74  eally a common-t
22330 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20  able-expression 
22340 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72  (CTE) .** then r
22350 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22360 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e  to the CTE defin
22370 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74  ition for that t
22380 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  able. Otherwise.
22390 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  ** return NULL..
223a0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e  **.** If a non-N
223b0 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74  ULL value is ret
223c0 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f  urned, set *ppCo
223d0 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74  ntext to point t
223e0 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62  o the With.** ob
223f0 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65  ject that the re
22400 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e  turned CTE belon
22410 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  gs to..*/.static
22420 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61   struct Cte *sea
22430 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20  rchWith(.  With 
22440 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
22450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
22460 72 72 65 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20  rrent outermost 
22470 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WITH clause */. 
22480 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
22490 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20  item *pItem,    
224a0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
224b0 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c  element to resol
224c0 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70  ve */.  With **p
224d0 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  pContext        
224e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
224f0 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75  WITH clause retu
22500 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73  rn value belongs
22510 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73   to */.){.  cons
22520 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
22530 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
22540 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61  abase==0 && (zNa
22550 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  me = pItem->zNam
22560 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  e)!=0 ){.    Wit
22570 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  h *p;.    for(p=
22580 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70  pWith; p; p=p->p
22590 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e  Outer){.      in
225a0 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
225b0 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69  =0; i<p->nCte; i
225c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
225d0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
225e0 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  zName, p->a[i].z
225f0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
22600 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74        *ppContext
22610 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
22620 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b  return &p->a[i];
22630 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22640 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
22650 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54  eturn 0;.}../* T
22660 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
22670 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74  r maintains a st
22680 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49  ack of active WI
22690 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69  TH clauses.** wi
226a0 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  th the inner-mos
226b0 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65  t WITH clause be
226c0 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ing at the top o
226d0 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
226e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
226f0 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20  pushes the WITH 
22700 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73  clause passed as
22710 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
22720 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  ment.** onto the
22730 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
22740 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  k. If argument b
22750 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68  Free is true, th
22760 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20  en this.** WITH 
22770 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65  clause will neve
22780 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d  r be popped from
22790 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74   the stack. In t
227a0 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73  his case it.** s
227b0 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61  hould be freed a
227c0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61  long with the Pa
227d0 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f  rse object. In o
227e0 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e  ther cases, when
227f0 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68  .** bFree==0, th
22800 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69  e With object wi
22810 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ll be freed alon
22820 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43  g with the SELEC
22830 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  T .** statement 
22840 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73  with which it is
22850 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a   associated..*/.
22860 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
22870 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
22880 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c  se, With *pWith,
22890 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73   u8 bFree){.  as
228a0 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c  sert( bFree==0 |
228b0 7c 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  | pParse->pWith=
228c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  =0 );.  if( pWit
228d0 68 20 29 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e  h ){.    pWith->
228e0 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d  pOuter = pParse-
228f0 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
22900 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
22910 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 62  h;.    pParse->b
22920 46 72 65 65 57 69 74 68 20 3d 20 62 46 72 65 65  FreeWith = bFree
22930 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
22940 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
22950 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
22960 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
22970 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
22980 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
22990 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
229a0 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
229b0 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
229c0 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
229d0 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
229e0 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
229f0 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
22a00 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
22a10 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
22a20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
22a30 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
22a40 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
22a50 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
22a60 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
22a70 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
22a80 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
22a90 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
22aa0 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
22ab0 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
22ac0 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
22ad0 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
22ae0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
22af0 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
22b00 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
22b10 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
22b20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
22b30 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
22b40 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
22b50 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
22b60 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
22b70 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
22b80 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
22b90 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
22ba0 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
22bb0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
22bc0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
22bd0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
22be0 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
22bf0 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
22c00 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
22c10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
22c20 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20  From.){.  Parse 
22c30 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
22c40 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  r->pParse;.  sql
22c50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
22c60 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20  e->db;.  struct 
22c70 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20  Cte *pCte;      
22c80 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
22c90 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c  hed CTE (or NULL
22ca0 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f   if no match) */
22cb0 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20  .  With *pWith; 
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73     /* WITH claus
22ce0 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f  e that pCte belo
22cf0 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
22d00 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
22d10 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
22d20 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
22d30 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
22d40 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28  , &pWith);.  if(
22d50 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62   pCte ){.    Tab
22d60 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78  le *pTab;.    Ex
22d70 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
22d80 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
22d90 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  ;.    Select *pL
22da0 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
22db0 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
22dc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
22dd0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61  t */.    int bMa
22de0 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20  yRecursive;     
22df0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
22e00 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65  f compound joine
22e10 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  d by UNION [ALL]
22e20 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53   */.    With *pS
22e30 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20  avedWith;       
22e40 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
22e50 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
22e60 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20  ->pWith */..    
22e70 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72  /* If pCte->zErr
22e80 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20   is non-NULL at 
22e90 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
22ea0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65   this is an ille
22eb0 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  gal.    ** recur
22ec0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74  sive reference t
22ed0 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76  o CTE pCte. Leav
22ee0 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
22ef0 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
22f00 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66      ** early. If
22f10 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e   pCte->zErr is N
22f20 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ULL, then this i
22f30 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
22f40 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20  e reference..   
22f50 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
22f60 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
22f70 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 45 72     if( pCte->zEr
22f80 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
22f90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
22fa0 65 2c 20 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70  e, pCte->zErr, p
22fb0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
22fc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22fd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
22fe0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
22ff0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
23000 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
23010 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
23020 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
23030 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
23040 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
23050 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
23060 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66  ;.    pTab->nRef
23070 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
23080 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
23090 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
230a0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
230b0 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
230c0 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
230d0 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
230e0 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
230f0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
23100 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
23110 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
23120 6d 65 72 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d  meral;.    pFrom
23130 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
23140 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
23150 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20   pCte->pSelect, 
23160 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
23170 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
23180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23190 45 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  EM;.    assert( 
231a0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
231b0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
231c0 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
231d0 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
231e0 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
231f0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
23200 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
23210 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
23220 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
23230 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
23240 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
23250 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
23260 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
23270 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
23280 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
23290 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
232a0 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
232b0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
232c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
232d0 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
232e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
232f0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
23300 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
23310 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
23320 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
23330 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
23340 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
23350 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
23360 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
23370 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
23380 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
23390 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20  em->isRecursive 
233a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
233b0 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
233c0 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c         pSel->sel
233d0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75  Flags |= SF_Recu
233e0 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d  rsive;.        }
233f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
23400 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20      /* Only one 
23410 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
23420 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64  nce is permitted
23430 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54  . */ .    if( pT
23440 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20  ab->nRef>2 ){.  
23450 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
23460 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  Msg(.          p
23470 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65  Parse, "multiple
23480 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72   references to r
23490 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20  ecursive table: 
234a0 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  %s", pCte->zName
234b0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
234c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
234d0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
234e0 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65  ssert( pTab->nRe
234f0 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e  f==1 || ((pSel->
23500 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75  selFlags&SF_Recu
23510 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e  rsive) && pTab->
23520 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20  nRef==2 ));..   
23530 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63   pCte->zErr = "c
23540 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
23550 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76  e: %s";.    pSav
23560 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d  edWith = pParse-
23570 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
23580 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
23590 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  h;.    sqlite3Wa
235a0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
235b0 2c 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  , bMayRecursive 
235c0 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a  ? pSel->pPrior :
235d0 20 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72   pSel);..    for
235e0 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
235f0 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
23600 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
23610 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
23620 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
23630 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
23640 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
23650 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
23660 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
23670 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
23680 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
23690 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
236a0 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
236b0 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
236c0 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
236d0 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
236e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
236f0 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
23700 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
23710 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
23720 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
23730 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23740 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
23750 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
23760 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
23770 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c  ;.    }..    sel
23780 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
23790 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
237a0 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
237b0 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
237c0 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
237d0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
237e0 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c   if( pSel->selFl
237f0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
23800 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ve ){.        pC
23810 74 65 2d 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74  te->zErr = "mult
23820 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72  iple recursive r
23830 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a  eferences: %s";.
23840 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23850 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20       pCte->zErr 
23860 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66  = "recursive ref
23870 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71  erence in a subq
23880 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20  uery: %s";.     
23890 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
238a0 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
238b0 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
238c0 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20  .    pCte->zErr 
238d0 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
238e0 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
238f0 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
23900 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23910 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
23920 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
23930 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
23940 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
23950 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23960 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
23970 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
23980 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
23990 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
239a0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
239b0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
239c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
239d0 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
239e0 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
239f0 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
23a00 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
23a10 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
23a20 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
23a30 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
23a40 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
23a50 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
23a60 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
23a70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
23a80 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
23a90 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
23aa0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
23ab0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
23ac0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  ker->pParse;.  W
23ad0 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e  ith *pWith = fin
23ae0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
23af0 57 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74  With;.  if( pWit
23b00 68 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  h!=0 ){.    asse
23b10 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
23b20 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
23b30 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
23b40 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20  pWith->pOuter;. 
23b50 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69   }.}.#else.#defi
23b60 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  ne selectPopWith
23b70 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
23b80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
23b90 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
23ba0 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
23bb0 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
23bc0 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
23bd0 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
23be0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
23bf0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
23c00 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
23c10 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
23c20 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
23c30 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
23c40 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
23c50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
23c60 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
23c70 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
23c80 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
23c90 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
23ca0 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
23cb0 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
23cc0 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
23cd0 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
23ce0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
23cf0 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
23d00 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
23d10 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
23d20 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
23d30 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
23d40 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
23d50 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
23d60 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
23d70 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
23d80 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
23d90 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
23da0 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
23db0 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
23dc0 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
23dd0 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
23de0 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
23df0 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
23e00 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65  persistent repre
23e10 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
23e20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
23e30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
23e40 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
23e50 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
23e60 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65   accommodate the
23e70 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
23e80 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
23e90 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
23ea0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
23eb0 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
23ec0 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
23ed0 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
23ee0 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
23ef0 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
23f00 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
23f10 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
23f20 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
23f30 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
23f40 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
23f50 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
23f60 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
23f70 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
23f80 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
23f90 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
23fa0 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
23fb0 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
23fc0 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
23fd0 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
23fe0 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
23ff0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
24000 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
24010 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
24020 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
24030 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
24040 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
24050 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
24060 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
24070 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
24080 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
24090 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
240a0 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45  pE, *pRight, *pE
240b0 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c  xpr;.  u16 selFl
240c0 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
240d0 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  s;..  p->selFlag
240e0 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
240f0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
24100 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
24110 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24120 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
24130 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
24140 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  | (selFlags & SF
24150 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
24160 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
24170 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
24180 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
24190 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
241a0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 57 61  EList;.  if( pWa
241b0 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c  lker->xSelectCal
241c0 6c 62 61 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f  lback2==selectPo
241d0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c  pWith ){.    sql
241e0 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
241f0 72 73 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f  rse, findRightmo
24200 73 74 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29  st(p)->pWith, 0)
24210 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
24220 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
24230 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
24240 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
24250 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
24260 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
24270 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
24280 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
24290 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
242a0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
242b0 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
242c0 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
242d0 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
242e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
242f0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
24300 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
24310 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
24320 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
24330 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
24340 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
24350 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
24360 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
24370 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
24380 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
24390 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
243a0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
243b0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
243c0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
243d0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
243e0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
243f0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73  ssert( pFrom->is
24400 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
24410 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20  pFrom->pTab );. 
24420 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73     if( pFrom->is
24430 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74  Recursive ) cont
24440 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46  inue;.    if( pF
24450 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
24460 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
24470 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
24480 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
24490 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
244a0 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
244b0 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
244c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
244d0 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
244e0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
244f0 20 20 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74      selectPopWit
24500 68 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23  h(pWalker, p);.#
24510 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
24520 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
24530 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
24540 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
24550 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70  if( withExpand(p
24560 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29  Walker, pFrom) )
24570 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24580 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  t;.    if( pFrom
24590 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65  ->pTab ) {} else
245a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
245b0 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
245c0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
245d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
245e0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
245f0 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
24600 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  ect;.      /* A 
24610 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
24620 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
24630 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
24640 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d    assert( pSel!=
24650 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
24660 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
24670 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
24680 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
24690 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20  (pWalker, pSel) 
246a0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
246b0 72 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  rt;.      pFrom-
246c0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
246d0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
246e0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
246f0 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
24700 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
24710 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
24720 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
24730 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
24740 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
24750 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
24760 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a  e_sq_%p", (void*
24770 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68  )pTab);.      wh
24780 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
24790 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
247a0 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20  ->pPrior; }.    
247b0 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
247c0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
247d0 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
247e0 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
247f0 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
24800 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
24810 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
24820 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
24830 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
24840 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
24850 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20  48576) );.      
24860 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
24870 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
24880 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
24890 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
248a0 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
248b0 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
248c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
248d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
248e0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
248f0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
24900 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
24910 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
24920 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72  m(pParse, 0, pFr
24930 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  om);.      if( p
24940 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
24950 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
24960 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d   if( pTab->nRef=
24970 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  =0xffff ){.     
24980 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
24990 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
249a0 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
249b0 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36  to \"%s\": max 6
249c0 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20  5535",.         
249d0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
249e0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
249f0 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
24a00 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24a10 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
24a20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
24a30 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
24a40 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
24a50 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
24a60 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
24a70 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70  BLE).      if( p
24a80 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20  Tab->pSelect || 
24a90 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
24aa0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
24ab0 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
24ac0 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
24ad0 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
24ae0 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
24af0 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
24b00 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
24b10 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
24b20 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
24b30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
24b40 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
24b50 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
24b60 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
24b70 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
24b80 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
24b90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
24ba0 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
24bb0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pFrom->pSelect, 
24bc0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
24bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
24be0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
24bf0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
24c00 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
24c10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
24c20 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
24c30 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
24c40 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
24c50 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
24c60 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
24c70 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
24c80 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
24c90 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
24ca0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
24cb0 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
24cc0 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
24cd0 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
24ce0 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
24cf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
24d00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
24d10 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
24d20 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
24d30 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
24d40 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
24d50 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
24d60 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
24d70 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
24d80 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
24d90 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
24da0 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
24db0 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
24dc0 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
24dd0 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
24de0 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
24df0 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
24e00 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
24e10 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
24e20 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
24e30 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
24e40 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
24e50 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
24e60 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
24e70 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
24e80 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
24e90 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
24ea0 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
24eb0 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
24ec0 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
24ed0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
24ee0 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
24ef0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
24f00 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
24f10 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
24f20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
24f30 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
24f40 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
24f50 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
24f60 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
24f70 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
24f80 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d      pE = pEList-
24f90 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
24fa0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
24fb0 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
24fc0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
24fd0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
24fe0 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
24ff0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
25000 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
25010 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
25020 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
25030 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
25040 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
25050 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
25060 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
25070 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
25080 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
25090 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
250a0 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
250b0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
250c0 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
250d0 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
250e0 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
250f0 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
25100 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
25110 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
25120 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
25130 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
25140 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
25150 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
25160 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
25170 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
25180 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
25190 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
251a0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
251b0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
251c0 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
251d0 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
251e0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
251f0 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
25210 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
25220 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
25230 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
25240 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d  processing FROM-
25250 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
25260 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  s, it is always 
25270 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a 20  the case.    ** 
25280 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e  that full_column
25290 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73  _names=OFF and s
252a0 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  hort_column_name
252b0 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a  s=ON.  The.    *
252c0 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  * sqlite3ResultS
252d0 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f 75  etOfSelect() rou
252e0 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73 6f  tine makes it so
252f0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
25300 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
25310 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d  SF_NestedFrom)==
25320 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  0.          || (
25330 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
25340 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  FullColNames)==0
25350 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
25360 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54    (flags & SQLIT
25370 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
25380 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  !=0) );..    for
25390 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
253a0 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
253b0 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78     pE = a[k].pEx
253c0 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  pr;.      pRight
253d0 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
253e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
253f0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
25400 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
25410 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
25420 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21  _ALL && (pE->op!
25430 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
25440 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
25450 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
25460 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
25470 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
25480 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
25490 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
254a0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
254b0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
254c0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
254d0 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b  ew, a[k].pExpr);
254e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
254f0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
25500 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
25510 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
25520 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
25530 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
25540 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e  ->nExpr-1].zSpan
25550 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20   = a[k].zSpan;. 
25560 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e           a[k].zN
25570 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
25580 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20     a[k].zSpan = 
25590 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
255a0 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
255b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
255c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
255d0 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
255e0 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
255f0 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
25600 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
25610 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
25620 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
25630 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
25640 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
25650 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
25660 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
25670 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
25680 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
25690 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
256a0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
256b0 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
256c0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70     assert( pE->p
256d0 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
256e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
256f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
25700 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56  ->pLeft, EP_IntV
25710 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
25720 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e     zTName = pE->
25730 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
25740 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25750 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
25760 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
25770 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
25780 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
25790 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
257a0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
257b0 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53  Tab;.          S
257c0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46  elect *pSub = pF
257d0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
257e0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
257f0 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
25800 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
25810 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
25820 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20  chemaName = 0;. 
25830 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
25840 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25850 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  zTabName==0 ){. 
25860 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
25870 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
25880 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
25890 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
258a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
258b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
258c0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20   if( pSub==0 || 
258d0 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
258e0 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
258f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
25900 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20     pSub = 0;.   
25910 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
25920 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
25930 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
25940 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
25950 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
25960 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
25970 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
25980 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
25990 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
259a0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
259b0 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
259c0 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20  maName = iDb>=0 
259d0 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ? db->aDb[iDb].z
259e0 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20  Name : "*";.    
259f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25a00 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
25a10 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
25a20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
25a30 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
25a40 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
25a50 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
25a60 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68  zColname;  /* Th
25a70 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  e computed colum
25a80 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
25a90 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46        char *zToF
25aa0 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ree;   /* Malloc
25ab0 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e  ed string that n
25ac0 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
25ad0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25ae0 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20  Token sColname; 
25af0 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c   /* Computed col
25b00 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f  umn name as a to
25b10 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ken */..        
25b20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d      assert( zNam
25b30 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
25b40 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70   if( zTName && p
25b50 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20  Sub.            
25b60 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68   && sqlite3Match
25b70 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70  SpanName(pSub->p
25b80 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
25b90 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29  n, 0, zTName, 0)
25ba0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
25bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25bc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
25bd0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
25be0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
25bf0 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
25c00 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72  s 'hidden' (curr
25c10 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69  ently only possi
25c20 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
25c30 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  ** for virtual t
25c40 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69  ables), do not i
25c50 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65  nclude it in the
25c60 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20   expanded.      
25c70 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d        ** result-
25c80 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  set list..      
25c90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25ca0 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65       if( IsHidde
25cb0 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
25cc0 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Col[j]) ){.     
25cd0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25ce0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
25cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25d00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
25d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25d20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
25d30 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  1;..            
25d40 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d  if( i>0 && zTNam
25d50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
25d60 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d        if( (pFrom
25d70 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
25d80 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
25d90 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
25da0 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
25db0 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
25dc0 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
25dd0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
25de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25df0 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
25e00 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
25e10 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
25e20 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
25e30 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
25e40 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
25e50 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
25e60 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
25e70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
25e80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
25e90 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
25ea0 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
25eb0 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
25ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25ed0 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
25ee0 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
25ef0 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
25f00 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
25f10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
25f20 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
25f30 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
25f40 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
25f50 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
25f60 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
25f70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
25f80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
25f90 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
25fa0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
25fb0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
25fc0 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
25fd0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
25fe0 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
25ff0 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
26000 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
26010 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
26020 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
26030 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
26040 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
26050 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
26060 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
26070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
26080 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
26090 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
260a0 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
260b0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
260c0 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61       if( zSchema
260d0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
260e0 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
260f0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
26100 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61  TK_ID, zSchemaNa
26110 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
26120 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
26130 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
26140 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
26150 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
26160 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26170 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
26180 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
26190 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
261a0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
261b0 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
261c0 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
261d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
261e0 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43      zToFree = zC
261f0 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
26200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26220 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
26230 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
26240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26250 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
26260 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
26270 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
26280 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
26290 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a    sColname.z = z
262a0 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
262b0 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20       sColname.n 
262c0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
262d0 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  0(zColname);.   
262e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
262f0 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
26300 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
26310 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
26320 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
26330 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
26340 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
26350 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
26360 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
26370 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
26380 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
26390 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
263a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
263b0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
263c0 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
263d0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
263e0 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
263f0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26410 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
26420 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
26430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
26450 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
26460 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
26470 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
264b0 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
264c0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
264d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
264e0 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
264f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
26510 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
26520 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
26530 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26540 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
26550 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
26560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26570 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
26580 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
26590 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
265a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
265b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
265c0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
265d0 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
265e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
265f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
26600 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
26610 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
26620 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
26630 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26640 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
26650 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
26660 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
26670 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
26680 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
26690 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
266a0 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
266b0 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
266c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
266d0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
266e0 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
266f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
26700 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
26710 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
26720 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
26730 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
26740 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
26750 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f  e;.}../*.** No-o
26760 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  p routine for th
26770 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c  e parse-tree wal
26780 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ker..**.** When 
26790 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
267a0 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  the Walker.xExpr
267b0 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78  Callback then ex
267c0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a  pression trees.*
267d0 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74  * are walked wit
267e0 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73  hout any actions
267f0 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20   being taken at 
26800 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73  each node.  Pres
26810 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20  umably,.** when 
26820 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
26830 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e  used for Walker.
26840 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
26850 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53  en .** Walker.xS
26860 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73  electCallback is
26870 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74   set to do somet
26880 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20  hing useful for 
26890 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65  every .** subque
268a0 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
268b0 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
268c0 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f   int exprWalkNoo
268d0 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  p(Walker *NotUse
268e0 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64  d, Expr *NotUsed
268f0 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
26900 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
26910 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
26920 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
26930 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
26940 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64   routine "expand
26950 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  s" a SELECT stat
26960 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66  ement and all of
26970 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e   its subqueries.
26980 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e  .** For addition
26990 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
269a0 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20  n what it means 
269b0 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45  to "expand" a SE
269c0 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
269d0 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  t, see the comme
269e0 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74  nt on the select
269f0 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61  Expand worker ca
26a00 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a  llback above..**
26a10 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20  .** Expanding a 
26a20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
26a30 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74   is the first st
26a40 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  ep in processing
26a50 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
26a60 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c  tement.  The SEL
26a70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75  ECT statement mu
26a80 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
26a90 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65  efore.** name re
26aa0 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66  solution is perf
26ab0 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormed..**.** If 
26ac0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
26ad0 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ong, an error me
26ae0 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
26af0 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a   into pParse..**
26b00 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
26b10 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74  ction can detect
26b20 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20   the problem by 
26b30 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73  looking at pPars
26b40 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f  e->nErr.** and/o
26b50 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  r pParse->db->ma
26b60 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73  llocFailed..*/.s
26b70 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
26b80 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50  e3SelectExpand(P
26b90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
26ba0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
26bb0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
26bc0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
26bd0 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
26be0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
26bf0 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
26c00 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
26c10 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73   if( pParse->has
26c20 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20  Compound ){.    
26c30 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
26c40 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  k = convertCompo
26c50 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
26c60 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ery;.    sqlite3
26c70 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
26c80 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77  Select);.  }.  w
26c90 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
26ca0 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
26cb0 72 3b 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63  r;.  if( (pSelec
26cc0 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
26cd0 5f 41 6c 6c 56 61 6c 75 65 73 29 3d 3d 30 20 29  _AllValues)==0 )
26ce0 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
26cf0 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
26d00 74 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20  tPopWith;.  }.  
26d10 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
26d20 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
26d30 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
26d40 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
26d50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
26d60 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
26d70 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
26d80 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
26d90 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
26da0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
26db0 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
26dc0 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
26dd0 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
26de0 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
26df0 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
26e00 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
26e10 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
26e20 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
26e30 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
26e40 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
26e50 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
26e60 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
26e70 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
26e80 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
26e90 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
26ea0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
26eb0 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
26ec0 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
26ed0 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
26ee0 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
26ef0 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
26f00 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
26f10 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
26f20 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
26f30 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
26f40 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
26f50 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
26f60 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
26f70 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
26f80 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
26f90 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
26fa0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
26fb0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
26fc0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
26fd0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
26fe0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
26ff0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
27000 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
27010 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ed );.  if( (p->
27020 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
27030 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b  sTypeInfo)==0 ){
27040 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
27050 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
27060 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d  fo;.    pParse =
27070 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
27080 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
27090 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f   p->pSrc;.    fo
270a0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
270b0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
270c0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
270d0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
270e0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
270f0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
27100 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61    if( ALWAYS(pTa
27110 62 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e  b!=0) && (pTab->
27120 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
27130 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
27140 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d         /* A sub-
27150 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
27160 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
27170 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20  LECT */.        
27180 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
27190 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
271a0 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20         if( pSel 
271b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
271c0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
271d0 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
271e0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
271f0 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
27200 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
27210 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
27220 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  pSel);.        }
27230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27240 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
27250 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27260 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61   adds datatype a
27270 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
27280 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  uence informatio
27290 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c  n to.** the Tabl
272a0 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  e structures of 
272b0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
272c0 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a  subqueries in a.
272d0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
272e0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ent..**.** Use t
272f0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65  his routine afte
27300 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
27310 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
27320 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
27330 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65  ddTypeInfo(Parse
27340 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
27350 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e   *pSelect){.#ifn
27360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27370 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65  SUBQUERY.  Walke
27380 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
27390 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
273a0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
273b0 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
273c0 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
273d0 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
273e0 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
273f0 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
27400 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
27410 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
27420 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
27430 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
27440 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
27450 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  p a SELECT state
27460 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
27470 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
27480 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
27490 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
274a0 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
274b0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
274c0 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
274d0 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
274e0 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
274f0 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
27500 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
27510 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
27520 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
27530 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
27540 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
27550 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
27560 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
27570 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
27580 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
27590 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
275a0 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
275b0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
275c0 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
275d0 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
275e0 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
275f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27600 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
27610 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
27620 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
27630 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
27640 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
27650 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27660 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
27670 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
27680 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
27690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
276a0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
276b0 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
276c0 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
276d0 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
276e0 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
276f0 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
27700 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
27710 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
27720 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
27730 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
27740 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
27750 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
27760 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
27770 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
27780 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
27790 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
277a0 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
277b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
277c0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
277d0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
277e0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
277f0 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
27800 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
27810 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
27820 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
27830 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
27840 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
27850 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
27860 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
27870 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
27880 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
27890 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
278a0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
278b0 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
278c0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
278d0 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
278e0 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
278f0 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
27900 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
27910 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
27920 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
27930 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
27940 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
27950 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
27960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27970 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
27980 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
27990 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
279a0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
279b0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
279c0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
279d0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
279e0 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65  pFunc;.  int nRe
279f0 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  g = pAggInfo->nF
27a00 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e  unc + pAggInfo->
27a10 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e  nColumn;.  if( n
27a20 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Reg==0 ) return;
27a30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
27a40 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
27a50 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66   that all AggInf
27a60 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  o registers are 
27a70 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
27a80 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20   specified by.  
27a90 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67  ** AggInfo.mnReg
27aa0 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20  ..AggInfo.mxReg 
27ab0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  */.  assert( nRe
27ac0 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g==pAggInfo->mxR
27ad0 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  eg-pAggInfo->mnR
27ae0 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  eg+1 );.  for(i=
27af0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
27b00 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
27b10 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
27b20 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
27b30 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
27b40 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
27b50 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
27b60 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
27b70 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66  mxReg );.  }.  f
27b80 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
27b90 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  fo->nFunc; i++){
27ba0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
27bb0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
27bc0 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
27bd0 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
27be0 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  & pAggInfo->aFun
27bf0 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  c[i].iMem<=pAggI
27c00 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
27c10 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
27c20 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
27c30 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
27c40 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67  Info->mnReg, pAg
27c50 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20  gInfo->mxReg);. 
27c60 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
27c70 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
27c80 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
27c90 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
27ca0 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  ){.    if( pFunc
27cb0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
27cc0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
27cd0 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
27ce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
27cf0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
27d00 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
27d10 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
27d20 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
27d30 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
27d40 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
27d50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
27d60 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
27d70 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
27d80 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
27d90 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
27da0 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
27db0 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
27dc0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
27dd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27de0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
27df0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
27e00 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
27e10 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20  e, pE->x.pList, 
27e20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
27e30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27e40 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
27e50 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
27e60 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
27e90 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
27ea0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
27eb0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
27ec0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
27ed0 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
27ee0 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
27ef0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
27f00 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
27f10 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
27f20 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
27f30 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
27f40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
27f50 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
27f60 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
27f70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
27f80 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
27f90 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
27fa0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
27fb0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
27fc0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
27fd0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
27fe0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
27ff0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
28000 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
28010 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
28020 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
28030 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
28040 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
28050 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
28060 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
28070 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
28080 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280a0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
280b0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
280c0 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
280d0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
280e0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
280f0 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
28100 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
28110 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
28120 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
28130 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
28140 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
28150 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
28160 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
28170 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
28180 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
28190 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
281a0 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
281b0 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
281c0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
281d0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
281e0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
281f0 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
28200 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
28210 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  1;.  for(i=0, pF
28220 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
28230 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
28240 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
28250 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
28260 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
28270 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
28280 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Agg;.    ExprLis
28290 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
282a0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
282b0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
282c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
282d0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
282e0 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
282f0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
28300 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
28310 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
28320 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
28330 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
28340 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
28350 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
28360 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
28370 74 2c 20 72 65 67 41 67 67 2c 20 53 51 4c 49 54  t, regAgg, SQLIT
28380 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20  E_ECEL_DUP);.   
28390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
283a0 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
283b0 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
283c0 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
283d0 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
283e0 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
283f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
28400 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
28410 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
28420 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
28430 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44  t(pParse, pF->iD
28440 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
28450 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20  t, 1, regAgg);. 
28460 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
28470 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
28480 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
28490 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
284a0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
284b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
284c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
284d0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
284e0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
284f0 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
28500 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
28510 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45  pF->pFunc has NE
28520 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  EDCOLL */.      
28530 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
28540 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
28550 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
28560 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
28570 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
28580 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
28590 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
285a0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
285b0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
285c0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
285d0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
285e0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
285f0 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d       if( regHit=
28600 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e  =0 && pAggInfo->
28610 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72  nAccumulator ) r
28620 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65  egHit = ++pParse
28630 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
28640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
28650 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72  v, OP_CollSeq, r
28660 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68  egHit, 0, 0, (ch
28670 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
28680 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
28690 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
286a0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
286b0 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
286c0 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
286e0 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
286f0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
28700 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
28710 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
28720 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
28730 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
28740 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
28750 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
28760 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
28770 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
28780 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
28790 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
287a0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
287b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
287c0 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
287d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
287e0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
287f0 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
28800 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70  .  /* Before pop
28810 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75  ulating the accu
28820 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
28830 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c  s, clear the col
28840 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20  umn cache..  ** 
28850 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
28860 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65  y of the require
28870 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  d column values 
28880 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73  are already pres
28890 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67  ent .  ** in reg
288a0 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45  isters, sqlite3E
288b0 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73  xprCode() may us
288c0 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f  e OP_SCopy to co
288d0 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a  py the value.  *
288e0 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42  * to pC->iMem. B
288f0 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ut by the time t
28900 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  he value is used
28910 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72  , the original r
28920 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79  egister.  ** may
28930 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c   have been used,
28940 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68   invalidating th
28950 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66  e underlying buf
28960 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  fer holding the.
28970 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f    ** text or blo
28980 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63  b value. See tic
28990 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d  ket [883034dcb5]
289a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74  ..  **.  ** Anot
289b0 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75  her solution wou
289c0 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20  ld be to change 
289d0 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65  the OP_SCopy use
289e0 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64  d to copy cached
289f0 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20  .  ** values to 
28a00 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f  an OP_Copy..  */
28a10 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b  .  if( regHit ){
28a20 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74  .    addrHitTest
28a30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
28a40 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
28a50 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65  egHit); VdbeCove
28a60 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73  rage(v);.  }.  s
28a70 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
28a80 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
28a90 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
28aa0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
28ab0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
28ac0 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
28ad0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
28ae0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
28af0 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
28b00 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
28b10 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
28b20 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
28b30 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
28b40 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48  se);.  if( addrH
28b50 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71  itTest ){.    sq
28b60 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
28b70 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74  e(v, addrHitTest
28b80 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
28b90 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f  Add a single OP_
28ba0 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
28bb0 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20  ion to the VDBE 
28bc0 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d  to explain a sim
28bd0 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20  ple.** count(*) 
28be0 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63  query ("SELECT c
28bf0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61  ount(*) FROM pTa
28c00 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  b")..*/.#ifndef 
28c10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
28c20 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AIN.static void 
28c30 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
28c40 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
28c50 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
28c60 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
28c70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
28c80 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
28c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28ca0 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
28cb0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
28cc0 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
28cd0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
28ce0 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
28cf0 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20  e scan, or NULL 
28d00 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
28d10 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
28d20 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72  {.    int bCover
28d30 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28   = (pIdx!=0 && (
28d40 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
28d50 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  | !IsPrimaryKeyI
28d60 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20  ndex(pIdx)));.  
28d70 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73    char *zEqp = s
28d80 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
28d90 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20  arse->db, "SCAN 
28da0 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20  TABLE %s%s%s",. 
28db0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
28dc0 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  me,.        bCov
28dd0 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56  er ? " USING COV
28de0 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20  ERING INDEX " : 
28df0 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  "",.        bCov
28e00 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  er ? pIdx->zName
28e10 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20   : "".    );.   
28e20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28e30 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  p4(.        pPar
28e40 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78  se->pVdbe, OP_Ex
28e50 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
28e60 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
28e70 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zEqp, P4_DYNAMIC
28e80 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
28e90 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
28ea0 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
28eb0 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
28ec0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
28ed0 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
28ee0 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
28ef0 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
28f00 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
28f10 20 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74   results are ret
28f20 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20  urned according 
28f30 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  to the SelectDes
28f40 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  t structure..** 
28f50 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  See comments in 
28f60 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20  sqliteInt.h for 
28f70 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74  further informat
28f80 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
28f90 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
28fa0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
28fb0 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
28fc0 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
28fd0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
28fe0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
28ff0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
29000 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
29010 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
29020 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
29030 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
29040 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
29050 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
29060 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
29070 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
29080 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
29090 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
290a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
290b0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
290c0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
290d0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
290e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
290f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
29100 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
29110 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
29120 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
29130 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
29140 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
29150 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
29160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29170 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
29180 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
29190 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
291a0 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
291b0 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
291c0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
291d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
291e0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
291f0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
29200 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
29210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
29220 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
29230 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
29240 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
29250 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
29260 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
29270 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
29280 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
29290 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
292a0 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
292b0 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
292c0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
292d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
292e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
292f0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
29300 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
29310 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
29320 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
29330 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
29340 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
29350 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
29360 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
29370 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
29380 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
29390 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
293a0 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
293b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
293c0 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
293d0 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e  sDistinct; /* In
293e0 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
293f0 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  e the DISTINCT k
29400 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74  eyword */.  Sort
29410 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20  Ctx sSort;      
29420 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f     /* Info on ho
29430 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52  w to code the OR
29440 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
29450 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
29460 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
29470 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
29480 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
29490 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
294a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
294b0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
294c0 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
294d0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
294e0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
294f0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
29500 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  nnection */..#if
29510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29520 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
29530 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20  RestoreSelectId 
29540 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
29550 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  tId;.  pParse->i
29560 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
29570 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
29580 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  ++;.#endif..  db
29590 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
295a0 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d   if( p==0 || db-
295b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
295c0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
295d0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
295e0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
295f0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
29600 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
29610 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
29620 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 1;.  memset(&
29630 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  sAggInfo, 0, siz
29640 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a  eof(sAggInfo));.
29650 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
29660 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72 73 65  ENABLED.  pParse
29670 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b  ->nSelectIndent+
29680 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  +;.  SELECTTRACE
29690 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62  (1,pParse,p, ("b
296a0 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a  egin processing:
296b0 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73 71 6c  \n"));.  if( sql
296c0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
296d0 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73  & 0x100 ){.    s
296e0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
296f0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
29700 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
29710 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
29720 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
29730 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66  est!=SRT_DistFif
29740 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
29750 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
29760 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
29770 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  RT_Fifo );.  ass
29780 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
29790 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
297a0 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65  est!=SRT_DistQue
297b0 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ue );.  assert( 
297c0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
297d0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
297e0 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69  SRT_Queue );.  i
297f0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
29800 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
29810 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
29820 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
29830 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
29840 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
29850 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
29860 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
29870 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
29880 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
29890 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  d ||.           
298a0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
298b0 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73  T_Queue  || pDes
298c0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
298d0 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20  stFifo ||.      
298e0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
298f0 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
29900 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
29910 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20  ==SRT_Fifo);.   
29920 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20   /* If ORDER BY 
29930 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
29940 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75  nce in the outpu
29950 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64  t then neither d
29960 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49  oes.    ** DISTI
29970 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65  NCT so it can be
29980 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f   removed too. */
29990 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
299a0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
299b0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
299c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
299d0 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
299e0 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
299f0 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
29a00 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
29a10 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73  e, p, 0);.  mems
29a20 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69  et(&sSort, 0, si
29a30 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20  zeof(sSort));.  
29a40 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
29a50 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
29a60 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
29a70 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
29a80 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
29a90 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
29aa0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29ab0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
29ac0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
29ad0 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  sAgg = (p->selFl
29ae0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
29af0 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74  te)!=0;.  assert
29b00 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 23  ( pEList!=0 );.#
29b10 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
29b20 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
29b30 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
29b40 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53  & 0x100 ){.    S
29b50 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
29b60 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74  ,pParse,p, ("aft
29b70 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
29b80 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  on:\n"));.    sq
29b90 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
29ba0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
29bb0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20  }.#endif...  /* 
29bc0 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
29bd0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20   code..  */.  v 
29be0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
29bf0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
29c00 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
29c10 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66  ct_end;..  /* If
29c20 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
29c30 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
29c40 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
29c50 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
29c60 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
29c70 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
29c80 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
29c90 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72  Y.  if( checkFor
29ca0 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
29cb0 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
29cc0 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Dest, pEList->nE
29cd0 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  xpr) ){.    goto
29ce0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
29cf0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
29d00 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
29d10 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
29d20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
29d30 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  se.  */.#if !def
29d40 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
29d50 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
29d60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
29d70 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
29d80 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
29d90 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
29da0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
29db0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
29dc0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
29dd0 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
29de0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
29df0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
29e00 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
29e10 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67  ct;.    int isAg
29e20 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 70  gSub;..    if( p
29e30 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
29e40 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74  e;..    /* Somet
29e50 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  imes the code fo
29e60 72 20 61 20 73 75 62 71 75 65 72 79 20 77 69 6c  r a subquery wil
29e70 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d  l be generated m
29e80 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ore than.    ** 
29e90 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75 62  once, if the sub
29ea0 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66  query is part of
29eb0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
29ec0 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e in a LEFT JOIN
29ed0 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61  ,.    ** for exa
29ee0 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63  mple.  In that c
29ef0 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65  ase, do not rege
29f00 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
29f10 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20  to manifest.    
29f20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68 65  ** a view or the
29f30 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69   co-routine to i
29f40 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e  mplement a view.
29f50 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 73 74    The first inst
29f60 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  ance.    ** is s
29f70 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67  ufficient, thoug
29f80 68 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  h the subroutine
29f90 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65   to manifest the
29fa0 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a   view does need.
29fb0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76      ** to be inv
29fc0 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  oked again. */. 
29fd0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64     if( pItem->ad
29fe0 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20  drFillSub ){.   
29ff0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 76 69     if( pItem->vi
2a000 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b  aCoroutine==0 ){
2a010 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a020 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a030 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72  _Gosub, pItem->r
2a040 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  egReturn, pItem-
2a050 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
2a060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
2a070 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
2a080 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
2a090 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
2a0a0 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
2a0b0 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
2a0c0 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
2a0d0 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
2a0e0 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74  this, the parent
2a0f0 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69   select. The chi
2a100 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a  ld select.    **
2a110 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70   may contain exp
2a120 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66  ression trees of
2a130 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20   at most.    ** 
2a140 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  (SQLITE_MAX_EXPR
2a150 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65  _DEPTH-Parse.nHe
2a160 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68  ight) height. Th
2a170 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20  is is a bit.    
2a180 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61  ** more conserva
2a190 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73  tive than necess
2a1a0 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61  ary, but much ea
2a1b0 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63  sier than enforc
2a1c0 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78  ing.    ** an ex
2a1d0 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a  act limit..    *
2a1e0 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  /.    pParse->nH
2a1f0 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33  eight += sqlite3
2a200 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
2a210 28 70 29 3b 0a 0a 20 20 20 20 69 73 41 67 67 53  (p);..    isAggS
2a220 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46  ub = (pSub->selF
2a230 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2a240 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28  ate)!=0;.    if(
2a250 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
2a260 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
2a270 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20  sAgg, isAggSub) 
2a280 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2a290 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
2a2a0 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
2a2b0 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
2a2c0 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62      if( isAggSub
2a2d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67   ){.        isAg
2a2e0 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  g = 1;.        p
2a2f0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2a300 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
2a310 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31    }.      i = -1
2a320 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2a330 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
2a340 31 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  1.           && 
2a350 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2a360 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53  led(db, SQLITE_S
2a370 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20  ubqCoroutine).  
2a380 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d    ){.      /* Im
2a390 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75  plement a co-rou
2a3a0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
2a3b0 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
2a3c0 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2a3d0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e  .      ** set on
2a3e0 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
2a3f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2a400 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73   int addrTop = s
2a410 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2a420 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20  tAddr(v)+1;.    
2a430 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2a440 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
2a450 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
2a460 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2a470 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
2a480 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2a490 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  rn, 0, addrTop);
2a4a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2a4b0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74  nt((v, "%s", pIt
2a4c0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2a4d0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2a4e0 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64  addrFillSub = ad
2a4f0 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  drTop;.      sql
2a500 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
2a510 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
2a520 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
2a530 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2a540 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2a550 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
2a560 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
2a570 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
2a580 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2a590 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
2a5a0 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
2a5b0 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
2a5c0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69  RowLogEst = sqli
2a5d0 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e  te3LogEst(pSub->
2a5e0 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
2a5f0 20 20 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72     pItem->viaCor
2a600 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  outine = 1;.    
2a610 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75    pItem->regResu
2a620 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  lt = dest.iSdst;
2a630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2a640 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
2a650 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  ndCoroutine, pIt
2a660 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2a670 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a680 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2a690 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73  rTop-1);.      s
2a6a0 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2a6b0 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
2a6c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a6d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2a6e0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2a6f0 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
2a700 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
2a710 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  h.      ** the c
2a720 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73  ontent of this s
2a730 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d  ubquery.  pItem-
2a740 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c  >addrFillSub wil
2a750 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  l point.      **
2a760 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
2a770 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2a780 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49   subroutine.  pI
2a790 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20  tem->regReturn. 
2a7a0 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67       ** is a reg
2a7b0 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
2a7c0 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72  to hold the subr
2a7d0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64  outine return ad
2a7e0 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20  dress.      */. 
2a7f0 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72       int topAddr
2a800 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
2a810 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
2a820 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20  int retAddr;.   
2a830 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
2a840 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
2a850 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
2a860 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
2a870 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2a880 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
2a890 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a8a0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2a8b0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2a8c0 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
2a8d0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
2a8e0 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
2a8f0 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72  if( pItem->isCor
2a900 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20  related==0 ){.  
2a910 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2a920 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
2a930 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69  correlated and i
2a940 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73  f we are not ins
2a950 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ide of.        *
2a960 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65  * a trigger, the
2a970 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  n we only need t
2a980 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61  o compute the va
2a990 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  lue of the subqu
2a9a0 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ery.        ** o
2a9b0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nce. */.        
2a9c0 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74  onceAddr = sqlit
2a9d0 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
2a9e0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
2a9f0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
2aa00 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  eComment((v, "ma
2aa10 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
2aa20 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2aa30 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
2aa40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64  else{.        Vd
2aa50 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
2aa60 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
2aa70 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
2aa80 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2aa90 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2aaa0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
2aab0 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68  t(&dest, SRT_Eph
2aac0 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43  emTab, pItem->iC
2aad0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78  ursor);.      ex
2aae0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2aaf0 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
2ab00 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
2ab10 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
2ab20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2ab30 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
2ab40 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
2ab50 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
2ab60 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  ogEst = sqlite3L
2ab70 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c  ogEst(pSub->nSel
2ab80 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69  ectRow);.      i
2ab90 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71  f( onceAddr ) sq
2aba0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2abb0 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a  e(v, onceAddr);.
2abc0 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20        retAddr = 
2abd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2abe0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2abf0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2ac00 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2ac10 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
2ac20 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2ac30 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
2ac40 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2ac50 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72  P1(v, topAddr, r
2ac60 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73  etAddr);.      s
2ac70 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2ac80 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
2ac90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f  .    }.    if( /
2aca0 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c  *pParse->nErr ||
2acb0 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  */ db->mallocFai
2acc0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  led ){.      got
2acd0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2ace0 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
2acf0 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
2ad00 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
2ad10 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c  ht(p);.    pTabL
2ad20 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2ad30 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
2ad40 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2ad50 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  ){.      sSort.p
2ad60 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2ad70 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
2ad80 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
2ad90 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20  EList;.#endif.  
2ada0 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
2adb0 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
2adc0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
2add0 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
2ade0 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63  ving;.  sDistinc
2adf0 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73  t.isTnct = (p->s
2ae00 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
2ae10 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e  tinct)!=0;..#ifn
2ae20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ae30 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
2ae40 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2ae50 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
2ae60 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
2ae70 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
2ae80 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
2ae90 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
2aea0 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
2aeb0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
2aec0 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61  Dest);.    expla
2aed0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
2aee0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2aef0 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
2af00 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2af10 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53  CE_ENABLED.    S
2af20 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
2af30 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70  rse,p,("end comp
2af40 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63  ound-select proc
2af50 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20  essing\n"));.   
2af60 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
2af70 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66  Indent--;.#endif
2af80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2af90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2afa0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2afb0 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61   DISTINCT with a
2afc0 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69  n ORDER BY but i
2afd0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
2afe0 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66  te, and .  ** if
2aff0 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   the select-list
2b000 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2b010 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73  the ORDER BY lis
2b020 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65  t, then this que
2b030 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72  ry.  ** can be r
2b040 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52  ewritten as a GR
2b050 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72  OUP BY. In other
2b060 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20   words, this:.  
2b070 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2b080 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20  CT DISTINCT xyz 
2b090 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42  FROM ... ORDER B
2b0a0 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
2b0b0 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
2b0c0 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
2b0d0 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d   SELECT xyz FROM
2b0e0 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79   ... GROUP BY xy
2b0f0 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  z ORDER BY xyz. 
2b100 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
2b110 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66  ond form is pref
2b120 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c  erred as a singl
2b130 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70  e index (or temp
2b140 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a  -table) may be .
2b150 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f    ** used for bo
2b160 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
2b170 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f  and DISTINCT pro
2b180 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67  cessing. As orig
2b190 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69  inally .  ** wri
2b1a0 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d  tten the query m
2b1b0 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74  ust use a temp-t
2b1c0 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73  able for at leas
2b1d0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44  t one of the ORD
2b1e0 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20  ER .  ** BY and 
2b1f0 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e  DISTINCT, and an
2b200 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61   index or separa
2b210 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f  te temp-table fo
2b220 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a  r the other..  *
2b230 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
2b240 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
2b250 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
2b260 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
2b270 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
2b280 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53  prListCompare(sS
2b290 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 2d  ort.pOrderBy, p-
2b2a0 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a  >pEList, -1)==0.
2b2b0 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46    ){.    p->selF
2b2c0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
2b2d0 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72  inct;.    p->pGr
2b2e0 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
2b2f0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
2b300 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  ->pEList, 0);.  
2b310 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2b320 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 2f 2a  pGroupBy;.    /*
2b330 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65   Notice that eve
2b340 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73  n thought SF_Dis
2b350 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63  tinct has been c
2b360 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73  leared from p->s
2b370 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20  elFlags,.    ** 
2b380 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73  the sDistinct.is
2b390 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65  Tnct is still se
2b3a0 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63  t.  Hence, isTnc
2b3b0 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2b3c0 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  .    ** original
2b3d0 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20   setting of the 
2b3e0 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67  SF_Distinct flag
2b3f0 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e  , not the curren
2b400 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20  t setting */.   
2b410 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e   assert( sDistin
2b420 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d  ct.isTnct );.  }
2b430 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
2b440 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
2b450 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73  lause, then this
2b460 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e   sorting.  ** in
2b470 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
2b480 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
2b490 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
2b4a0 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64   .  ** extracted
2b4b0 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
2b4c0 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69  rder.  If that i
2b4d0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
2b4e0 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65   the.  ** OP_Ope
2b4f0 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
2b500 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  uction will be c
2b510 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
2b520 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77  Noop once.  ** w
2b530 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61  e figure out tha
2b540 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  t the sorting in
2b550 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65  dex is not neede
2b560 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74  d.  The addrSort
2b570 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61  Index.  ** varia
2b580 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
2b590 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63  acilitate that c
2b5a0 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
2b5b0 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2b5c0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
2b5d0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
2b5e0 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
2b5f0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
2b600 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  arse, sSort.pOrd
2b610 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d  erBy, 0, pEList-
2b620 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f  >nExpr);.    sSo
2b630 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  rt.iECursor = pP
2b640 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2b650 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
2b660 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
2b670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2b680 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2b690 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ral,.          s
2b6a0 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73  Sort.iECursor, s
2b6b0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2b6c0 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e  Expr+1+pEList->n
2b6d0 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  Expr, 0,.       
2b6e0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
2b6f0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20  fo, P4_KEYINFO. 
2b700 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b       );.  }else{
2b710 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
2b720 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
2b730 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2b740 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
2b750 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
2b760 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
2b770 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
2b780 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
2b790 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
2b7a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2b7b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b7c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
2b7d0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
2b7e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
2b7f0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
2b800 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
2b810 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
2b820 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2b830 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
2b840 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   = LARGEST_INT64
2b850 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
2b860 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
2b870 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66  , p, iEnd);.  if
2b880 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26  ( p->iLimit==0 &
2b890 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  & sSort.addrSort
2b8a0 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
2b8b0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
2b8c0 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2b8d0 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65  rtIndex)->opcode
2b8e0 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e   = OP_SorterOpen
2b8f0 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
2b900 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
2b910 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
2b920 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
2b930 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
2b940 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
2b950 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
2b960 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2b970 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
2b980 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
2b990 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
2b9a0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
2b9b0 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
2b9c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2b9d0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
2b9e0 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba00 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
2ba10 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
2ba20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba40 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
2ba50 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2ba60 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30  rse, p->pEList,0
2ba70 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,0),.           
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba90 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
2baa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2bab0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
2bac0 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
2bad0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2bae0 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
2baf0 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
2bb00 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
2bb10 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2bb20 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
2bb30 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  INCT_NOOP;.  }..
2bb40 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
2bb50 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
2bb60 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61     /* No aggrega
2bb70 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
2bb80 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
2bb90 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77  use */.    u16 w
2bba0 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69  ctrlFlags = (sDi
2bbb0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20  stinct.isTnct ? 
2bbc0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
2bbd0 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  NCT : 0);..    /
2bbe0 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
2bbf0 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
2bc00 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2bc10 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2bc20 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2bc30 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Where, sSort.pOr
2bc40 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
2bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc60 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c        p->pEList,
2bc70 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b   wctrlFlags, 0);
2bc80 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
2bc90 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2bca0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71  _end;.    if( sq
2bcb0 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
2bcc0 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
2bcd0 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
2bce0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   ){.      p->nSe
2bcf0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
2bd00 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
2bd10 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ount(pWInfo);.  
2bd20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73    }.    if( sDis
2bd30 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
2bd40 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
2bd50 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29  stinct(pWInfo) )
2bd60 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63  {.      sDistinc
2bd70 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71  t.eTnctType = sq
2bd80 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
2bd90 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  inct(pWInfo);.  
2bda0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72    }.    if( sSor
2bdb0 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
2bdc0 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
2bdd0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2bde0 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
2bdf0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72  ;.      if( sSor
2be00 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e  t.nOBSat==sSort.
2be10 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
2be20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
2be30 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
2be40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2be50 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
2be60 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
2be70 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
2be80 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
2be90 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
2bea0 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
2beb0 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
2bec0 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
2bed0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2bee0 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
2bef0 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
2bf00 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  /.    if( sSort.
2bf10 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
2bf20 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72   && sSort.pOrder
2bf30 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
2bf40 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2bf50 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
2bf60 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
2bf70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
2bf80 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
2bf90 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
2bfa0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
2bfb0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
2bfc0 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  ist, -1, &sSort,
2bfd0 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
2bfe0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
2bff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2c000 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65  hereContinueLabe
2c010 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20  l(pWInfo),.     
2c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2c030 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
2c040 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
2c050 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
2c060 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
2c070 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
2c080 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2c090 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
2c0a0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
2c0b0 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69  e when there exi
2c0c0 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  st aggregate fun
2c0d0 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55  ctions or a GROU
2c0e0 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  P BY clause.    
2c0f0 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20  ** or both */.  
2c100 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
2c110 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
2c120 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
2c130 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
2c140 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
2c150 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
2c160 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
2c170 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
2c180 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
2c190 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
2c1a0 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
2c1b0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
2c1c0 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
2c1d0 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
2c1e0 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
2c1f0 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
2c200 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
2c210 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
2c220 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c240 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
2c250 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
2c260 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
2c270 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c290 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
2c2a0 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
2c2b0 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
2c2c0 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
2c2d0 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
2c2e0 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
2c2f0 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
2c300 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
2c310 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
2c320 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
2c330 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
2c340 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a  drEnd;        /*
2c350 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69   End of processi
2c360 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ng for this SELE
2c370 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  CT */.    int so
2c380 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a  rtPTab = 0;   /*
2c390 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65   Pseudotable use
2c3a0 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74  d to decode sort
2c3b0 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ing results */. 
2c3c0 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d     int sortOut =
2c3d0 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74   0;    /* Output
2c3e0 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74   register from t
2c3f0 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
2c400 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20   int orderByGrp 
2c410 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 0; /* True if 
2c420 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64  the GROUP BY and
2c430 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68   ORDER BY are th
2c440 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f  e same */..    /
2c450 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64  * Remove any and
2c460 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74   all aliases bet
2c470 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ween the result 
2c480 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20  set and the.    
2c490 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ** GROUP BY clau
2c4a0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
2c4b0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
2c4c0 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
2c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2c4f0 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  er */.      stru
2c500 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2c510 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72   *pItem;  /* For
2c520 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
2c530 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69  pression in a li
2c540 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  st */..      for
2c550 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  (k=p->pEList->nE
2c560 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45  xpr, pItem=p->pE
2c570 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  List->a; k>0; k-
2c580 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
2c590 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
2c5a0 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
2c5b0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d    }.      for(k=
2c5c0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
2c5d0 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
2c5e0 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
2c5f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2c600 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
2c610 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
2c620 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
2c630 65 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e  ectRow>100 ) p->
2c640 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30 30  nSelectRow = 100
2c650 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c660 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
2c670 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20   = 1;.    }...  
2c680 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2c690 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59   both a GROUP BY
2c6a0 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59   and an ORDER BY
2c6b0 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79   clause and they
2c6c0 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e   are.    ** iden
2c6d0 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  tical, then it m
2c6e0 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ay be possible t
2c6f0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52  o disable the OR
2c700 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20  DER BY clause . 
2c710 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f     ** on the gro
2c720 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52  unds that the GR
2c730 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73  OUP BY will caus
2c740 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f  e elements to co
2c750 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69  me out .    ** i
2c760 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  n the correct or
2c770 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79  der. It also may
2c780 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50   not - the GROUP
2c790 20 42 59 20 6d 61 79 20 75 73 65 20 61 0a 20 20   BY may use a.  
2c7a0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e    ** database in
2c7b0 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20  dex that causes 
2c7c0 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70  rows to be group
2c7d0 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72  ed together as r
2c7e0 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62  equired.    ** b
2c7f0 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ut not actually 
2c800 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77  sorted. Either w
2c810 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ay, record the f
2c820 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20  act that the.   
2c830 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64   ** ORDER BY and
2c840 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2c850 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62  s are the same b
2c860 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72  y setting the or
2c870 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20  derByGrp.    ** 
2c880 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
2c890 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2c8a0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72  rListCompare(pGr
2c8b0 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72  oupBy, sSort.pOr
2c8c0 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b  derBy, -1)==0 ){
2c8d0 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72  .      orderByGr
2c8e0 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20  p = 1;.    }. . 
2c8f0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
2c900 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
2c910 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
2c920 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
2c930 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
2c940 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2c950 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
2c960 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
2c970 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
2c980 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
2c990 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
2c9a0 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
2c9b0 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
2c9c0 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
2c9d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
2c9e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
2c9f0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
2ca00 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
2ca10 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
2ca20 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
2ca30 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2ca40 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
2ca50 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
2ca60 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
2ca70 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
2ca80 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20  AggInfo.mnReg = 
2ca90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
2caa0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
2cab0 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
2cac0 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
2cad0 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  y->nExpr : 0;.  
2cae0 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
2caf0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
2cb00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2cb10 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2cb20 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
2cb30 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2cb40 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
2cb50 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29   sSort.pOrderBy)
2cb60 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
2cb70 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
2cb80 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2cb90 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
2cba0 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
2cbb0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
2cbc0 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
2cbd0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
2cbe0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
2cbf0 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
2cc00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2cc10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2cc20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
2cc30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
2cc40 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2cc50 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  sNC.ncFlags |= N
2cc60 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
2cc70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2cc80 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
2cc90 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
2cca0 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
2ccb0 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  ist);.      sNC.
2ccc0 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49  ncFlags &= ~NC_I
2ccd0 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a  nAggFunc;.    }.
2cce0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52      sAggInfo.mxR
2ccf0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2cd00 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  m;.    if( db->m
2cd10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2cd20 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
2cd30 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
2cd40 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
2cd50 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
2cd60 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
2cd70 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
2cd80 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
2cd90 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
2cda0 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
2cdb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2cdc0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
2cdd0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2cde0 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
2cdf0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
2ce00 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
2ce10 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
2ce20 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
2ce30 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
2ce40 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
2ce50 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
2ce60 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
2ce70 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
2ce80 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
2ce90 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
2cea0 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
2ceb0 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
2cec0 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
2ced0 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
2cee0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
2cef0 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
2cf00 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
2cf10 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
2cf20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
2cf30 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
2cf40 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
2cf50 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
2cf60 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
2cf70 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
2cf80 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2cf90 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
2cfa0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
2cfb0 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
2cfc0 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
2cfd0 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
2cfe0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2cff0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2d000 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
2d010 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2d020 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
2d030 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
2d040 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2d050 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
2d060 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
2d070 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
2d080 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
2d090 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
2d0a0 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
2d0b0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
2d0c0 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
2d0d0 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
2d0e0 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
2d0f0 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
2d100 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
2d110 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
2d120 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
2d130 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
2d140 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
2d150 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2d160 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
2d170 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2d180 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
2d190 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2d1a0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2d1b0 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  y, 0, sAggInfo.n
2d1c0 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
2d1d0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
2d1e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d1f0 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
2d200 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
2d210 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2d220 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
2d230 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
2d240 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
2d250 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2d260 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
2d270 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
2d280 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
2d290 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
2d2a0 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
2d2b0 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
2d2c0 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
2d2d0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2d2e0 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
2d2f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2d300 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
2d310 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
2d320 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2d330 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2d340 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2d350 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
2d360 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
2d370 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2d380 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
2d390 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2d3a0 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
2d3b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2d3c0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2d3d0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2d3e0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
2d3f0 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
2d400 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2d410 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2d420 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2d430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d440 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2d450 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
2d460 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2d470 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
2d480 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
2d490 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d4a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d4b0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
2d4c0 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2d4d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2d4e0 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
2d4f0 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
2d500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d510 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
2d520 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65  , 0, iAMem, iAMe
2d530 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  m+pGroupBy->nExp
2d540 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r-1);..      /* 
2d550 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
2d560 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
2d570 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
2d580 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
2d590 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
2d5a0 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
2d5b0 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
2d5c0 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
2d5d0 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
2d5e0 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
2d5f0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
2d600 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
2d610 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
2d620 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
2d630 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
2d640 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
2d650 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
2d660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2d680 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2d690 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2d6a0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2d6b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2d6c0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2d6d0 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c  Where, pGroupBy,
2d6e0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48   0,.          WH
2d6f0 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f  ERE_GROUPBY | (o
2d700 72 64 65 72 42 79 47 72 70 20 3f 20 57 48 45 52  rderByGrp ? WHER
2d710 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20  E_SORTBYGROUP : 
2d720 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  0), 0.      );. 
2d730 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
2d740 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2d750 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
2d760 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
2d770 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70  dered(pWInfo)==p
2d780 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29  GroupBy->nExpr )
2d790 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2d7a0 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
2d7b0 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
2d7c0 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
2d7d0 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
2d7e0 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
2d7f0 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
2d800 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2d810 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
2d820 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
2d830 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
2d840 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
2d850 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
2d860 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
2d870 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
2d880 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
2d890 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2d8a0 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
2d8b0 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
2d8c0 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
2d8d0 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
2d8e0 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
2d8f0 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
2d900 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
2d910 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
2d920 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2d930 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
2d940 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
2d950 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
2d960 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
2d970 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
2d980 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
2d990 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
2d9a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
2d9b0 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
2d9c0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
2d9d0 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
2d9e0 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ..        explai
2d9f0 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
2da00 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2da10 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
2da20 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
2da30 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d  s&SF_Distinct)==
2da40 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  0) ?.           
2da50 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e           "DISTIN
2da60 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22  CT" : "GROUP BY"
2da70 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
2da80 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
2da90 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
2daa0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2dab0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
2dac0 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2dad0 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2dae0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2daf0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2db00 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2db10 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66       if( sAggInf
2db20 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65  o.aCol[i].iSorte
2db30 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2db40 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
2db50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
2db60 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2db70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2db80 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
2db90 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
2dba0 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
2dbb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2dbc0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2dbd0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2dbe0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
2dbf0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
2dc00 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
2dc10 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  0);.        j = 
2dc20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2dc30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2dc40 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
2dc50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
2dc60 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
2dc70 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
2dc80 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
2dc90 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2dca0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
2dcb0 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2dcc0 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
2dcd0 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
2dce0 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20     int r2;..    
2dcf0 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
2dd00 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
2dd10 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20  olumn(pParse, . 
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2dd40 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
2dd50 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
2dd60 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20  Table, r1, 0);. 
2dd70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2dd80 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20  1!=r2 ){.       
2dd90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2dda0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2ddb0 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20  Copy, r2, r1);. 
2ddc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ddd0 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
2dde0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ddf0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
2de00 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
2de10 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2de20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2de30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2de40 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
2de50 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
2de60 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2de70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2de80 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2de90 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
2dea0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
2deb0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2dec0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2ded0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
2dee0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2def0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2df00 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
2df10 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
2df20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2df30 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2df40 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
2df50 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
2df60 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
2df70 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2df80 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
2df90 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2dfa0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2dfb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2dfc0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
2dfd0 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
2dfe0 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
2dff0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2e000 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e010 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
2e020 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2e030 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
2e040 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2e050 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
2e060 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f   sort")); VdbeCo
2e070 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2e080 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
2e090 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
2e0a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2e0b0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2e0c0 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a  rse);..      }..
2e0d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2e0e0 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61  index or tempora
2e0f0 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ry table used by
2e100 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f   the GROUP BY so
2e110 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  rt.      ** will
2e120 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76   naturally deliv
2e130 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  er rows in the o
2e140 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79  rder required by
2e150 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
2e160 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63      ** clause, c
2e170 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65  ancel the epheme
2e180 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63  ral table open c
2e190 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20  oded earlier..  
2e1a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2e1b0 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2e1c0 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
2e1d0 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
2e1e0 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
2e1f0 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  dless..      ** 
2e200 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
2e210 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
2e220 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
2e230 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20  TCTRL_OPTIMIZER 
2e240 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  to .      ** dis
2e250 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69  able this optimi
2e260 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69  zation for testi
2e270 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f  ng purposes.  */
2e280 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72  .      if( order
2e290 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a  ByGrp && Optimiz
2e2a0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
2e2b0 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2e2c0 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26  rder) .       &&
2e2d0 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c   (groupBySort ||
2e2e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
2e2f0 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20  orted(pWInfo)). 
2e300 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e310 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2e320 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
2e330 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
2e340 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
2e350 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
2e360 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
2e370 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
2e380 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
2e390 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
2e3a0 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
2e3b0 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
2e3c0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
2e3d0 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
2e3e0 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
2e3f0 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
2e400 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
2e410 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
2e420 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
2e430 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
2e440 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
2e450 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
2e460 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
2e470 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
2e480 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e490 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
2e4a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2e4b0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2e4c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2e4d0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2e4e0 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
2e4f0 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
2e500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e510 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
2e520 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ata, sAggInfo.so
2e530 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75  rtingIdx, sortOu
2e540 74 2c 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20  t,sortPTab);.   
2e550 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
2e560 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
2e570 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
2e580 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
2e590 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
2e5a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e5b0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
2e5c0 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
2e5d0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
2e5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e5f0 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
2e600 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
2e610 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2e620 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
2e630 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
2e640 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
2e650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e660 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e670 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
2e680 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
2e690 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
2e6a0 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2e6c0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
2e6d0 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
2e6e0 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
2e6f0 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
2e700 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2e710 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
2e720 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2e730 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20   OP_Jump, j1+1, 
2e740 30 2c 20 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f  0, j1+1); VdbeCo
2e750 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
2e760 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
2e770 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
2e780 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20  never the GROUP 
2e790 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20  BY changes..    
2e7a0 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20    ** Changes in 
2e7b0 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65  the GROUP BY are
2e7c0 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
2e7d0 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
2e7e0 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20       ** block.  
2e7f0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
2e800 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62   changes, this b
2e810 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e  lock is skipped.
2e820 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2e830 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70  ** This code cop
2e840 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75  ies current grou
2e850 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30  p by terms in b0
2e860 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20  ,b1,b2,....     
2e870 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61   ** over to a0,a
2e880 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63  1,a2.  It then c
2e890 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20  alls the output 
2e8a0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
2e8b0 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74   ** and resets t
2e8c0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2e8d0 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
2e8e0 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  rs in preparatio
2e8f0 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  n.      ** for t
2e900 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59  he next GROUP BY
2e910 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f   batch..      */
2e920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2e930 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
2e940 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c  e, iBMem, iAMem,
2e950 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2e960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e970 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e980 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
2e990 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
2e9a0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
2e9b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
2e9c0 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
2e9d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e9e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
2e9f0 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
2ea00 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43   addrEnd); VdbeC
2ea10 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2ea20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2ea30 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66  , "check abort f
2ea40 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
2ea50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ea60 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2ea70 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2ea80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2ea90 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20  ment((v, "reset 
2eaa0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
2eab0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
2eac0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
2ead0 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65  ccumulators base
2eae0 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
2eaf0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
2eb00 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20   current row.   
2eb10 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2eb20 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2eb30 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70  v, j1);.      up
2eb40 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
2eb50 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2eb60 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
2eb70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2eb80 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
2eb90 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
2eba0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2ebb0 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
2ebc0 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
2ebd0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
2ebe0 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
2ebf0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
2ec00 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
2ec10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ec20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2ec30 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  terNext, sAggInf
2ec40 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2ec50 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
2ec60 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2ec70 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
2ec80 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2ec90 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
2eca0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
2ecb0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
2ecc0 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
2ecd0 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  ingIdx);.      }
2ece0 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
2ecf0 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
2ed00 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
2ed10 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2ed20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2ed30 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
2ed40 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
2ed50 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
2ed60 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
2ed70 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
2ed80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
2ed90 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75   over the subrou
2eda0 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20  tines.      */. 
2edb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2edc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2edd0 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a  o, 0, addrEnd);.
2ede0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2edf0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2ee00 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
2ee10 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
2ee20 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
2ee30 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
2ee40 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
2ee50 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
2ee60 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
2ee70 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
2ee80 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
2ee90 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
2eea0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
2eeb0 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
2eec0 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
2eed0 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
2eee0 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
2eef0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
2ef00 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
2ef10 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
2ef20 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2ef30 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2ef40 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
2ef50 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
2ef60 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
2ef70 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
2ef80 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
2ef90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2efa0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2efb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2efc0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2efd0 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
2efe0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2eff0 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
2f000 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
2f010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f020 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2f030 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
2f040 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f050 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2f060 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  v, addrOutputRow
2f070 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
2f080 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
2f090 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f0a0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2f0b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f0c0 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
2f0d0 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
2f0e0 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
2f0f0 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
2f100 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f  Comment((v, "Gro
2f110 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
2f120 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
2f130 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
2f140 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2f150 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2f160 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2f170 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
2f180 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
2f190 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2f1a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2f1b0 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
2f1c0 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
2f1d0 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  w+1, SQLITE_JUMP
2f1e0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
2f1f0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
2f200 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
2f210 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  ist, -1, &sSort,
2f220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f230 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63         &sDistinc
2f240 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f260 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
2f270 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a   addrSetAbort);.
2f280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f290 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2f2a0 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
2f2b0 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
2f2c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
2f2d0 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  groupby result g
2f2e0 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20  enerator"));..  
2f2f0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2f300 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
2f310 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65  t will reset the
2f320 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75   group-by accumu
2f330 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20  lator.      */. 
2f340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f350 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2f360 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2f370 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
2f380 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
2f390 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2f3a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2f3b0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
2f3c0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20  Reset);.     .  
2f3d0 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
2f3e0 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67  oupBy.  Begin ag
2f3f0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
2f400 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59  without GROUP BY
2f410 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a  : */.    else {.
2f420 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
2f430 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65  pDel = 0;.#ifnde
2f440 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
2f450 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54  REECOUNT.      T
2f460 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
2f470 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73    if( (pTab = is
2f480 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26  SimpleCount(p, &
2f490 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b  sAggInfo))!=0 ){
2f4a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
2f4b0 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72  sSimpleCount() r
2f4c0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
2f4d0 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75   to a Table stru
2f4e0 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20  cture, then.    
2f4f0 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73      ** the SQL s
2f500 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
2f510 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20  he form:.       
2f520 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2f530 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
2f540 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20   FROM <tbl>.    
2f550 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2f560 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c  * where the Tabl
2f570 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
2f580 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20  rned represents 
2f590 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20  table <tbl>..   
2f5a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2f5b0 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
2f5c0 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74  t is so common t
2f5d0 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69  hat it is optimi
2f5e0 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54  zed specially. T
2f5f0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50  he.        ** OP
2f600 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69  _Count instructi
2f610 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65  on is executed e
2f620 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74  ither on the int
2f630 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20  key table that. 
2f640 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
2f650 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ns the data for 
2f660 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f  table <tbl> or o
2f670 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64  n one of its ind
2f680 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20  exes. It.       
2f690 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f   ** is better to
2f6a0 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20   execute the op 
2f6b0 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20  on an index, as 
2f6c0 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f  indexes are almo
2f6d0 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  st.        ** al
2f6e0 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f  ways spread acro
2f6f0 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68  ss less pages th
2f700 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70  an their corresp
2f710 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20  onding tables.. 
2f720 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f730 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20    const int iDb 
2f740 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2f750 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
2f760 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
2f770 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
2f780 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72   int iCsr = pPar
2f790 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
2f7a0 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61  /* Cursor to sca
2f7b0 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  n b-tree */.    
2f7c0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
2f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2f7f0 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2f800 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
2f810 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
2f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f830 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61   Keyinfo for sca
2f840 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  nned index */.  
2f850 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65        Index *pBe
2f860 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
2f870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
2f880 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73  st index found s
2f890 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
2f8a0 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61   int iRoot = pTa
2f8b0 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  b->tnum;        
2f8c0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
2f8d0 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d  ge of scanned b-
2f8e0 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tree */..       
2f8f0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
2f900 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
2f910 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
2f920 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
2f930 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
2f940 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
2f950 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20  ->zName);..     
2f960 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2f970 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
2f980 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73  has the lowest s
2f990 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20  can cost..      
2f9a0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2f9b0 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20  (2011-04-15) Do 
2f9c0 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63  not do a full sc
2f9d0 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72  an of an unorder
2f9e0 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ed index..      
2f9f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2fa00 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20  (2013-10-03) Do 
2fa10 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e  not count the en
2fa20 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69  tries in a parti
2fa30 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  al index..      
2fa40 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2fa50 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
2fa60 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
2fa70 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
2fa80 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
2fa90 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
2faa0 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
2fab0 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
2fac0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2fad0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
2fae0 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71  ab) ) pBest = sq
2faf0 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
2fb00 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
2fb10 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
2fb20 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
2fb30 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
2fb40 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
2fb50 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
2fb60 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ed==0.          
2fb70 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   && pIdx->szIdxR
2fb80 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
2fb90 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
2fba0 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
2fbb0 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ere==0.         
2fbc0 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20    && (!pBest || 
2fbd0 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
2fbe0 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a  Best->szIdxRow).
2fbf0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2fc00 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d           pBest =
2fc10 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
2fc20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2fc30 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29       if( pBest )
2fc40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
2fc50 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
2fc60 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
2fc70 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
2fc80 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
2fc90 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  se, pBest);.    
2fca0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2fcb0 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
2fcc0 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75  ly cursor, execu
2fcd0 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c  te the OP_Count,
2fce0 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f   close the curso
2fcf0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  r. */.        sq
2fd00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2fd10 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  nt(v, OP_OpenRea
2fd20 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
2fd30 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  iDb, 1);.       
2fd40 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
2fd50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2fd60 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
2fd70 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
2fd80 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2fd90 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FO);.        }. 
2fda0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2fdb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
2fdc0 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
2fdd0 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
2fde0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
2fdf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2fe00 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
2fe10 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
2fe20 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50  inSimpleCount(pP
2fe30 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73  arse, pTab, pBes
2fe40 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  t);.      }else.
2fe50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2fe60 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
2fe70 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
2fe80 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
2fe90 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
2fea0 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
2feb0 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
2fec0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2fed0 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
2fee0 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
2fef0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
2ff00 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  ax(x) FROM .... 
2ff10 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2ff20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
2ff30 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65  hen ask the code
2ff40 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61   in where.c to a
2ff50 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72  ttempt to sort r
2ff60 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a  esults.        *
2ff70 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61  * as if there wa
2ff80 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78  s an "ORDER ON x
2ff90 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78  " or "ORDER ON x
2ffa0 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a   DESC" clause. .
2ffb0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68          ** If wh
2ffc0 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
2ffd0 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
2ffe0 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
2fff0 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
30000 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
30010 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
30020 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
30030 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
30040 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
30050 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
30060 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
30070 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
30080 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
30090 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
300a0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
300b0 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
300c0 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
300d0 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  m .        ** va
300e0 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e  lue of x, the on
300f0 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29  ly row required)
30100 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
30110 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61       ** A specia
30120 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70  l flag must be p
30130 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
30140 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20  WhereBegin() to 
30150 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20  slightly.       
30160 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76   ** modify behav
30170 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ior as follows:.
30180 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30190 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
301a0 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
301b0 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
301c0 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
301d0 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   by.        **  
301e0 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
301f0 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
30200 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
30210 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
30220 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66          **     f
30230 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  or x..        **
30240 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
30250 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
30260 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
30270 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
30280 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
30290 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
302a0 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
302b0 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
302c0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
302d0 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
302e0 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
302f0 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
30300 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
30310 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
30320 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  cases..        *
30330 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
30340 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
30350 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
30360 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20  details..       
30370 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
30380 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
30390 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c  0;.        u8 fl
303a0 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  ag = WHERE_ORDER
303b0 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  BY_NORMAL;.     
303c0 20 20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65     .        asse
303d0 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
303e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
303f0 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b  sert( flag==0 );
30400 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
30410 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20  pHaving==0 ){.  
30420 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d          flag = m
30430 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67 67  inMaxQuery(&sAgg
30440 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b  Info, &pMinMax);
30450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30460 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
30470 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d  =0 || (pMinMax!=
30480 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 && pMinMax->nE
30490 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20  xpr==1) );..    
304a0 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
304b0 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
304c0 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  x = sqlite3ExprL
304d0 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d  istDup(db, pMinM
304e0 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ax, 0);.        
304f0 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78    pDel = pMinMax
30500 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30510 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e  pMinMax && !db->
30520 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
30530 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
30540 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  Max->a[0].sortOr
30550 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52  der = flag!=WHER
30560 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31  E_ORDERBY_MIN ?1
30570 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0;.            
30580 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45  pMinMax->a[0].pE
30590 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
305a0 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UMN;.          }
305b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
305c0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
305d0 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
305e0 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
305f0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
30600 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
30610 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d   processing is m
30620 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63  uch simpler sinc
30630 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  e there is only 
30640 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20  a single row.   
30650 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
30660 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
30670 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
30680 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
30690 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
306a0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
306b0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
306c0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
306d0 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c  pWhere, pMinMax,
306e0 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20  0,flag,0);.     
306f0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
30700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
30710 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
30720 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
30730 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
30740 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
30750 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61    }.        upda
30760 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
30770 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
30780 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
30790 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20  ( pMinMax==0 || 
307a0 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d  pMinMax->nExpr==
307b0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
307c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
307d0 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30  rdered(pWInfo)>0
307e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
307f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30800 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73  v, OP_Goto, 0, s
30810 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
30820 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
30830 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
30840 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20  mment((v, "%s() 
30850 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20  by index",.     
30860 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
30870 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
30880 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
30890 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
308a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
308b0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
308c0 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41         finalizeA
308d0 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
308e0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
308f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
30900 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
30910 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
30920 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
30930 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
30940 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
30950 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
30960 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
30970 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
30980 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  List, -1, 0, 0, 
30990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
309a0 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64         pDest, ad
309b0 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b  drEnd, addrEnd);
309c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
309d0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
309e0 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pDel);.    }.  
309f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
30a00 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
30a10 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
30a20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
30a30 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  te query */..  i
30a40 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e  f( sDistinct.eTn
30a50 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
30a60 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
30a70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
30a80 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
30a90 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20   "DISTINCT");.  
30aa0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
30ab0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
30ac0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
30ad0 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
30ae0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
30af0 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
30b00 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
30b10 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
30b20 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
30b30 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  y ){.    explain
30b40 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
30b50 2c 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30  , sSort.nOBSat>0
30b60 20 3f 20 22 52 49 47 48 54 20 50 41 52 54 20 4f   ? "RIGHT PART O
30b70 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44  F ORDER BY":"ORD
30b80 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e  ER BY");.    gen
30b90 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
30ba0 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c  arse, p, &sSort,
30bb0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
30bc0 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
30bd0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
30be0 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
30bf0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
30c00 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
30c10 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
30c20 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
30c30 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
30c40 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
30c50 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
30c60 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
30c70 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
30c80 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
30c90 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
30ca0 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
30cb0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
30cc0 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
30cd0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
30ce0 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
30cf0 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
30d00 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  nd:.  explainSet
30d10 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
30d20 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
30d30 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20  oreSelectId);.. 
30d40 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
30d50 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73  umn names if res
30d60 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ults of the SELE
30d70 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74  CT are to be out
30d80 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  put..  */.  if( 
30d90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
30da0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
30db0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
30dc0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
30dd0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
30de0 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
30df0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62    }..  sqlite3Db
30e00 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
30e10 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
30e20 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
30e30 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69  gInfo.aFunc);.#i
30e40 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
30e50 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52  ABLED.  SELECTTR
30e60 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
30e70 22 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c  "end processing\
30e80 6e 22 29 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  n"));.  pParse->
30e90 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
30ea0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
30eb0 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
30ec0 51 4c 49 54 45 5f 44 45 42 55 47 0a 76 6f 69 64  QLITE_DEBUG.void
30ed0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
30ee0 72 28 45 78 70 72 20 2a 70 29 3b 0a 76 6f 69 64  r(Expr *p);.void
30ef0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
30f00 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
30f10 70 4c 69 73 74 29 3b 0a 76 6f 69 64 20 73 71 6c  pList);.void sql
30f20 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
30f30 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
30f40 6e 64 65 6e 74 29 3b 0a 2f 2a 0a 2a 2a 20 47 65  ndent);./*.** Ge
30f50 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72  nerate a human-r
30f60 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70 74  eadable descript
30f70 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65 6c  ion of a the Sel
30f80 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  ect object..*/.v
30f90 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65 65 56  oid sqlite3TreeV
30fa0 69 65 77 53 65 6c 65 63 74 28 54 72 65 65 56 69  iewSelect(TreeVi
30fb0 65 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74  ew *pView, const
30fc0 20 53 65 6c 65 63 74 20 2a 70 2c 20 75 38 20 6d   Select *p, u8 m
30fd0 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20  oreToFollow){.  
30fe0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 70 56 69  int n = 0;.  pVi
30ff0 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72 65 65  ew = sqlite3Tree
31000 56 69 65 77 50 75 73 68 28 70 56 69 65 77 2c 20  ViewPush(pView, 
31010 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20  moreToFollow);. 
31020 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31030 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 53 45 4c  Line(pView, "SEL
31040 45 43 54 25 73 25 73 20 28 30 78 25 70 29 22 2c  ECT%s%s (0x%p)",
31050 0a 20 20 20 20 28 28 70 2d 3e 73 65 6c 46 6c 61  .    ((p->selFla
31060 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
31070 29 20 3f 20 22 20 44 49 53 54 49 4e 43 54 22 20  ) ? " DISTINCT" 
31080 3a 20 22 22 29 2c 0a 20 20 20 20 28 28 70 2d 3e  : ""),.    ((p->
31090 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
310a0 67 72 65 67 61 74 65 29 20 3f 20 22 20 61 67 67  gregate) ? " agg
310b0 5f 66 6c 61 67 22 20 3a 20 22 22 29 2c 20 70 0a  _flag" : ""), p.
310c0 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53    );.  if( p->pS
310d0 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e  rc && p->pSrc->n
310e0 53 72 63 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28  Src ) n++;.  if(
310f0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 6e 2b 2b   p->pWhere ) n++
31100 3b 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  ;.  if( p->pGrou
31110 70 42 79 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28  pBy ) n++;.  if(
31120 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 20 6e 2b   p->pHaving ) n+
31130 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  +;.  if( p->pOrd
31140 65 72 42 79 20 29 20 6e 2b 2b 3b 0a 20 20 69 66  erBy ) n++;.  if
31150 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 6e 2b  ( p->pLimit ) n+
31160 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  +;.  if( p->pOff
31170 73 65 74 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28  set ) n++;.  if(
31180 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 6e 2b 2b   p->pPrior ) n++
31190 3b 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65 56  ;.  sqlite3TreeV
311a0 69 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65  iewExprList(pVie
311b0 77 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 28 6e  w, p->pEList, (n
311c0 2d 2d 29 3e 30 2c 20 22 72 65 73 75 6c 74 2d 73  --)>0, "result-s
311d0 65 74 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  et");.  if( p->p
311e0 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e  Src && p->pSrc->
311f0 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  nSrc ){.    int 
31200 69 3b 0a 20 20 20 20 70 56 69 65 77 20 3d 20 73  i;.    pView = s
31210 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75  qlite3TreeViewPu
31220 73 68 28 70 56 69 65 77 2c 20 28 6e 2d 2d 29 3e  sh(pView, (n--)>
31230 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  0);.    sqlite3T
31240 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
31250 77 2c 20 22 46 52 4f 4d 22 29 3b 0a 20 20 20 20  w, "FROM");.    
31260 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53  for(i=0; i<p->pS
31270 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
31280 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
31290 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
312a0 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   = &p->pSrc->a[i
312b0 5d 3b 0a 20 20 20 20 20 20 53 74 72 41 63 63 75  ];.      StrAccu
312c0 6d 20 78 3b 0a 20 20 20 20 20 20 63 68 61 72 20  m x;.      char 
312d0 7a 4c 69 6e 65 5b 31 30 30 5d 3b 0a 20 20 20 20  zLine[100];.    
312e0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
312f0 6d 49 6e 69 74 28 26 78 2c 20 7a 4c 69 6e 65 2c  mInit(&x, zLine,
31300 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20   sizeof(zLine), 
31310 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
31320 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20  3XPrintf(&x, 0, 
31330 22 7b 25 64 2c 2a 7d 22 2c 20 70 49 74 65 6d 2d  "{%d,*}", pItem-
31340 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
31350 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
31360 61 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  abase ){.       
31370 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
31380 26 78 2c 20 30 2c 20 22 20 25 73 2e 25 73 22 2c  &x, 0, " %s.%s",
31390 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
313a0 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  e, pItem->zName)
313b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
313c0 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  ( pItem->zName )
313d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
313e0 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20  3XPrintf(&x, 0, 
313f0 22 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e  " %s", pItem->zN
31400 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
31410 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
31420 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
31430 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
31440 2c 20 30 2c 20 22 20 74 61 62 6e 61 6d 65 3d 25  , 0, " tabname=%
31450 51 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  Q", pItem->pTab-
31460 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
31470 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
31480 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
31490 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
314a0 74 66 28 26 78 2c 20 30 2c 20 22 20 28 41 53 20  tf(&x, 0, " (AS 
314b0 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  %s)", pItem->zAl
314c0 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
314d0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a      if( pItem->j
314e0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
314f0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
31500 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
31510 30 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29  0, " LEFT-JOIN")
31520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31530 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
31540 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 20 20 20  inish(&x);.     
31550 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31560 49 74 65 6d 28 70 56 69 65 77 2c 20 7a 4c 69 6e  Item(pView, zLin
31570 65 2c 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  e, i<p->pSrc->nS
31580 72 63 2d 31 29 3b 20 0a 20 20 20 20 20 20 69 66  rc-1); .      if
31590 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
315a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
315b0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
315c0 74 28 70 56 69 65 77 2c 20 70 49 74 65 6d 2d 3e  t(pView, pItem->
315d0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
315e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
315f0 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
31600 69 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iew);.    }.    
31610 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
31620 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20  op(pView);.  }. 
31630 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
31640 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
31650 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c  eViewItem(pView,
31660 20 22 57 48 45 52 45 22 2c 20 28 6e 2d 2d 29 3e   "WHERE", (n--)>
31670 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  0);.    sqlite3T
31680 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
31690 77 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 30 29  w, p->pWhere, 0)
316a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
316b0 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
316c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
316d0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
316e0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
316f0 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d 3e  rList(pView, p->
31700 70 47 72 6f 75 70 42 79 2c 20 28 6e 2d 2d 29 3e  pGroupBy, (n--)>
31710 30 2c 20 22 47 52 4f 55 50 42 59 22 29 3b 0a 20  0, "GROUPBY");. 
31720 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76   }.  if( p->pHav
31730 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ing ){.    sqlit
31740 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28 70  e3TreeViewItem(p
31750 56 69 65 77 2c 20 22 48 41 56 49 4e 47 22 2c 20  View, "HAVING", 
31760 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71  (n--)>0);.    sq
31770 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
31780 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 48 61 76  r(pView, p->pHav
31790 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ing, 0);.    sql
317a0 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
317b0 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66  pView);.  }.  if
317c0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
317d0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
317e0 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56 69  ViewExprList(pVi
317f0 65 77 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ew, p->pOrderBy,
31800 20 28 6e 2d 2d 29 3e 30 2c 20 22 4f 52 44 45 52   (n--)>0, "ORDER
31810 42 59 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BY");.  }.  if( 
31820 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
31830 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31840 49 74 65 6d 28 70 56 69 65 77 2c 20 22 4c 49 4d  Item(pView, "LIM
31850 49 54 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20  IT", (n--)>0);. 
31860 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31870 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d  ewExpr(pView, p-
31880 3e 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20  >pLimit, 0);.   
31890 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
318a0 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a  Pop(pView);.  }.
318b0 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
318c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
318d0 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65  reeViewItem(pVie
318e0 77 2c 20 22 4f 46 46 53 45 54 22 2c 20 28 6e 2d  w, "OFFSET", (n-
318f0 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  -)>0);.    sqlit
31900 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
31910 56 69 65 77 2c 20 70 2d 3e 70 4f 66 66 73 65 74  View, p->pOffset
31920 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
31930 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69  3TreeViewPop(pVi
31940 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ew);.  }.  if( p
31950 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
31960 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
31970 3d 20 22 55 4e 49 4f 4e 22 3b 0a 20 20 20 20 73  = "UNION";.    s
31980 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
31990 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c        case TK_AL
319a0 4c 3a 20 20 20 20 20 20 20 20 20 7a 4f 70 20 3d  L:         zOp =
319b0 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 62   "UNION ALL";  b
319c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
319d0 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 20   TK_INTERSECT:  
319e0 20 7a 4f 70 20 3d 20 22 49 4e 54 45 52 53 45 43   zOp = "INTERSEC
319f0 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
31a00 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
31a10 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45 58  :      zOp = "EX
31a20 43 45 50 54 22 3b 20 20 20 20 20 62 72 65 61 6b  CEPT";     break
31a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
31a40 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
31a50 70 56 69 65 77 2c 20 7a 4f 70 2c 20 28 6e 2d 2d  pView, zOp, (n--
31a60 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  )>0);.    sqlite
31a70 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
31a80 70 56 69 65 77 2c 20 70 2d 3e 70 50 72 69 6f 72  pView, p->pPrior
31a90 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
31aa0 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69  3TreeViewPop(pVi
31ab0 65 77 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ew);.  }.  sqlit
31ac0 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
31ad0 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  iew);.}.#endif /
31ae0 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
31af0 2f 0a                                            /.