/ Hex Artifact Content
Login

Artifact 5e83049a0be1caf88921e815d0118bce49cba827:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 28 53 29 2d 3e 7a 53 65 6c  2-2,"",(S)->zSel
02e0: 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20 20 20 20  Name,(S)),\.    
02f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0300: 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66  tf X.#else.# def
0310: 69 6e 65 20 53 45 4c 45 43 54 54 52 41 43 45 28  ine SELECTTRACE(
0320: 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64 69 66 0a  K,P,S,X).#endif.
0330: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0340: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0350: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0370: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0380: 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  ** how to proces
0390: 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  s the DISTINCT k
03a0: 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c  eyword, to simpl
03b0: 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61 74  ify passing that
03c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
03d0: 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49  into the selectI
03e0: 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69  nnerLoop() routi
03f0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
0400: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0410: 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73  x DistinctCtx;.s
0420: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0430: 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b  x {.  u8 isTnct;
0440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0450: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0460: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0470: 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79   */.  u8 eTnctTy
0480: 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  pe;   /* One of 
0490: 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  the WHERE_DISTIN
04a0: 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a  CT_* operators *
04b0: 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b  /.  int tabTnct;
04c0: 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c      /* Ephemeral
04d0: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
04e0: 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
04f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ing */.  int add
0500: 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72  rTnct;   /* Addr
0510: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
0520: 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66  hemeral opcode f
0530: 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b  or tabTnct */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0550: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0560: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0570: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0580: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0590: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
05a0: 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
05b0: 61 75 73 65 20 6f 66 20 71 75 65 72 79 20 69 73  ause of query is
05c0: 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f   being coded..*/
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 53 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b  SortCtx SortCtx;
05f0: 0a 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20  .struct SortCtx 
0600: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
0610: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
0620: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
0630: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a  OUP BY clause) *
0640: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20  /.  int nOBSat; 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0660: 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
0670: 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
0680: 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  by indices */.  
0690: 69 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20  int iECursor;   
06a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
06b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73  number for the s
06c0: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  orter */.  int r
06d0: 65 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20  egReturn;       
06e0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
06f0: 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75  ding block-outpu
0700: 74 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  t return address
0710: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42   */.  int labelB
0720: 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  kOut;       /* S
0730: 74 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74  tart label for t
0740: 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  he block-output 
0750: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
0760: 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
0770: 78 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  x;    /* Address
0780: 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65   of the OP_Sorte
0790: 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e  rOpen or OP_Open
07a0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75  Ephemeral */.  u
07b0: 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20  8 sortFlags;    
07c0: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
07d0: 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20  more SORTFLAG_* 
07e0: 62 69 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  bits */.};.#defi
07f0: 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  ne SORTFLAG_UseS
0800: 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a  orter  0x01   /*
0810: 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20   Use SorterOpen 
0820: 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45  instead of OpenE
0830: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a  phemeral */../*.
0840: 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68  ** Delete all th
0850: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53  e content of a S
0860: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e  elect structure.
0870: 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Deallocate the
0880: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
0890: 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72  self only if bFr
08a0: 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ee is true..*/.s
08b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
08c0: 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Select(sqlite3 *
08d0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
08e0: 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69  nt bFree){.  whi
08f0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c  le( p ){.    Sel
0900: 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
0910: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c  >pPrior;.    sql
0920: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
0930: 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  te(db, p->pEList
0940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  );.    sqlite3Sr
0950: 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
0960: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71  p->pSrc);.    sq
0970: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0980: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  db, p->pWhere);.
0990: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
09a0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
09b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
09c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
09d0: 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  e(db, p->pHaving
09e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
09f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0a00: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
0a10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a20: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
0a30: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
0a40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0a50: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
0a60: 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
0a70: 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  e(db, p->pWith);
0a80: 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
0a90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0aa0: 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  b, p);.    p = p
0ab0: 50 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65  Prior;.    bFree
0ac0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
0ad0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0ae0: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0af0: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0b00: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0b10: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0b20: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0b30: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0b40: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
0b50: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
0b60: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
0b70: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
0b80: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
0b90: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
0ba0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0bb0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0bc0: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0bd0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0be0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0bf0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0c00: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0c10: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0c20: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0c30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0c40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0c50: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
0c60: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
0c70: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
0c80: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
0c90: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
0ca0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0cb0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0cc0: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0cd0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0ce0: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0cf0: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0d00: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0d10: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0d20: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0d30: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0d40: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
0d60: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
0d70: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0d80: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
0d90: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
0da0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0db0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0dc0: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0dd0: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0df0: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0e00: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0e10: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0e20: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0e30: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0e40: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
0e50: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
0e60: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
0e70: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
0e80: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
0e90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0ea0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0eb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0ec0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ed0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
0ee0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
0ef0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
0f00: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65  ailed );.    pNe
0f10: 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20  w = &standin;.  
0f20: 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
0f30: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  , sizeof(*pNew))
0f40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69  ;.  }.  if( pELi
0f50: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c  st==0 ){.    pEL
0f60: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
0f70: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
0f80: 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
0f90: 70 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29  pr(db,TK_ALL,0))
0fa0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45  ;.  }.  pNew->pE
0fb0: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
0fc0: 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70   if( pSrc==0 ) p
0fd0: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Src = sqlite3DbM
0fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
0ff0: 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20  zeof(*pSrc));.  
1000: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
1010: 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  c;.  pNew->pWher
1020: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e  e = pWhere;.  pN
1030: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
1040: 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d  GroupBy;.  pNew-
1050: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
1060: 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ng;.  pNew->pOrd
1070: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1080: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
1090: 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20  s = selFlags;.  
10a0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
10b0: 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  LECT;.  pNew->pL
10c0: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
10d0: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
10e0: 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65   pOffset;.  asse
10f0: 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c  rt( pOffset==0 |
1100: 7c 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70  | pLimit!=0 || p
1110: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c  Parse->nErr>0 ||
1120: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1130: 64 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  d!=0 );.  pNew->
1140: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
1150: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
1160: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
1170: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
1180: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
1190: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64     clearSelect(d
11a0: 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26  b, pNew, pNew!=&
11b0: 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e  standin);.    pN
11c0: 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ew = 0;.  }else{
11d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
11e0: 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50  w->pSrc!=0 || pP
11f0: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a  arse->nErr>0 );.
1200: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
1210: 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a  ew!=&standin );.
1220: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
1230: 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
1240: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
1250: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
1260: 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a  a Select object.
1270: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1280: 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c  electSetName(Sel
1290: 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ect *p, const ch
12a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
12b0: 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a  ( p && zName ){.
12c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12d0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a  intf(sizeof(p->z
12e0: 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65  SelName), p->zSe
12f0: 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61  lName, "%s", zNa
1300: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  me);.  }.}.#endi
1310: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  f.../*.** Delete
1320: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
1330: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
1340: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
1350: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
1360: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1370: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1380: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1390: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
13a0: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
13b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
13c0: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
13d0: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
13e0: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
13f0: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1400: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1410: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1420: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1430: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
1440: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1450: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
1460: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
1470: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
1480: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
1490: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
14a0: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
14b0: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
14c0: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
14d0: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
14e0: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
14f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1500: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1510: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1520: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1530: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
1540: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
1550: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
1560: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
1570: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
1580: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
1590: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
15a0: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
15b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
15c0: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
15d0: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
15e0: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
15f0: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1600: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1610: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1620: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1630: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1640: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
1650: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
1660: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
1670: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
1680: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
1690: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
16a0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
16d0: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
16e0: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
16f0: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1700: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1710: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1720: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1730: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
1740: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
1750: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
1760: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
1770: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
1780: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
1790: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
17a0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
17b0: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
17c0: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
17d0: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
17e0: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
17f0: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1800: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1810: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1820: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1840: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
1850: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
1860: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
1870: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
1880: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
1890: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
18b0: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
18c0: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
18d0: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
18e0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
18f0: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1900: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1910: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1920: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1930: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1940: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1950: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1960: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1970: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1980: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1990: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
19a0: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
19b0: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
19c0: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
19d0: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
19e0: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
19f0: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1a00: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1a10: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1a20: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1a30: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1a40: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1a50: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1a60: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1a70: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1a80: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1a90: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1ab0: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
1ac0: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
1ad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1af0: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
1b00: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
1b10: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
1b20: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
1b30: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
1b40: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
1b50: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1b60: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
1b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1b80: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
1b90: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
1ba0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
1bb0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1bc0: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
1bd0: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
1be0: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
1bf0: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
1c00: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
1c10: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
1c20: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
1c30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1c40: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c50: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1c60: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1c70: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
1c80: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
1c90: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
1ca0: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1cb0: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
1cc0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1cd0: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
1ce0: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
1cf0: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
1d00: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
1d10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1d20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1d30: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1d40: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1d50: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1d60: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1d70: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1d80: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1d90: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1da0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1db0: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1dc0: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1dd0: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1de0: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1df0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1e00: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1e10: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1e20: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1e30: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1e40: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1e50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1e60: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1e70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1e80: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1e90: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
1ea0: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
1eb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
1ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
1ed0: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
1ee0: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
1ef0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
1f00: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
1f10: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
1f20: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
1f30: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
1f40: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
1f50: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
1f60: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
1f70: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
1f80: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
1f90: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
1fa0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
1fb0: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
1fc0: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
1fd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
1fe0: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
1ff0: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2000: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2010: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2020: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2030: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
2040: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
2050: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
2060: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
2070: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
2080: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
2090: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
20a0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
20b0: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
20c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
20d0: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
20e0: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
20f0: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2100: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2110: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2120: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2130: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
2140: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2150: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
2160: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
2170: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2180: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
2190: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
21a0: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
21b0: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
21c0: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
21d0: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
21e0: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
21f0: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2200: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2210: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2220: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2230: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
2240: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
2250: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
2260: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
2270: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
2280: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
2290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
22a0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
22b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
22c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22d0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
22e0: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
22f0: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2300: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2310: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2320: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2330: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
2340: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
2350: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
2360: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
2370: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
2380: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
2390: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
23a0: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
23b0: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
23c0: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
23d0: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
23e0: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
23f0: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2400: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2410: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2420: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2430: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
2440: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
2450: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
2460: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
2470: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2490: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
24a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
24b0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
24c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
24d0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
24e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
24f0: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2520: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2530: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2540: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2560: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2570: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
2580: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
25b0: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
25c0: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
25d0: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
25e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25f0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2600: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2610: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2620: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2630: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2640: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
2650: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
2660: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
2670: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2680: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
2690: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
26a0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
26b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
26c0: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
26d0: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
26e0: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
26f0: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2700: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2710: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2730: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
2740: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2750: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
2760: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
2770: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
2780: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
2790: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
27a0: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
27b0: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
27c0: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
27d0: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
27e0: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
27f0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2800: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 2c 20 30  _EQ, pE1, pE2, 0
2810: 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20  );.  if( pEq && 
2820: 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20  isOuterJoin ){. 
2830: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2840: 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a  ty(pEq, EP_FromJ
2850: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2860: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2870: 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e  ty(pEq, EP_Token
2880: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2890: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
28a0: 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  VAProperty(pEq, 
28b0: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
28c0: 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69    pEq->iRightJoi
28d0: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45  nTable = (i16)pE
28e0: 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  2->iTable;.  }. 
28f0: 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69   *ppWhere = sqli
2900: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a  te3ExprAnd(db, *
2910: 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d  ppWhere, pEq);.}
2920: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2930: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
2940: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
2950: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
2960: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e  xpression..** An
2970: 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69  d set the Expr.i
2980: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2990: 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65  o iTable for eve
29a0: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a  ry term in the.*
29b0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  * expression..**
29c0: 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a  .** The EP_FromJ
29d0: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20  oin property is 
29e0: 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66  used on terms of
29f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2a00: 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45  o tell.** the LE
2a10: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72  FT OUTER JOIN pr
2a20: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74  ocessing logic t
2a30: 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73  hat this term is
2a40: 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20   part of the.** 
2a50: 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e  join restriction
2a60: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
2a70: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2a80: 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70  ause and not a p
2a90: 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f  art.** of the mo
2aa0: 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45  re general WHERE
2ab0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20   clause.  These 
2ac0: 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20  terms are moved 
2ad0: 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57  over to the.** W
2ae0: 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69  HERE clause duri
2af0: 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69  ng join processi
2b00: 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74  ng but we need t
2b10: 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20  o remember that 
2b20: 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74  they.** originat
2b30: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2b40: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  USING clause..**
2b50: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69  .** The Expr.iRi
2b60: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c  ghtJoinTable tel
2b70: 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ls the WHERE cla
2b80: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74  use processing t
2b90: 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  hat the.** expre
2ba0: 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e  ssion depends on
2bb0: 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69   table iRightJoi
2bc0: 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74  nTable even if t
2bd0: 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  hat table is not
2be0: 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d  .** explicitly m
2bf0: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2c00: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61  expression.  Tha
2c10: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  t information is
2c20: 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63   needed.** for c
2c30: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ases like this:.
2c40: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
2c50: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
2c60: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
2c70: 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a  2.b AND t1.x=5.*
2c80: 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63  *.** The where c
2c90: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64  lause needs to d
2ca0: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2cb0: 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a  g of the t1.x=5.
2cc0: 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66  ** term until af
2cd0: 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  ter the t2 loop 
2ce0: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e  of the join.  In
2cf0: 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20   that way, a.** 
2d00: 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c  NULL t2 row will
2d10: 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65   be inserted whe
2d20: 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20  never t1.x!=5.  
2d30: 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20  If we do not.** 
2d40: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
2d50: 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74  ng of t1.x=5, it
2d60: 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73   will be process
2d70: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  ed immediately.*
2d80: 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c  * after the t1 l
2d90: 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74  oop and rows wit
2da0: 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e  h t1.x!=5 will n
2db0: 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a  ever appear in.*
2dc0: 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68  * the output, wh
2dd0: 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74  ich is incorrect
2de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2df0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70   setJoinExpr(Exp
2e00: 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  r *p, int iTable
2e10: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
2e20: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
2e30: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
2e40: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2e50: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2e60: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
2e70: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2e80: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41  ;.    ExprSetVVA
2e90: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
2ea0: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 2d  oReduce);.    p-
2eb0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
2ec0: 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a   = (i16)iTable;.
2ed0: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
2ee0: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
2ef0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2f00: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2f10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f20: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2f30: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2f40: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
2f50: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
2f60: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2f70: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
2f80: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
2f90: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2fa0: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
2fb0: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
2fc0: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
2fd0: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
2fe0: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
2ff0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
3000: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
3010: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
3020: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
3030: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
3040: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
3050: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
3060: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
3070: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
3080: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
3090: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
30a0: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
30b0: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
30c0: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
30d0: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
30e0: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
30f0: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
3100: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
3110: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
3120: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
3130: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3140: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
3150: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
3160: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
3170: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3180: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
3190: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
31a0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
31b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
31c0: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
31d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
31e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
31f0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
3200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3210: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
3220: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
3230: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3250: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
3260: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
3270: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
3280: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
3290: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
32a0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
32b0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
32c0: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
32d0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
32e0: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
32f0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
3300: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
3310: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
3320: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
3330: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
3340: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
3350: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
3360: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
3370: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
3380: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
3390: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
33a0: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
33b0: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
33c0: 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  ER(pLeftTab==0 |
33d0: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20  | pRightTab==0) 
33e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
33f0: 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68  isOuter = (pRigh
3400: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
3410: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
3420: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
3430: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
3440: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
3450: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
3460: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
3470: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
3480: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
3490: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
34a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
34b0: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
34c0: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
34d0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
34e0: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
34f0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
3500: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3510: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
3520: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
3530: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
3540: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
3550: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
3560: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
3580: 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54  r(j=0; j<pRightT
3590: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
35a0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
35b0: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
35c0: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  f column in the 
35d0: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
35e0: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
35f0: 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e  ;     /* Matchin
3600: 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  g left table */.
3610: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3620: 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69  tCol;  /* Matchi
3630: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ng column in the
3640: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a   left table */..
3650: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3660: 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b  pRightTab->aCol[
3670: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
3680: 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f    if( tableAndCo
3690: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
36a0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
36b0: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29  ft, &iLeftCol) )
36c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
36d0: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
36e0: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
36f0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a  eftCol, i+1, j,.
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
3720: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
3730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3740: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
3750: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
3760: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
3770: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
3780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3790: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70  pRight->pOn && p
37a0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
37b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
37c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
37d0: 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  cannot have both
37e0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a   ON and USING ".
37f0: 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73          "clauses
3800: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
3810: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
3820: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
3830: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
3840: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
3850: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3860: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
3870: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
3880: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
3890: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
38a0: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
38b0: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
38c0: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
38d0: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
38e0: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
38f0: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3900: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
3910: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
3920: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
3930: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
3940: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3950: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
3960: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
3970: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
3980: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
3990: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
39a0: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
39b0: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
39c0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
39d0: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
39e0: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
39f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
3a00: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
3a10: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
3a20: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
3a30: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
3a40: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
3a50: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
3a60: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
3a70: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
3a80: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
3a90: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3aa0: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
3ab0: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
3ac0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3ad0: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
3ae0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
3af0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
3b00: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
3b10: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
3b20: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
3b30: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
3b40: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
3b50: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
3b60: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
3b70: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3b80: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3b90: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
3ba0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
3bb0: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
3bc0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
3bd0: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3be0: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
3bf0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3c00: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3c10: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
3c20: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
3c30: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3c40: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3c50: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
3c60: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
3c70: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
3c80: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3c90: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
3ca0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
3cb0: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
3cc0: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
3cd0: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
3ce0: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
3cf0: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3d00: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3d10: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
3d20: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3d30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3d40: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3d50: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
3d60: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
3d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
3d80: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
3d90: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
3da0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
3db0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
3dc0: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
3dd0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3de0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3df0: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
3e00: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
3e10: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3e20: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3e40: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3e50: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
3e60: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
3e70: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
3e80: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
3e90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3ea0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
3eb0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3ec0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
3ed0: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
3ee0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
3ef0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
3f00: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
3f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
3f20: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
3f30: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
3f40: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
3f50: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
3f60: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
3f70: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
3f80: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65   */.);../*.** Ge
3f90: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
3fa0: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
3fb0: 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65  ecord in registe
3fc0: 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68  rs regData.** th
3fd0: 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44  rough regData+nD
3fe0: 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73  ata-1 onto the s
3ff0: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
4000: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
4010: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
4020: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
4030: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
4040: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
4050: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  Sort,        /* 
4060: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
4070: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  t the ORDER BY c
4080: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
4090: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
40a0: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
40b0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
40c0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
40d0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
40e0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
40f0: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
4100: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74   sorted */.  int
4110: 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20   nData,         
4120: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4130: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
4140: 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20   data array */. 
4150: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
4160: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4170: 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72  f reg prior to r
4180: 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65  egData available
4190: 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20   for use */.){. 
41a0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
41b0: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20    /* Stmt under 
41e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
41f0: 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70    int bSeq = ((p
4200: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
4210: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
4220: 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74  rter)==0);.  int
4230: 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e   nExpr = pSort->
4240: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4260: 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59   No. of ORDER BY
4270: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
4280: 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20  nBase = nExpr + 
4290: 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20  bSeq + nData;   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42b0: 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72  Fields in sorter
42c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
42d0: 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4300: 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72   Regs for sorter
4310: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
4320: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70   regRecord = ++p
4330: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4350: 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65   Assembled sorte
4360: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4370: 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74  t nOBSat = pSort
4380: 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  ->nOBSat;       
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43a0: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
43b0: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e   to skip */.  in
43c0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64   /* Opcode to ad
43f0: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
4400: 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20  to sorter */..  
4410: 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20  assert( bSeq==0 
4420: 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20  || bSeq==1 );.  
4430: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20 29  if( nPrefixReg )
4440: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
4450: 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b  refixReg==nExpr+
4460: 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42  bSeq );.    regB
4470: 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20  ase = regData - 
4480: 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20  nExpr - bSeq;.  
4490: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
44a0: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
44b0: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
44c0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
44d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
44e0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
44f0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70  pParse, pSort->p
4500: 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65  OrderBy, regBase
4510: 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  , SQLITE_ECEL_DU
4520: 50 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29  P);.  if( bSeq )
4530: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
4540: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
4550: 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69  quence, pSort->i
4560: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
4570: 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69  +nExpr);.  }.  i
4580: 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30  f( nPrefixReg==0
4590: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
45a0: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
45b0: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
45c0: 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c  Base+nExpr+bSeq,
45d0: 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20   nData);.  }..  
45e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
45f0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4600: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4610: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4620: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
4630: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
4640: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4650: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4660: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4670: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
4680: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
4690: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
46a0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
46b0: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
46c0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
46d0: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
46e0: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
46f0: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
4700: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
4710: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
4720: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
4730: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
4740: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
4750: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
4760: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
4770: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
4780: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
4790: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
47a0: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
47b0: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
47c0: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
47d0: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
47e0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
47f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
4800: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
4810: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
4820: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
4830: 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62   bSeq;.    if( b
4840: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Seq ){.      add
4850: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4860: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4870: 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b  _IfNot, regBase+
4880: 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c  nExpr); .    }el
4890: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69  se{.      addrFi
48a0: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
48b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
48c0: 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72  quenceTest, pSor
48d0: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
48e0: 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65    }.    VdbeCove
48f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
4900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4910: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
4920: 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73  gPrevKey, regBas
4930: 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  e, pSort->nOBSat
4940: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
4950: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
4960: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
4970: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
4980: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
4990: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
49a0: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  n;.    pOp->p2 =
49b0: 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20   nKey + nData;. 
49c0: 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34     pKI = pOp->p4
49d0: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d  .pKeyInfo;.    m
49e0: 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74  emset(pKI->aSort
49f0: 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e  Order, 0, pKI->n
4a00: 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73  Field); /* Makes
4a10: 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74   OP_Jump below t
4a20: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4a30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4a40: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4a50: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4a60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4a70: 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20   pKI->nXField>2 
4a80: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
4a90: 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
4aa0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
4ab0: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4ac0: 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20  derBy, nOBSat,. 
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e            pKI->n
4b00: 58 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61  XField-1);.    a
4b10: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
4b20: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4b30: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4b40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4b50: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
4b60: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
4b70: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4b80: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
4b90: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
4ba0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4bb0: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
4bc0: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
4bd0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
4be0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4bf0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
4c00: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
4c10: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
4c20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4c30: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
4c40: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
4c50: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4c60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4c70: 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73  Here(v, addrFirs
4c80: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4c90: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
4ca0: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67  se, regBase, reg
4cb0: 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e  PrevKey, pSort->
4cc0: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c  nOBSat);.    sql
4cd0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4ce0: 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20  (v, addrJmp);.  
4cf0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  }.  if( pSort->s
4d00: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
4d10: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
4d20: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72  .    op = OP_Sor
4d30: 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c  terInsert;.  }el
4d40: 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  se{.    op = OP_
4d50: 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20  IdxInsert;.  }. 
4d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d70: 70 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d  p2(v, op, pSort-
4d80: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
4d90: 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 53 65  cord);.  if( pSe
4da0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
4db0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
4dc0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
4dd0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
4de0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
4df0: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
4e00: 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20  ->iOffset+1;.   
4e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c   }else{.      iL
4e20: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
4e30: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20  iLimit;.    }.  
4e40: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
4e50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4e60: 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d  _IfNotZero, iLim
4e70: 69 74 2c 20 30 2c 20 2d 31 29 3b 20 56 64 62 65  it, 0, -1); Vdbe
4e80: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4e90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ea0: 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70  p1(v, OP_Last, p
4eb0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4ec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4ed0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
4ee0: 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ete, pSort->iECu
4ef0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4f00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4f10: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
4f20: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
4f30: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
4f40: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
4f50: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
4f60: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
4f70: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
4f80: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
4f90: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
4fa0: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
4fb0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
4fc0: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
4fd0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
4fe0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
4ff0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
5000: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5010: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5020: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  fset>0 ){.    in
5030: 74 20 61 64 64 72 3b 0a 20 20 20 20 61 64 64 72  t addr;.    addr
5040: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5050: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp3(v, OP_IfNeg
5060: 2c 20 69 4f 66 66 73 65 74 2c 20 30 2c 20 2d 31  , iOffset, 0, -1
5070: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
5080: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
5090: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50a0: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
50b0: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
50c0: 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f  ment((v, "skip O
50d0: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
50e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
50f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
5100: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
5110: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
5120: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
5130: 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67  e sure the N reg
5140: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
5150: 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20  at iMem.** form 
5160: 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79  a distinct entry
5170: 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72  .  iTab is a sor
5180: 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
5190: 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79  holds previously
51a0: 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61  .** seen combina
51b0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76  tions of the N v
51c0: 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e  alues.  A new en
51d0: 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69  try is made in i
51e0: 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75  Tab.** if the cu
51f0: 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61  rrent N values a
5200: 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20  re new..**.** A 
5210: 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65  jump to addrRepe
5220: 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74  at is made and t
5230: 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72  he N+1 values ar
5240: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
5250: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
5260: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
5270: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5290: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a  d codeDistinct(.
52a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
52b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
52c0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
52d0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
52e0: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
52f0: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
5300: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
5310: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
5320: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
5330: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
5340: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
5350: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
5360: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
5370: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5380: 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  f elements */.  
5390: 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20  int iMem        
53a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d     /* First elem
53b0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
53c0: 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a   *v;.  int r1;..
53d0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
53e0: 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  dbe;.  r1 = sqli
53f0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5400: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
5410: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5420: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
5430: 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65   addrRepeat, iMe
5440: 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72  m, N); VdbeCover
5450: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
5460: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5470: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
5480: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
5490: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
54a0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
54b0: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
54c0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
54d0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
54e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
54f0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5500: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
5510: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5520: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
5530: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
5540: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
5550: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
5560: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
5570: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
5580: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
5590: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
55a0: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
55b0: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
55c0: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
55d0: 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a   used to occur.*
55e0: 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  * in multiple pl
55f0: 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f  aces.  (The erro
5600: 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e  r only occurs in
5610: 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20   one place now, 
5620: 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e  but we.** retain
5630: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
5640: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65  to minimize code
5650: 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f   disruption.).*/
5660: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
5670: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
5680: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
5690: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
56a0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
56b0: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
56c0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
56d0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
56e0: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
56f0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
5700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5710: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
5720: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
5730: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
5740: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
5750: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
5760: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
5770: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
5780: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
5790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
57a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
57b0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
57c0: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
57d0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
57e0: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
57f0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
5800: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
5810: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23  eturn 0;.  }.}.#
5830: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
5840: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
5850: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
5860: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
5870: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
5880: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
5890: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73  .** If srcTab is
58a0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
58b0: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
58c0: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
58d0: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
58e0: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
58f0: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
5900: 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20  If srcTab is.** 
5910: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68  zero or more, th
5920: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
5930: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
5940: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
5950: 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74   only .** to get
5960: 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d 6e 73 20   number columns 
5970: 61 6e 64 20 74 68 65 20 64 61 74 61 74 79 70 65  and the datatype
5980: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
5990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
59a0: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
59b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
59c0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
59d0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
59e0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
59f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5a00: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
5a10: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
5a20: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
5a30: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5a40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
5a50: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
5a60: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
5a70: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
5a80: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
5a90: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
5aa0: 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74  able */.  SortCt
5ab0: 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20  x *pSort,       
5ac0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
5ad0: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5ae0: 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42   process ORDER B
5af0: 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  Y */.  DistinctC
5b00: 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f  tx *pDistinct, /
5b10: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
5b20: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
5b30: 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a  ocess DISTINCT *
5b40: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
5b50: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
5b60: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
5b70: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
5b80: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
5b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5ba0: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
5bb0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
5bc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5be0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
5bf0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
5c00: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
5c10: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5c20: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
5c30: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
5c40: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
5c50: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
5c60: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
5c70: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
5c80: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
5c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
5ca0: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
5cb0: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
5cc0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
5cd0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
5ce0: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
5cf0: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
5d00: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
5d10: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
5d20: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
5d30: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
5d40: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
5d50: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
5d60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5d70: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
5d80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
5d90: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
5da0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
5db0: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
5dc0: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
5dd0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
5de0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  );.  assert( pEL
5df0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
5e00: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
5e10: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
5e20: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
5e30: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
5e40: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
5e50: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
5e60: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
5e70: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
5e80: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
5e90: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
5ea0: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
5eb0: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
5ec0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
5ed0: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
5ee0: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
5ef0: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
5f00: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
5f10: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
5f20: 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ;..  if( pDest->
5f30: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
5f40: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
5f50: 20 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20     nPrefixReg = 
5f60: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
5f70: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >nExpr;.      if
5f80: 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  ( !(pSort->sortF
5f90: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
5fa0: 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72  UseSorter) ) nPr
5fb0: 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20  efixReg++;.     
5fc0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
5fd0: 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20   nPrefixReg;.   
5fe0: 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53   }.    pDest->iS
5ff0: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
6000: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
6010: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
6020: 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tCol;.  }else if
6030: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e  ( pDest->iSdst+n
6040: 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72  ResultCol > pPar
6050: 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  se->nMem ){.    
6060: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  /* This is an er
6070: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68  ror condition th
6080: 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66  at can result, f
6090: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
60a0: 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a   a SELECT.    **
60b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
60c0: 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e  nd side of an IN
60d0: 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  SERT contains mo
60e0: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
60f0: 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  s than.    ** th
6100: 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  ere are columns 
6110: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  in the table on 
6120: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65  the left.  The e
6130: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75  rror will be cau
6140: 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72  ght.    ** and r
6150: 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20  eported later.  
6160: 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
6170: 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20  ake sure enough 
6180: 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
6190: 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76  ted.    ** to av
61a0: 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f  oid other spurio
61b0: 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  us errors in the
61c0: 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20   meantime. */.  
61d0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
61e0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
61f0: 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  }.  pDest->nSdst
6200: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
6210: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
6220: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28  st->iSdst;.  if(
6230: 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20   srcTab>=0 ){.  
6240: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
6250: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
6260: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6270: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6280: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
6290: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
62a0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
62b0: 28 76 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  (v, "%s", pEList
62c0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  ->a[i].zName));.
62d0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
62e0: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
62f0: 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sts ){.    /* If
6300: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
6310: 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e   is an EXISTS(..
6320: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  .) expression, t
6330: 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a  he actual.    **
6340: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
6350: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61   by the SELECT a
6360: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  re not required.
6370: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
6380: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
6390: 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
63a0: 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 0a 20  st, regResult,. 
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74   (eDest==SRT_Out
63d0: 70 75 74 7c 7c 65 44 65 73 74 3d 3d 53 52 54 5f  put||eDest==SRT_
63e0: 43 6f 72 6f 75 74 69 6e 65 29 3f 53 51 4c 49 54  Coroutine)?SQLIT
63f0: 45 5f 45 43 45 4c 5f 44 55 50 3a 30 29 3b 0a 20  E_ECEL_DUP:0);. 
6400: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
6410: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
6420: 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20   was present on 
6430: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
6440: 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ment.  ** and th
6450: 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20  is row has been 
6460: 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65  seen before, the
6470: 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68  n do not make th
6480: 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74  is row.  ** part
6490: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
64a0: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69    */.  if( hasDi
64b0: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77  stinct ){.    sw
64c0: 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d  itch( pDistinct-
64d0: 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20  >eTnctType ){.  
64e0: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
64f0: 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
6500: 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f   {.        VdbeO
6510: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20  p *pOp;         
6520: 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20     /* No longer 
6530: 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68  required OpenEph
6540: 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f  emeral instr. */
6550: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75  .        int iJu
6560: 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mp;             
6570: 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61   /* Jump destina
6580: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
6590: 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
65a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
65b0: 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20  ous row content 
65c0: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  */..        /* A
65d0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
65e0: 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  r the previous r
65f0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ow */.        re
6600: 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e  gPrev = pParse->
6610: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
6620: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6630: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20  nResultCol;..   
6640: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
6650: 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
6660: 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65  ral coded earlie
6670: 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a  r to an OP_Null.
6680: 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20          ** sets 
6690: 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20  the MEM_Cleared 
66a0: 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74  bit on the first
66b0: 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65   register of the
66c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
66d0: 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69  ious value.  Thi
66e0: 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
66f0: 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20   OP_Ne below to 
6700: 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a  always.        *
6710: 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69  * fail on the fi
6720: 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
6730: 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69   the loop even i
6740: 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  f the first.    
6750: 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c      ** row is al
6760: 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20  l NULLs..       
6770: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
6780: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
6790: 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  oop(v, pDistinct
67a0: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
67b0: 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
67c0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
67d0: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
67e0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ct);.        pOp
67f0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75  ->opcode = OP_Nu
6800: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  ll;.        pOp-
6810: 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  >p1 = 1;.       
6820: 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72   pOp->p2 = regPr
6830: 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75  ev;..        iJu
6840: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
6850: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
6860: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20   nResultCol;.   
6870: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6880: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
6890: 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  {.          Coll
68a0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
68b0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
68c0: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
68d0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
68e0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65         if( i<nRe
68f0: 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  sultCol-1 ){.   
6900: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6910: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6920: 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Ne, regResult+i
6930: 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76  , iJump, regPrev
6940: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
6950: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6960: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
6970: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
6980: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6990: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65  (v, OP_Eq, regRe
69a0: 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75  sult+i, iContinu
69b0: 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  e, regPrev+i);. 
69c0: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
69d0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
69e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
69f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6a00: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
6a10: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
6a20: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
6a30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6a40: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
6a50: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
6a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6a70: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
6a80: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6a90: 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70  r(v)==iJump || p
6aa0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
6ab0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
6ac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6ad0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
6ae0: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
6af0: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
6b00: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
6b10: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
6b20: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
6b30: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
6b40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6b50: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
6b60: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
6b70: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
6b80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6b90: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
6ba0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6bb0: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
6bc0: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
6bd0: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
6be0: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
6bf0: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
6c00: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
6c10: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
6c20: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 65 67 52  nResultCol, regR
6c30: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
6c40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6c50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f     }.    if( pSo
6c60: 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  rt==0 ){.      c
6c70: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
6c80: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
6c90: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ue);.    }.  }..
6ca0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
6cb0: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
6cc0: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
6cd0: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
6ce0: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
6cf0: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
6d00: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
6d10: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
6d20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
6d30: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
6d40: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
6d50: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
6d60: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
6d70: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
6d80: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
6d90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6da0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
6db0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
6dc0: 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20  tCol, r1);.     
6dd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6de0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
6df0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
6e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6e10: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6e20: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
6e30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
6e40: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
6e50: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
6e60: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
6e70: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
6e80: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
6e90: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
6ea0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
6eb0: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
6ec0: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
6ed0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
6ee0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
6ef0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
6f00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6f10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
6f20: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
6f30: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
6f40: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72  ltCol);.      br
6f50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6f60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6f70: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
6f80: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72   */..    /* Stor
6f90: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
6fa0: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
6fb0: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
6fc0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66      case SRT_Fif
6fd0: 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  o:.    case SRT_
6fe0: 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61  DistFifo:.    ca
6ff0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
7000: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
7010: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
7020: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
7030: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7040: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
7050: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7060: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
7070: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
7080: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7090: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
70a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
70b0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
70c0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
70d0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
70e0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
70f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7100: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
7110: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
7120: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
7130: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
7140: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
7150: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
7160: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
7170: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
7180: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
7190: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
71a0: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
71b0: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
71c0: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
71d0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
71e0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
71f0: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
7200: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
7210: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
7220: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
7230: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
7240: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
7250: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
7260: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
7270: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
7280: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
7290: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
72a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
72b0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
72c0: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
72d0: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 20 56 64  addr, r1, 0); Vd
72e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
72f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7300: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7310: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b  dxInsert, iParm+
7320: 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  1, r1);.        
7330: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
7340: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
7350: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
7360: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7370: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7380: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7390: 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 20 31 2c  1+nPrefixReg, 1,
73a0: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
73b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
73c0: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
73d0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
73e0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
73f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7400: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
7410: 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20   iParm, r2);.   
7420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7430: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
7440: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
7450: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
7460: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7470: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
7480: 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  D);.        sqli
7490: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
74a0: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
74b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
74c0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
74d0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
74e0: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
74f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7500: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
7510: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7520: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
7530: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
7540: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
7550: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
7560: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
7570: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
7580: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
7590: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
75a0: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
75b0: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
75c0: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
75d0: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
75e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
75f0: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
7600: 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f  ssert( nResultCo
7610: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44  l==1 );.      pD
7620: 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 0a 20  est->affSdst =. 
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
7650: 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e  ffinity(pEList->
7660: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
7670: 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20  t->affSdst);.   
7680: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7690: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69          /* At fi
76a0: 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77  rst glance you w
76b0: 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f  ould think we co
76c0: 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74  uld optimize out
76d0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
76e0: 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73  ORDER BY in this
76f0: 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20   case since the 
7700: 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73  order of entries
7710: 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20   in the set.    
7720: 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
7730: 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65  matter.  But the
7740: 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49  re might be a LI
7750: 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77  MIT clause, in w
7760: 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
7770: 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64  case the order d
7780: 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20  oes matter */.  
7790: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
77a0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
77b0: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
77c0: 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29  , 1, nPrefixReg)
77d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
77e0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
77f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
7800: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
7810: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7820: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
7830: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
7840: 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61  ,1,r1, &pDest->a
7850: 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  ffSdst, 1);.    
7860: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7870: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
7880: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
7890: 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  sult, 1);.      
78a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
78b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
78c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
78d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
78e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
78f0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
7900: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7910: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
7920: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
7930: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7940: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
7950: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
7960: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7970: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
7980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7990: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
79a0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
79b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
79c0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
79d0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
79e0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
79f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7a00: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
7a10: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
7a20: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
7a30: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
7a40: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
7a50: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
7a60: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
7a70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
7a80: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
7a90: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
7aa0: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
7ab0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
7ac0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
7ad0: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
7ae0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
7af0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
7b00: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
7b10: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
7b20: 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52  ult, 1, nPrefixR
7b30: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
7b40: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7b50: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
7b60: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
7b70: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
7b80: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
7b90: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
7ba0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
7bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7bc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
7bd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7be0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
7bf0: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
7c00: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
7c10: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
7c20: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
7c30: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
7c40: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7c50: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
7c60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7c70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
7c80: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
7c90: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7ca0: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
7cb0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
7cc0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
7cd0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
7ce0: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
7cf0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
7d00: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
7d10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
7d20: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
7d30: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
7d40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
7d50: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
7d60: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
7d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7d80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7d90: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
7da0: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
7db0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
7dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7dd0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
7de0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
7df0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7e00: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
7e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7e20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7e30: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
7e40: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
7e50: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
7e60: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
7e70: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
7e80: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
7e90: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
7ea0: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
7eb0: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
7ec0: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
7ed0: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
7ee0: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
7ef0: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
7f00: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
7f10: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
7f20: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
7f30: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
7f40: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
7f50: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
7f60: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
7f70: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
7f80: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
7f90: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
7fa0: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
7fb0: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
7fc0: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
7fd0: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
7fe0: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
7ff0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
8000: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
8010: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
8020: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
8030: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
8040: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
8050: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
8060: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
8070: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
8080: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
8090: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
80a0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
80b0: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
80c0: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
80d0: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
80e0: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
80f0: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
8100: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
8110: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
8120: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
8130: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
8140: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
8150: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
8160: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
8170: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
8180: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
8190: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
81a0: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
81b0: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
81c0: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
81d0: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
81e0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
81f0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
8200: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
8210: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8240: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8250: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
8260: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8270: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8280: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8290: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
82a0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
82b0: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
82c0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
82d0: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
82e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
82f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8300: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
8310: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
8320: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8330: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
8340: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
8350: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
8360: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
8370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8380: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8390: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
83c0: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
83d0: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
8400: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8410: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8420: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
8430: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
8440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8450: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8460: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
8470: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
8480: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8490: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
84a0: 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  , iParm, r1);.  
84b0: 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74      if( addrTest
84c0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
84d0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65  mpHere(v, addrTe
84e0: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
84f0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
8500: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
8510: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
8520: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
8530: 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b  se, r2, nKey+2);
8540: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8550: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
8560: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
8570: 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ....#if !defined
8580: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
8590: 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
85a0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
85b0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
85c0: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
85d0: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
85e0: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
85f0: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
8600: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
8610: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
8620: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
8630: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
8640: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
8650: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
8660: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
8670: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
8680: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
8690: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
86a0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
86b0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
86c0: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
86d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
86e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
86f0: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
8700: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
8710: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
8720: 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65  s reached.  Exce
8730: 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72  pt, if.  ** ther
8740: 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69  e is a sorter, i
8750: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
8760: 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65   sorter has alre
8770: 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a  ady limited.  **
8780: 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20   the output for 
8790: 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  us..  */.  if( p
87a0: 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c  Sort==0 && p->iL
87b0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
87c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
87d0: 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
87e0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
87f0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
8800: 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ge(v);.  }.}../*
8810: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b  .** Allocate a K
8820: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75  eyInfo object su
8830: 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20  fficient for an 
8840: 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63  index of N key c
8850: 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20  olumns and.** X 
8860: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  extra columns..*
8870: 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
8880: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73  e3KeyInfoAlloc(s
8890: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
88a0: 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79  N, int X){.  Key
88b0: 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65  Info *p = sqlite
88c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c  3DbMallocZero(0,
88d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
88e0: 20 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 49       sizeof(KeyI
88f0: 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69  nfo) + (N+X)*(si
8900: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
8910: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
8920: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
8930: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
8940: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
8950: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a  Field = (u16)N;.
8960: 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d      p->nXField =
8970: 20 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e   (u16)X;.    p->
8980: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
8990: 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20     p->db = db;. 
89a0: 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
89b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
89c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
89d0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
89e0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  p;.}../*.** Deal
89f0: 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  locate a KeyInfo
8a00: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
8a10: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
8a20: 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ref(KeyInfo *p){
8a30: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
8a40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e  assert( p->nRef>
8a50: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  0 );.    p->nRef
8a60: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  --;.    if( p->n
8a70: 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  Ref==0 ) sqlite3
8a80: 44 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20 20  DbFree(0, p);.  
8a90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
8aa0: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f  a new pointer to
8ab0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
8ac0: 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  t.*/.KeyInfo *sq
8ad0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
8ae0: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
8af0: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
8b00: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
8b10: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a  .    p->nRef++;.
8b20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
8b30: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8b40: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
8b50: 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65  urn TRUE if a Ke
8b60: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e  yInfo object can
8b70: 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65   be change.  The
8b80: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
8b90: 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63  ** can only be c
8ba0: 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69  hanged if this i
8bb0: 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
8bc0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
8bd0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
8be0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
8bf0: 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20  sed only inside 
8c00: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
8c10: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
8c20: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
8c30: 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f  riteable(KeyInfo
8c40: 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e   *p){ return p->
8c50: 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69  nRef==1; }.#endi
8c60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
8c70: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  G */../*.** Give
8c80: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
8c90: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
8ca0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
8cb0: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
8cc0: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
8cd0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
8ce0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
8cf0: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
8d00: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
8d10: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
8d20: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
8d30: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
8d40: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
8d50: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
8d60: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
8d70: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
8d80: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
8d90: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
8da0: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
8db0: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
8dc0: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
8dd0: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
8de0: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
8df0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
8e00: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
8e10: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
8e20: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
8e30: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
8e40: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
8e50: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
8e60: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
8e70: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
8e80: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
8e90: 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  loc.  The callin
8ea0: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
8eb0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
8ec0: 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69   seeing that thi
8ed0: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
8ee0: 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
8ef0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  ed..*/.static Ke
8f00: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
8f10: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
8f20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8f30: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8f40: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
8f50: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
8f60: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
8f70: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
8f80: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
8f90: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
8fa0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
8fb0: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
8fc0: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
8fd0: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
8fe0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
8ff0: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
9000: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
9010: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72  /.){.  int nExpr
9020: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
9030: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
9040: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9050: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
9060: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9070: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
9080: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
9090: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
90a0: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
90b0: 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c  b, nExpr-iStart,
90c0: 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66   nExtra+1);.  if
90d0: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61  ( pInfo ){.    a
90e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
90f0: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
9100: 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66  (pInfo) );.    f
9110: 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74  or(i=iStart, pIt
9120: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61  em=pList->a+iSta
9130: 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  rt; i<nExpr; i++
9140: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
9150: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9160: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
9170: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
9180: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
9190: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
91a0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
91b0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
91c0: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
91d0: 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d  >aColl[i-iStart]
91e0: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
91f0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
9200: 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49  r[i-iStart] = pI
9210: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
9220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9230: 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66  rn pInfo;.}..#if
9240: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9250: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
9260: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
9270: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
9280: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
9290: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
92a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
92b0: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
92c0: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
92d0: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
92e0: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
92f0: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
9300: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
9310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9320: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
9330: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
9340: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9350: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
9360: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
9370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
9380: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
9390: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
93a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
93b0: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
93c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
93d0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
93e0: 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
93f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
9400: 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  AIN./*.** Unless
9410: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
9420: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
9430: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
9440: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
9450: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
9460: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
9470: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
9480: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
9490: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
94a0: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
94b0: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
94c0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45  rm:.**.**   "USE
94d0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
94e0: 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72   xxx".**.** wher
94f0: 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20  e xxx is one of 
9500: 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44  "DISTINCT", "ORD
9510: 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50  ER BY" or "GROUP
9520: 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68   BY". Exactly wh
9530: 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d  ich.** is determ
9540: 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61  ined by the zUsa
9550: 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ge argument..*/.
9560: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
9570: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72  ainTempTable(Par
9580: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
9590: 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b  t char *zUsage){
95a0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
95b0: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
95c0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
95d0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
95e0: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
95f0: 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
9600: 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20  ->db, "USE TEMP 
9610: 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20  B-TREE FOR %s", 
9620: 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c  zUsage);.    sql
9630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
9640: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
9650: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
9660: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
9670: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
9680: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78  ./*.** Assign ex
9690: 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76  pression b to lv
96a0: 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64  alue a. A second
96b0: 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e  , no-op, version
96c0: 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a   of this macro.*
96d0: 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68  * is provided wh
96e0: 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  en SQLITE_OMIT_E
96f0: 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65  XPLAIN is define
9700: 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  d. This allows t
9710: 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71  he code.** in sq
9720: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f  lite3Select() to
9730: 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74   assign values t
9740: 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62  o structure memb
9750: 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  er variables tha
9760: 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20  t.** only exist 
9770: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  if SQLITE_OMIT_E
9780: 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65  XPLAIN is not de
9790: 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f  fined without po
97a0: 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lluting the.** c
97b0: 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66  ode with #ifndef
97c0: 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a   directives..*/.
97d0: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
97e0: 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29  SetInteger(a, b)
97f0: 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a   a = b..#else./*
9800: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
9810: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
9820: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
9830: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
9840: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d  efine explainTem
9850: 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65  pTable(y,z).# de
9860: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
9870: 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64  nteger(y,z).#end
9880: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
9890: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
98a0: 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65  LAIN) && !define
98b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
98c0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f  MPOUND_SELECT)./
98d0: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22  *.** Unless an "
98e0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
98f0: 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62  AN" command is b
9900: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
9910: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
9920: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
9930: 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20  erwise, it adds 
9940: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
9950: 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51  output to the EQ
9960: 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65  P result,.** whe
9970: 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69  re the caption i
9980: 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
9990: 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a  two forms:.**.**
99a0: 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55     "COMPOSITE SU
99b0: 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61  BQUERIES iSub1 a
99c0: 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a  nd iSub2 (op)".*
99d0: 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53  *   "COMPOSITE S
99e0: 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20  UBQUERIES iSub1 
99f0: 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47 20  and iSub2 USING 
9a00: 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29  TEMP B-TREE (op)
9a10: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53  ".**.** where iS
9a20: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 61 72  ub1 and iSub2 ar
9a30: 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 70  e the integers p
9a40: 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 72  assed as the cor
9a50: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75  responding.** fu
9a60: 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
9a70: 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65  s, and op is the
9a80: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
9a90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61  tion of the para
9aa0: 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
9ab0: 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70  same name. The p
9ac0: 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75  arameter "op" mu
9ad0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f  st be one of TK_
9ae0: 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
9af0: 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43  ,.** TK_INTERSEC
9b00: 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65  T or TK_ALL. The
9b10: 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75   first form is u
9b20: 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20  sed if argument 
9b30: 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66  bUseTmp is .** f
9b40: 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63  alse, or the sec
9b50: 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69  ond form if it i
9b60: 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
9b70: 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f  c void explainCo
9b80: 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65  mposite(.  Parse
9b90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
9ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
9bb0: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
9bc0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e   /* One of TK_UN
9bf0: 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65  ION, TK_EXCEPT e
9c00: 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  tc. */.  int iSu
9c10: 62 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b1,             
9c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71           /* Subq
9c30: 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69  uery id 1 */.  i
9c40: 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20 20 20  nt iSub2,       
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c60: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 32 20  * Subquery id 2 
9c70: 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70  */.  int bUseTmp
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
9ca0: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73  a temp table was
9cb0: 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73   used */.){.  as
9cc0: 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49  sert( op==TK_UNI
9cd0: 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43  ON || op==TK_EXC
9ce0: 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
9cf0: 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54  TERSECT || op==T
9d00: 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70  K_ALL );.  if( p
9d10: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
9d20: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
9d30: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9d40: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
9d50: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
9d60: 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  f(.        pPars
9d70: 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44  e->db, "COMPOUND
9d80: 20 53 55 42 51 55 45 52 49 45 53 20 25 64 20 41   SUBQUERIES %d A
9d90: 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c 20 69  ND %d %s(%s)", i
9da0: 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20  Sub1, iSub2,.   
9db0: 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53       bUseTmp?"US
9dc0: 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20  ING TEMP B-TREE 
9dd0: 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  ":"", selectOpNa
9de0: 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20  me(op).    );.  
9df0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9e00: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
9e10: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
9e20: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
9e30: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
9e40: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f   }.}.#else./* No
9e50: 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -op versions of 
9e60: 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29  the explainXXX()
9e70: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d   functions and m
9e80: 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69  acros. */.# defi
9e90: 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  ne explainCompos
9ea0: 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23  ite(v,w,x,y,z).#
9eb0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
9ec0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
9ed0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
9ee0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
9ef0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
9f00: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
9f10: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
9f20: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
9f30: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
9f40: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
9f50: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
9f60: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
9f70: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
9f80: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
9f90: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
9fa0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
9fb0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
9fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9fd0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
9fe0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9ff0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
a000: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
a010: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
a020: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
a030: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72  atement */.  Sor
a040: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f  tCtx *pSort,   /
a050: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  * Information on
a060: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
a070: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ause */.  int nC
a080: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
a090: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
a0a0: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
a0b0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
a0c0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
a0d0: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
a0e0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
a0f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a110: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
a120: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
a130: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  */.  int addrBre
a140: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
a150: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20  MakeLabel(v);   
a160: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
a170: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
a180: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
a190: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
a1a0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
a1b0: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
a1c0: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
a1d0: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 61  nt addr;.  int a
a1e0: 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69  ddrOnce = 0;.  i
a1f0: 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c  nt iTab;.  ExprL
a200: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
a210: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b  pSort->pOrderBy;
a220: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
a230: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
a240: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
a250: 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74  ->iSDParm;.  int
a260: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
a270: 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e  egRowid;.  int n
a280: 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72 74  Key;.  int iSort
a290: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
a2a0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72         /* Sorter
a2b0: 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20   cursor to read 
a2c0: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  from */.  int nS
a2d0: 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20 20  ortData;        
a2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61            /* Tra
a2f0: 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20  iling values to 
a300: 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65 72  read from sorter
a310: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
a320: 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20 20  nt bSeq;        
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a340: 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65 72  * True if sorter
a350: 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73   record includes
a360: 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69 66   seq. no. */.#if
a370: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a380: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
a390: 54 53 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  TS.  struct Expr
a3a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45  List_item *aOutE
a3b0: 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  x = p->pEList->a
a3c0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
a3d0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a3e0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
a3f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a400: 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72  _Gosub, pSort->r
a410: 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  egReturn, pSort-
a420: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
a430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a440: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
a450: 30 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  0, addrBreak);. 
a460: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
a470: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53  solveLabel(v, pS
a480: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
a490: 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70  ;.  }.  iTab = p
a4a0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  Sort->iECursor;.
a4b0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
a4c0: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
a4d0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
a4e0: 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  ){.    regRowid 
a4f0: 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  = 0;.    regRow 
a500: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
a510: 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20      nSortData = 
a520: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
a530: 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  {.    regRowid =
a540: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a550: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a560: 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  regRow = sqlite3
a570: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a580: 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74  e);.    nSortDat
a590: 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 4b 65  a = 1;.  }.  nKe
a5a0: 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
a5b0: 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42  xpr - pSort->nOB
a5c0: 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  Sat;.  if( pSort
a5d0: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
a5e0: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
a5f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53   ){.    int regS
a600: 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  ortOut = ++pPars
a610: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f  e->nMem;.    iSo
a620: 72 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  rtTab = pParse->
a630: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nTab++;.    if( 
a640: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a650: 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f  t ){.      addrO
a660: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  nce = sqlite3Cod
a670: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
a680: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a690: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a6a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a6b0: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53  P_OpenPseudo, iS
a6c0: 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  ortTab, regSortO
a6d0: 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74  ut, nKey+1+nSort
a6e0: 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61  Data);.    if( a
a6f0: 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65  ddrOnce ) sqlite
a700: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
a710: 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
a720: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
a730: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a740: 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69  OP_SorterSort, i
a750: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
a760: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
a770: 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  e(v);.    codeOf
a780: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
a790: 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  et, addrContinue
a7a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a7b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
a7c0: 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c  orterData, iTab,
a7d0: 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f   regSortOut, iSo
a7e0: 72 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71  rtTab);.    bSeq
a7f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
a800: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
a810: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a820: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62  v, OP_Sort, iTab
a830: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64  , addrBreak); Vd
a840: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a850: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
a860: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
a870: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
a880: 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b  iSortTab = iTab;
a890: 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20  .    bSeq = 1;. 
a8a0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
a8b0: 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b  nSortData; i++){
a8c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a8d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a8e0: 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 6e  umn, iSortTab, n
a8f0: 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72 65 67 52  Key+bSeq+i, regR
a900: 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43  ow+i);.    VdbeC
a910: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
a920: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
a930: 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61   ? aOutEx[i].zNa
a940: 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  me : aOutEx[i].z
a950: 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77  Span));.  }.  sw
a960: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
a970: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
a980: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
a990: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
a9a0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
a9b0: 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t==SRT_Table );.
a9c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a9d0: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
a9e0: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  Tab );.      sql
a9f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aa00: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
aa10: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
aa20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aa30: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
aa40: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
aa50: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
aa60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aa70: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
aa80: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
aa90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aaa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aab0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
aac0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
aad0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
aae0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
aaf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ab00: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
ab10: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
ab20: 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20  1, regRowid,.   
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66       &pDest->aff
ab50: 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
ab60: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
ab70: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
ab80: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
ab90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
aba0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
abb0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
abc0: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
abd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
abe0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
abf0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
ac00: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
ac10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ac20: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
ac30: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
ac40: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
ac50: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
ac60: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
ac70: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
ac80: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
ac90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
aca0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
acb0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
acc0: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
acd0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
ace0: 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73  ne ); .      tes
acf0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
ad00: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
ad10: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
ad20: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
ad30: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
ad40: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
ad50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ad60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ad70: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
ad80: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
ad90: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
ada0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
adb0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
adc0: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  rse, pDest->iSds
add0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
ade0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
adf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ae00: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
ae10: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
ae20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ae30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
ae40: 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20  .  if( regRowid 
ae50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
ae60: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
ae70: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
ae80: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
ae90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
aea0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  regRowid);.  }. 
aeb0: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
aec0: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  f the loop.  */.
aed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
aee0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
aef0: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66  rContinue);.  if
af00: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
af10: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
af20: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73  eSorter ){.    s
af30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
af40: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
af50: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
af60: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
af70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
af80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
af90: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
afa0: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
afb0: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
afc0: 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  if( pSort->regRe
afd0: 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64  turn ) sqlite3Vd
afe0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
aff0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65  eturn, pSort->re
b000: 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69  gReturn);.  sqli
b010: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
b020: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
b030: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
b040: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
b050: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
b060: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
b070: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
b080: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
b090: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
b0a0: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
b0b0: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
b0c0: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
b0d0: 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69  Also try to esti
b0e0: 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mate the size of
b0f0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
b100: 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  lue and return t
b110: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
b120: 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a   *pEstWidth..**.
b130: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
b140: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
b150: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
b160: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
b170: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
b180: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
b190: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
b1a0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b1b0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
b1c0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
b1d0: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
b1e0: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
b1f0: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
b200: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
b210: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
b220: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
b230: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
b240: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
b250: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
b260: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
b270: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
b280: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
b290: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
b2a0: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
b2b0: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
b2c0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
b2d0: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
b2e0: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
b2f0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
b300: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
b310: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
b320: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
b330: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
b340: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
b350: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
b360: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
b370: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
b380: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
b390: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
b3a0: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  mn is NULL..**.*
b3b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
b3c0: 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36  as either 3 or 6
b3d0: 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65   parameters depe
b3e0: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
b3f0: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53   or not.** the S
b400: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
b410: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d  UMN_METADATA com
b420: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
b430: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66   is used..*/.#if
b440: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b450: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b460: 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  A.# define colum
b470: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c  nType(A,B,C,D,E,
b480: 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  F) columnTypeImp
b490: 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73  l(A,B,C,D,E,F).s
b4a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
b4b0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
b4c0: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
b4d0: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
b4e0: 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Expr,.  const ch
b4f0: 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20  ar **pzOrigDb,. 
b500: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
b510: 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74  OrigTab,.  const
b520: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f   char **pzOrigCo
b530: 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64  l,.  u8 *pEstWid
b540: 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  th.){.  char con
b550: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
b560: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b570: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
b580: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
b590: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f  Col = 0;.#else /
b5a0: 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  * if !defined(SQ
b5b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
b5c0: 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a  MN_METADATA) */.
b5d0: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
b5e0: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29  ype(A,B,C,D,E,F)
b5f0: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
b600: 41 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f  A,B,F).static co
b610: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
b620: 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65  TypeImpl(.  Name
b630: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
b640: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
b650: 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b  u8 *pEstWidth.){
b660: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
b670: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b680: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b690: 41 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  A) */.  char con
b6a0: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
b6b0: 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74   int j;.  u8 est
b6c0: 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66  Width = 1;..  if
b6d0: 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
b6e0: 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ) || pNC->pSrcLi
b6f0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
b700: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
b710: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
b720: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
b730: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
b740: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
b750: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
b760: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
b770: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
b780: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
b790: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
b7a0: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
b7b0: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
b7c0: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
b7d0: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
b7e0: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
b7f0: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
b800: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
b810: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
b820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
b830: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
b840: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
b850: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
b860: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
b870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b880: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
b890: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
b8a0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
b8b0: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
b8c0: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
b8d0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
b8e0: 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ab */.      test
b8f0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
b900: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
b910: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b920: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b930: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
b940: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
b950: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
b960: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
b970: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
b980: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
b990: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
b9a0: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
b9b0: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
b9c0: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
b9d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
b9e0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
b9f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
ba00: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
ba10: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
ba20: 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d    pS = pTabList-
ba30: 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[j].pSelect;. 
ba40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ba50: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
ba60: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
ba70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
ba80: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
ba90: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
baa0: 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73  one time, code s
bab0: 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e  uch as "SELECT n
bac0: 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74  ew.x" within a t
bad0: 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20  rigger would.   
bae0: 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
baf0: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20  is condition to 
bb00: 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e  run.  Since then
bb10: 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75  , we have restru
bb20: 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20  ctured how.     
bb30: 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f     ** trigger co
bb40: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
bb50: 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64  and so this cond
bb60: 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67  ition is no long
bb70: 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  er .        ** p
bb80: 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72  ossible. However
bb90: 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62  , it can still b
bba0: 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65  e true for state
bbb0: 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20  ments like.     
bbc0: 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
bbd0: 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing:.        **.
bbe0: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45          **   CRE
bbf0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c  ATE TABLE t1(col
bc00: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20   INTEGER);.     
bc10: 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28     **   SELECT (
bc20: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46  SELECT t1.col) F
bc30: 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ROM FROM t1;.   
bc40: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
bc50: 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  ** when columnTy
bc60: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
bc70: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
bc80: 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65   "t1.col" in the
bc90: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62   .        ** sub
bca0: 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73  -select. In this
bcb0: 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63   case, set the c
bcc0: 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55  olumn type to NU
bcd0: 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20  LL, even.       
bce0: 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68   ** though it sh
bcf0: 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22  ould really be "
bd00: 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20  INTEGER"..      
bd10: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
bd20: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72  This is not a pr
bd30: 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f  oblem, as the co
bd40: 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31  lumn type of "t1
bd50: 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20  .col" is never. 
bd60: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20         ** used. 
bd70: 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  When columnType(
bd80: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
bd90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20  he expression . 
bda0: 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45         ** "(SELE
bdb0: 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65  CT t1.col)", the
bdc0: 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73   correct type is
bdd0: 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74   returned (see t
bde0: 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20  he TK_SELECT.   
bdf0: 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62       ** branch b
be00: 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
be10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
be20: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
be30: 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70  pTab && pExpr->p
be40: 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  Tab==pTab );.   
be50: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
be60: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
be70: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
be80: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
be90: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
bea0: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
beb0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
bec0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
bed0: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
bee0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
bef0: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
bf00: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
bf10: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
bf20: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
bf30: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
bf40: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
bf50: 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c   && iCol<pS->pEL
bf60: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
bf70: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
bf80: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
bf90: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
bfa0: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
bfb0: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
bfc0: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
bfd0: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
bfe0: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
bff0: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
c000: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
c010: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
c020: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
c030: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
c040: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
c050: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
c060: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
c070: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
c080: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
c090: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
c0a0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c0b0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c0c0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
c0d0: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
c0e0: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
c0f0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
c100: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c110: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c120: 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72   p,&zOrigDb,&zOr
c130: 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c  igTab,&zOrigCol,
c140: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
c150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
c160: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53  lse if( pTab->pS
c170: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
c180: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
c190: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
c1a0: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
c1b0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
c1c0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
c1d0: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
c1e0: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
c1f0: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
c200: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
c210: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c220: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c230: 44 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28  DATA.        if(
c240: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
c250: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
c260: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
c270: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f    zOrigCol = "ro
c280: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
c290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
c2a0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
c2b0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
c2c0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
c2d0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
c2e0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
c2f0: 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d        estWidth =
c300: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c310: 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20  ].szEst;.       
c320: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67   }.        zOrig
c330: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
c340: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
c350: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
c360: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
c370: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
c380: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
c390: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
c3a0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
c3b0: 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d    zOrigDb = pNC-
c3c0: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
c3d0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
c3e0: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
c3f0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
c400: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
c410: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
c420: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c430: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c440: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c450: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
c460: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
c470: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
c480: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
c490: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
c4a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c4b0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
c4c0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
c4d0: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
c4e0: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
c4f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
c500: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
c510: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
c520: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
c530: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
c540: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
c550: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
c560: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
c570: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
c580: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
c590: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
c5a0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
c5b0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
c5c0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
c5d0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
c5e0: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
c5f0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
c600: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
c610: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
c620: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
c630: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c640: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c650: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
c660: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
c670: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
c680: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
c690: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
c6a0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
c6b0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
c6c0: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
c6d0: 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  h); .      break
c6e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c6f0: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
c700: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c710: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
c720: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
c730: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
c740: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
c750: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
c760: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
c770: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
c780: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
c790: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
c7a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
c7b0: 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a  f( pEstWidth ) *
c7c0: 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57  pEstWidth = estW
c7d0: 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a  idth;.  return z
c7e0: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
c7f0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
c800: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
c810: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
c820: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
c830: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
c840: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
c850: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
c860: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
c870: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c880: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
c890: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
c8a0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
c8b0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
c8c0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
c8d0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
c8e0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
c8f0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
c900: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
c910: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
c920: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
c930: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
c940: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
c950: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
c960: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
c970: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
c980: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
c990: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
c9a0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
c9b0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
c9c0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
c9d0: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
c9e0: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
c9f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
ca00: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
ca10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ca20: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
ca30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
ca40: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
ca50: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
ca60: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
ca70: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
ca80: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
ca90: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
caa0: 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20  rigCol, 0);..   
cab0: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
cac0: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
cad0: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
cae0: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
caf0: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
cb00: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
cb10: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
cb20: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
cb30: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
cb40: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
cb50: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
cb60: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
cb70: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
cb80: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
cb90: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
cba0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cbb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cbc0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cbd0: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
cbe0: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
cbf0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
cc00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cc10: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cc20: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
cc30: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
cc40: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
cc50: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
cc60: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
cc70: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65   0, 0, 0, 0);.#e
cc80: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
cc90: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
cca0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43  , i, COLNAME_DEC
ccb0: 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51  LTYPE, zType, SQ
ccc0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
ccd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
cce0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ccf0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f  MIT_DECLTYPE) */
cd00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
cd10: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
cd20: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
cd30: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
cd40: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
cd50: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
cd60: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
cd70: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
cd80: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
cd90: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
cda0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
cdb0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
cdc0: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
cdd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
cde0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
cdf0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
ce00: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
ce10: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
ce20: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
ce30: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
ce40: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
ce50: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
ce60: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
ce70: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
ce80: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
ce90: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
cea0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
ceb0: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
cec0: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
ced0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
cee0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
cef0: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
cf00: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
cf10: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
cf20: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
cf30: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
cf40: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
cf50: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56  lNamesSet || NEV
cf60: 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e  ER(v==0) || db->
cf70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
cf80: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
cf90: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
cfa0: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
cfb0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
cfc0: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
cfd0: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
cfe0: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
cff0: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
d000: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
d010: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
d020: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
d030: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
d040: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d050: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d060: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
d070: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d080: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d090: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
d0a0: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d0b0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
d0c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d0d0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
d0e0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
d0f0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d100: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d110: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d120: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d130: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d140: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  (p->op==TK_COLUM
d150: 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  N || p->op==TK_A
d160: 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54  GG_COLUMN) && pT
d170: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
d180: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
d190: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
d1a0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
d1b0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
d1c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59    for(j=0; ALWAY
d1d0: 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  S(j<pTabList->nS
d1e0: 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rc); j++){.     
d1f0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
d200: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70  >a[j].iCursor==p
d210: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
d220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d230: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
d240: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
d250: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
d260: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
d270: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
d280: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
d290: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
d2a0: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
d2b0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
d2c0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
d2d0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d2e0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
d2f0: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
d300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d310: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
d320: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
d330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d340: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
d350: 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  !fullNames ){.  
d360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d370: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d380: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d3a0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d3b0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
d3c0: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
d3d0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d3e0: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
d3f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
d400: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
d410: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
d420: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d430: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
d440: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
d450: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d460: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d470: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d480: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
d490: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d4a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d4b0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d4c0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d4d0: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
d4e0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d4f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d500: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
d510: 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e  ar *z = pEList->
d520: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
d530: 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c    z = z==0 ? sql
d540: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d550: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
d560: 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   : sqlite3DbStrD
d570: 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  up(db, z);.     
d580: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d590: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d5a0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51  NAME_NAME, z, SQ
d5b0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
d5c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
d5d0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
d5e0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
d5f0: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
d600: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
d610: 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69  ession list (whi
d620: 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  ch is really the
d630: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
d640: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72  ions.** that for
d650: 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  m the result set
d660: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
d670: 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20  tement) compute 
d680: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63  appropriate.** c
d690: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
d6a0: 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75  a table that wou
d6b0: 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ld hold the expr
d6c0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
d6d0: 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61  ** All column na
d6e0: 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71  mes will be uniq
d6f0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ue..**.** Only t
d700: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d710: 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43  are computed.  C
d720: 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c  olumn.zType, Col
d730: 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e  umn.zColl,.** an
d740: 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  d other fields o
d750: 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72  f Column are zer
d760: 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  oed..**.** Retur
d770: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
d780: 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65  uccess.  If a me
d790: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d7a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
d7b0: 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a   store NULL in *
d7c0: 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a  paCol and 0 in *
d7d0: 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e  pnCol and return
d7e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
d7f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
d800: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
d810: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
d820: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d830: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d840: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d850: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
d860: 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
d870: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
d880: 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
d890: 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
d8a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
d8b0: 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
d8c0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
d8d0: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
d8e0: 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
d8f0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
d900: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
d910: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d920: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d930: 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
d940: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
d950: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d970: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
d980: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d9a0: 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
d9b0: 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
d9c0: 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
d9d0: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
d9e0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
d9f0: 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
da00: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
da10: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
da20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
da30: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
da40: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
da50: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20  t */.  Expr *p; 
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
da80: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65   for a single re
da90: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
daa0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dac0: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
dad0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
daf0: 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
db00: 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66  zName[] */..  if
db10: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
db20: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
db30: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
db40: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
db50: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
db60: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
db70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
db80: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==0 );.  }else
db90: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
dba0: 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
dbb0: 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  }.  *pnCol = nCo
dbc0: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
dbd0: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
dbe0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
dbf0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
dc00: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
dc10: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
dc20: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
dc30: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71     */.    p = sq
dc40: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
dc50: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
dc60: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
dc70: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
dc80: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
dc90: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
dca0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
dcb0: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
dcc0: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
dcd0: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
dce0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
dcf0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
dd00: 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
dd10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dd20: 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20   Expr *pColExpr 
dd30: 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70  = p;  /* The exp
dd40: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
dd50: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
dd60: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
dd70: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
dd80: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73       /* Table as
dd90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
dda0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
ddb0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
ddc0: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
ddd0: 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
dde0: 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
ddf0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
de00: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
de10: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
de20: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  }.      if( pCol
de30: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
de40: 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43  UMN && ALWAYS(pC
de50: 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29  olExpr->pTab!=0)
de60: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
de70: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
de80: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
de90: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
dea0: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
deb0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
dec0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c       pTab = pCol
ded0: 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
dee0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
def0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
df00: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  Key;.        zNa
df10: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
df20: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20  ntf(db, "%s",.  
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
df40: 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61  Col>=0 ? pTab->a
df50: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20  Col[iCol].zName 
df60: 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20  : "rowid");.    
df70: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
df80: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
df90: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
dfa0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
dfb0: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
dfc0: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
dfd0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
dfe0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
dff0: 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d   "%s", pColExpr-
e000: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
e010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e020: 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67   /* Use the orig
e030: 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65  inal text of the
e040: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
e050: 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a  on as its name *
e060: 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  /.        zName 
e070: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e080: 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73  (db, "%s", pELis
e090: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
e0a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e0b0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e0c0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
e0d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e0e0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
e0f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
e100: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e110: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
e120: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
e130: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
e140: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
e150: 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
e160: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
e170: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
e180: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
e190: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
e1a0: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
e1b0: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
e1c0: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
e1d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
e1e0: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
e1f0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
e200: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
e210: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
e220: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
e230: 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20   for(k=nName-1; 
e240: 6b 3e 31 20 26 26 20 73 71 6c 69 74 65 33 49 73  k>1 && sqlite3Is
e250: 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b  digit(zName[k]);
e260: 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   k--){}.        
e270: 69 66 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d  if( k>=0 && zNam
e280: 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[k]==':' ) nNam
e290: 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a  e = k;.        z
e2a0: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
e2b0: 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d  .        zNewNam
e2c0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
e2d0: 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20  tf(db, "%s:%d", 
e2e0: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
e2f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
e300: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
e310: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e320: 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20   zNewName;.     
e330: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
e340: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
e350: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
e360: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
e370: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
e380: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
e390: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
e3a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
e3b0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
e3c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
e3d0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
e3e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
e3f0: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
e400: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
e410: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
e420: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e430: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
e440: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e460: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
e470: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
e480: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
e490: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
e4a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
e4b0: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
e4c0: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
e4d0: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
e4e0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
e4f0: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
e500: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
e510: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
e520: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
e530: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
e540: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
e550: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
e560: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
e570: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
e580: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
e590: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
e5a0: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
e5b0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
e5c0: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
e5d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e5e0: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
e5f0: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
e600: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e610: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
e620: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
e630: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
e640: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
e650: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
e660: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
e670: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
e680: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
e690: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
e6a0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
e6b0: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
e6c0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
e6d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e6e0: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
e6f0: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
e700: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
e710: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
e720: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
e730: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e740: 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a  tem *a;.  u64 sz
e750: 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  All = 0;..  asse
e760: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
e770: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
e780: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
e790: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
e7a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
e7b0: 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
e7c0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
e7d0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
e7e0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
e7f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e800: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
e810: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
e820: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
e830: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
e840: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
e850: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
e860: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
e870: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
e880: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
e890: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
e8a0: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
e8b0: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 54 79     if( pCol->zTy
e8c0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  pe==0 ){.      p
e8d0: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
e8e0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
e8f0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
e900: 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c  , p,0,0,0, &pCol
e910: 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 7d  ->szEst));.    }
e920: 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43  .    szAll += pC
e930: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70  ol->szEst;.    p
e940: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
e950: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
e960: 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
e970: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
e980: 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  0 ) pCol->affini
e990: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
e9a0: 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  NONE;.    pColl 
e9b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
e9c0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
e9d0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  .    if( pColl &
e9e0: 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30  & pCol->zColl==0
e9f0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
ea00: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44  zColl = sqlite3D
ea10: 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c  bStrDup(db, pCol
ea20: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
ea30: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54  .  }.  pTab->szT
ea40: 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  abRow = sqlite3L
ea50: 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a  ogEst(szAll*4);.
ea60: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
ea70: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ea80: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
ea90: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
eaa0: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
eab0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
eac0: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
ead0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
eae0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
eaf0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
eb00: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
eb10: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
eb20: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
eb30: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
eb40: 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
eb50: 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
eb60: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
eb70: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
eb80: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
eb90: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
eba0: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
ebb0: 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
ebc0: 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
ebd0: 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
ebe0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
ebf0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
ec00: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
ec10: 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
ec20: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
ec30: 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
ec40: 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
ec50: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
ec60: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
ec70: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
ec80: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
ec90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
eca0: 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
ecb0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
ecc0: 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
ecd0: 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
ece0: 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
ecf0: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
ed00: 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
ed10: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
ed20: 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d  ed==0 );.  pTab-
ed30: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
ed40: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
ed50: 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
ed60: 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
ed70: 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
ed80: 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
ed90: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
eda0: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
edb0: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
edc0: 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
edd0: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
ede0: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
edf0: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
ee00: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
ee10: 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d  Select);.  pTab-
ee20: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69  >iPKey = -1;.  i
ee30: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
ee40: 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
ee50: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
ee60: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74  , pTab);.    ret
ee70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
ee80: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
ee90: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
eea0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
eeb0: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
eec0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
eed0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
eee0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
eef0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
ef00: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
ef10: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
ef20: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
ef30: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
ef40: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
ef50: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
ef60: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
ef70: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
ef80: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
ef90: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29  beCreate(pParse)
efa0: 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20 73 71  ;.    if( v ) sq
efb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
efc0: 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 20  v, OP_Init);.   
efd0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f   if( pParse->pTo
efe0: 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20 20 26  plevel==0.     &
eff0: 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
f000: 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
f010: 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75  ,SQLITE_FactorOu
f020: 74 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b 0a 20  tConst).    ){. 
f030: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43       pParse->okC
f040: 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a  onstFactor = 1;.
f050: 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72 65 74      }..  }.  ret
f060: 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn v;.}.../*.**
f070: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69   Compute the iLi
f080: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
f090: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45  fields of the SE
f0a0: 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68  LECT based on th
f0b0: 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20  e.** pLimit and 
f0c0: 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69  pOffset expressi
f0d0: 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64  ons.  pLimit and
f0e0: 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   pOffset hold th
f0f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
f100: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
f110: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
f120: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
f130: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
f140: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
f150: 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
f160: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
f170: 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
f180: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
f190: 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
f1a0: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
f1b0: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
f1c0: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
f1d0: 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
f1e0: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
f1f0: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
f200: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
f210: 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
f220: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
f230: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
f240: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f250: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
f260: 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20  alues of iLimit 
f270: 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
f280: 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
f290: 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
f2a0: 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e  ned by pLimit an
f2b0: 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d pOffset.  iLim
f2c0: 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
f2d0: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
f2e0: 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
f2f0: 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
f300: 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a   values (zero).*
f310: 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  * prior to calli
f320: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
f330: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73  .**.** The iOffs
f340: 65 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20  et register (if 
f350: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
f360: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
f370: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65   value.** of the
f380: 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c   OFFSET.  The iL
f390: 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73  imit register is
f3a0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
f3b0: 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72  LIMIT.  Register
f3c0: 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73  .** iOffset+1 is
f3d0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
f3e0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a  LIMIT+OFFSET..**
f3f0: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
f400: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
f410: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
f420: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
f430: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
f440: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
f450: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
f460: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
f470: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
f480: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
f490: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
f4a0: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
f4b0: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
f4c0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
f4d0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
f4e0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
f4f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
f500: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
f510: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
f520: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
f530: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
f540: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
f550: 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  r1, n;.  if( p->
f560: 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b  iLimit ) return;
f570: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  ..  /* .  ** "LI
f580: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
f590: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
f5a0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
f5b0: 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61  ** controversy a
f5c0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
f5d0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
f5e0: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
f5f0: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
f600: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
f610: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
f620: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
f630: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ows..  */.  sqli
f640: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
f650: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  r(pParse);.  ass
f660: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
f670: 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21  =0 || p->pLimit!
f680: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
f690: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
f6a0: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
f6b0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
f6c0: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
f6d0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f6e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21  ;.    assert( v!
f6f0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  =0 );.    if( sq
f700: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
f710: 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  er(p->pLimit, &n
f720: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
f730: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f740: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69  OP_Integer, n, i
f750: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
f760: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
f770: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
f780: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
f790: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f7a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f7b0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
f7c0: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
f7d0: 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
f7e0: 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36 34 29  nSelectRow>(u64)
f7f0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  n ){.        p->
f800: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b 0a  nSelectRow = n;.
f810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
f820: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
f830: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f840: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d   p->pLimit, iLim
f850: 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
f860: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f870: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c  OP_MustBeInt, iL
f880: 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
f890: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
f8a0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
f8b0: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
f8c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f8d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f8e0: 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42  fNot, iLimit, iB
f8f0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
f900: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
f910: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
f920: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   ){.      p->iOf
f930: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
f940: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
f950: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
f960: 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
f970: 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
f980: 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
f990: 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  +offset */.     
f9a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f9b0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
f9c0: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
f9d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f9e0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
f9f0: 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29  tBeInt, iOffset)
fa00: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
fa10: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
fa20: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
fa30: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
fa40: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
fa50: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
fa60: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
fa70: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
fa80: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
fa90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
faa0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
fab0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
fac0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fad0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
fae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
faf0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c  ddOp3(v, OP_Add,
fb00: 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
fb10: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
fb20: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
fb30: 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
fb40: 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  T"));.      addr
fb50: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
fb60: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
fb70: 73 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  s, iLimit); Vdbe
fb80: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fb90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fba0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
fbb0: 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b  er, -1, iOffset+
fbc0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
fbd0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
fbe0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20   addr1);.    }. 
fbf0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
fc00: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
fc10: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
fc20: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
fc30: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
fc40: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
fc50: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
fc60: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
fc70: 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
fc80: 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
fc90: 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
fca0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
fcb0: 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
fcc0: 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
fcd0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
fce0: 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
fcf0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
fd00: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
fd10: 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
fd20: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
fd30: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
fd40: 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
fd50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fd60: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
fd70: 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
fd80: 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
fd90: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
fda0: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
fdb0: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
fdc0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
fdd0: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
fde0: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
fdf0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
fe00: 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
fe10: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
fe20: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
fe30: 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28  iCol>=0 );.  if(
fe40: 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c   pRet==0 && iCol
fe50: 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
fe60: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
fe70: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
fe80: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
fe90: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
fea0: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
feb0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
fec0: 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61  * The select sta
fed0: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
fee0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
fef0: 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f  meter is a compo
ff00: 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69  und SELECT.** wi
ff10: 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
ff20: 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63  lause. This func
ff30: 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
ff40: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79  nd returns a Key
ff50: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
ff60: 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69  e suitable for i
ff70: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  mplementing the 
ff80: 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20  ORDER BY..**.** 
ff90: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
ffa0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
ffb0: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ure is obtained 
ffc0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65  from malloc. The
ffd0: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
ffe0: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
fff0: 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67  ble for ensuring
10000 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
10010 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
10020 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a  ly.** freed..*/.
10030 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
10040 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
10050 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20  ByKeyInfo(Parse 
10060 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
10070 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b  *p, int nExtra){
10080 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
10090 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
100a0 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  rBy;.  int nOrde
100b0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
100c0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69  y->nExpr;.  sqli
100d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
100e0 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ->db;.  KeyInfo 
100f0 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b  *pRet = sqlite3K
10100 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
10110 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c  nOrderBy+nExtra,
10120 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20   1);.  if( pRet 
10130 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
10140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
10150 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
10160 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
10170 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
10180 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d   &pOrderBy->a[i]
10190 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54  ;.      Expr *pT
101a0 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  erm = pItem->pEx
101b0 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  pr;.      CollSe
101c0 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20  q *pColl;..     
101d0 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67   if( pTerm->flag
101e0 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
101f0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
10200 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
10210 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54 65  lSeq(pParse, pTe
10220 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
10230 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
10240 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
10250 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
10260 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
10270 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  rByCol-1);.     
10280 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
10290 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
102a0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
102b0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
102c0 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20  pExpr =.        
102d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
102e0 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50  CollateString(pP
102f0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f  arse, pTerm, pCo
10300 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
10310 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
10320 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
10330 49 73 57 72 69 74 65 61 62 6c 65 28 70 52 65 74  IsWriteable(pRet
10340 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  ) );.      pRet-
10350 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
10360 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61  l;.      pRet->a
10370 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
10380 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
10390 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
103a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
103b0 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  t;.}..#ifndef SQ
103c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
103d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
103e0 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20   generates VDBE 
103f0 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20  code to compute 
10400 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
10410 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a   WITH RECURSIVE.
10420 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20  ** query of the 
10430 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72  form:.**.**   <r
10440 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20  ecursive-table> 
10450 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79  AS (<setup-query
10460 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72  > UNION [ALL] <r
10470 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29  ecursive-query>)
10480 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10490 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
104a0 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
104b0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
104c0 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20       p->pPrior  
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54      p.**.**.** T
10510 68 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20  here is exactly 
10520 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
10530 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74   the recursive-t
10540 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
10550 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65   clause.** of re
10560 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d  cursive-query, m
10570 61 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 53  arked with the S
10580 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 69 73 52 65  rcList->a[].isRe
10590 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a  cursive flag..**
105a0 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75  .** The setup-qu
105b0 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ery runs once to
105c0 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69   generate an ini
105d0 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73  tial set of rows
105e0 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f   that go.** into
105f0 20 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20   a Queue table. 
10600 20 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63   Rows are extrac
10610 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65  ted from the Que
10620 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a  ue table one by.
10630 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f  ** one.  Each ro
10640 77 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  w extracted from
10650 20 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74   Queue is output
10660 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e   to pDest.  Then
10670 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65   the single.** e
10680 78 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f  xtracted row (no
10690 77 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e  w in the iCurren
106a0 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73  t table) becomes
106b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
106c0 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65  the.** recursive
106d0 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63  -table for a rec
106e0 75 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e  ursive-query run
106f0 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66  .  The output of
10700 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71   the recursive-q
10710 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64  uery.** is added
10720 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51   back into the Q
10730 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ueue table.  The
10740 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73  n another row is
10750 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
10760 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65  Queue.** and the
10770 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69   iteration conti
10780 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51  nues until the Q
10790 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d  ueue table is em
107a0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
107b0 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
107c0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
107d0 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69  ON then no dupli
107e0 63 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76  cate rows are ev
107f0 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69  er.** inserted i
10800 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
10810 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69  ble.  The iDisti
10820 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20  nct table keeps 
10830 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f  a copy of all ro
10840 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  ws.** that have 
10850 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74  ever been insert
10860 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e  ed into Queue an
10870 64 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61  d causes duplica
10880 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73  tes to be.** dis
10890 63 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20  carded.  If the 
108a0 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
108b0 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c  N ALL, then dupl
108c0 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77  icates are allow
108d0 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ed..** .** If th
108e0 65 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f  e query has an O
108f0 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e  RDER BY, then en
10900 74 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65  tries in the Que
10910 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70  ue table are kep
10920 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59  t in.** ORDER BY
10930 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66   order and the f
10940 69 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78  irst entry is ex
10950 74 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68  tracted for each
10960 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74   cycle.  Without
10970 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  .** an ORDER BY,
10980 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10990 20 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e   is just a FIFO.
109a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49  .**.** If a LIMI
109b0 54 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76  T clause is prov
109c0 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69  ided, then the i
109d0 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61  teration stops a
109e0 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a  fter LIMIT rows.
109f0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74  ** have been out
10a00 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41  put to pDest.  A
10a10 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d   LIMIT of zero m
10a20 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e  eans to output n
10a30 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20  o rows and a.** 
10a40 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d  negative LIMIT m
10a50 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61  eans to output a
10a60 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65  ll rows.  If the
10a70 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46  re is also an OF
10a80 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77  FSET clause.** w
10a90 69 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76  ith a positive v
10aa0 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66  alue, then the f
10ab0 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70  irst OFFSET outp
10ac0 75 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65  uts are discarde
10ad0 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e  d rather.** than
10ae0 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70   being sent to p
10af0 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54  Dest.  The LIMIT
10b00 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20   count does not 
10b10 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65  begin until afte
10b20 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73  r OFFSET.** rows
10b30 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70   have been skipp
10b40 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
10b50 69 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52  id generateWithR
10b60 65 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20  ecursiveQuery(. 
10b70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10b80 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
10b90 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
10ba0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
10bb0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75       /* The recu
10bc0 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20  rsive SELECT to 
10bd0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
10be0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
10bf0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
10c00 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
10c10 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  ults */.){.  Src
10c20 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
10c30 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
10c40 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
10c50 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71   the recursive q
10c60 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  uery */.  int nC
10c70 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
10c80 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65  nExpr;  /* Numbe
10c90 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
10ca0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61  the recursive ta
10cb0 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ble */.  Vdbe *v
10cc0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
10cd0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  ;      /* The pr
10ce0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
10cf0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
10d00 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
10d10 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72  *pSetup = p->pPr
10d20 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65  ior;   /* The se
10d30 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  tup query */.  i
10d40 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d60 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
10d70 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
10d80 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20  t, addrBreak;   
10d90 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61     /* CONTINUE a
10da0 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73  nd BREAK address
10db0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  es */.  int iCur
10dc0 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
10dd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72        /* The Cur
10de0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
10df0 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20  int regCurrent; 
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e10 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
10e20 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  g Current table 
10e30 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b  */.  int iQueue;
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20     /* The Queue 
10e60 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
10e70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20  Distinct = 0;   
10e80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65           /* To e
10e90 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73  nsure unique res
10ea0 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f  ults if UNION */
10eb0 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53  .  int eDest = S
10ec0 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20  RT_Fifo;        
10ed0 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65   /* How to write
10ee0 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53   to Queue */.  S
10ef0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75  electDest destQu
10f00 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eue;         /* 
10f10 53 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65  SelectDest targe
10f20 74 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20  tting the Queue 
10f30 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
10f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10f50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
10f60 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
10f70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10f90 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
10fa0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
10fb0 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  By;           /*
10fc0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
10fd0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
10fe0 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
10ff0 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
11000 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
11010 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  T */.  int regLi
11020 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20  mit, regOffset; 
11030 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
11040 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20  s used by LIMIT 
11050 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20  and OFFSET */.. 
11060 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f   /* Obtain autho
11070 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61  rization to do a
11080 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
11090 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
110a0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
110b0 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53  e, SQLITE_RECURS
110c0 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  IVE, 0, 0, 0) ) 
110d0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72  return;..  /* Pr
110e0 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20  ocess the LIMIT 
110f0 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
11100 65 73 2c 20 69 66 20 74 68 65 79 20 65 78 69 73  es, if they exis
11110 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b  t */.  addrBreak
11120 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
11130 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
11140 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
11150 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61  ers(pParse, p, a
11160 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69  ddrBreak);.  pLi
11170 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
11180 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  .  pOffset = p->
11190 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69  pOffset;.  regLi
111a0 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
111b0 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70  .  regOffset = p
111c0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
111d0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66  pLimit = p->pOff
111e0 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c  set = 0;.  p->iL
111f0 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  imit = p->iOffse
11200 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42  t = 0;.  pOrderB
11210 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
11220 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
11230 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
11240 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74  of the Current t
11250 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
11260 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63  0; ALWAYS(i<pSrc
11270 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20  ->nSrc); i++){. 
11280 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
11290 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b  ].isRecursive ){
112a0 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e 74 20  .      iCurrent 
112b0 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  = pSrc->a[i].iCu
112c0 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61  rsor;.      brea
112d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
112e0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73  /* Allocate curs
112f0 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ors numbers for 
11300 51 75 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e  Queue and Distin
11310 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  ct.  The cursor 
11320 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20  number for.  ** 
11330 74 68 65 20 44 69 73 74 69 6e 63 74 20 74 61 62  the Distinct tab
11340 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  le must be exact
11350 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74  ly one greater t
11360 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64  han Queue in ord
11370 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
11380 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64  SRT_DistFifo and
11390 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64   SRT_DistQueue d
113a0 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77  estinations to w
113b0 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65  ork. */.  iQueue
113c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
113d0 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  +;.  if( p->op==
113e0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
113f0 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
11400 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65   ? SRT_DistQueue
11410 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b   : SRT_DistFifo;
11420 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d  .    iDistinct =
11430 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
11440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44  .  }else{.    eD
11450 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
11460 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54   SRT_Queue : SRT
11470 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c  _Fifo;.  }.  sql
11480 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
11490 69 74 28 26 64 65 73 74 51 75 65 75 65 2c 20 65  it(&destQueue, e
114a0 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a  Dest, iQueue);..
114b0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
114c0 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e  rsors for Curren
114d0 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69  t, Queue, and Di
114e0 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67  stinct. */.  reg
114f0 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72  Current = ++pPar
11500 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
11510 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11520 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
11530 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72  iCurrent, regCur
11540 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69  rent, nCol);.  i
11550 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
11560 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
11570 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Info = multiSele
11580 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
11590 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
115a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
115b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
115c0 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75  Ephemeral, iQueu
115d0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
115e0 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20  pr+2, 0,.       
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11600 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
11610 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
11620 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65   destQueue.pOrde
11630 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
11640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
11650 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11660 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
11670 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c  al, iQueue, nCol
11680 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d  );.  }.  VdbeCom
11690 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20  ment((v, "Queue 
116a0 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20  table"));.  if( 
116b0 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  iDistinct ){.   
116c0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
116d0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  [0] = sqlite3Vdb
116e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
116f0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69  enEphemeral, iDi
11700 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20  stinct, 0);.    
11710 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
11720 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
11730 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63  .  }..  /* Detac
11740 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
11750 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63  lause from the c
11760 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
11770 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
11780 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65  = 0;..  /* Store
11790 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
117a0 74 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  the setup-query 
117b0 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70  in Queue. */.  p
117c0 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30  Setup->pNext = 0
117d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
117e0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
117f0 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75  Setup, &destQueu
11800 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e  e);.  pSetup->pN
11810 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72  ext = p;.  if( r
11820 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  c ) goto end_of_
11830 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b  recursive_query;
11840 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
11850 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20  next row in the 
11860 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74  Queue and output
11870 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61   that row */.  a
11880 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
11890 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
118a0 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c  _Rewind, iQueue,
118b0 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
118c0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
118d0 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
118e0 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65   next row in Que
118f0 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65  ue over to Curre
11900 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  nt */.  sqlite3V
11910 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11920 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e  NullRow, iCurren
11930 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20  t); /* To reset 
11940 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a  column cache */.
11950 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
11960 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11970 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
11980 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f  lumn, iQueue, pO
11990 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c  rderBy->nExpr+1,
119a0 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
119b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
119c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
119d0 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65  OP_RowData, iQue
119e0 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b  ue, regCurrent);
119f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
11a00 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
11a10 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a  elete, iQueue);.
11a20 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
11a30 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43   single row in C
11a40 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72  urrent */.  addr
11a50 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
11a60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
11a70 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
11a80 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43  regOffset, addrC
11a90 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e  ont);.  selectIn
11aa0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
11ab0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43  p, p->pEList, iC
11ac0 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c  urrent,.      0,
11ad0 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43   0, pDest, addrC
11ae0 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  ont, addrBreak);
11af0 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20  .  if( regLimit 
11b00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
11b10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
11b20 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67  ecrJumpZero, reg
11b30 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b  Limit, addrBreak
11b40 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
11b50 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
11b60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11b70 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
11b80 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74  t);..  /* Execut
11b90 65 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  e the recursive 
11ba0 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68  SELECT taking th
11bb0 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
11bc0 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20  Current as.  ** 
11bd0 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
11be0 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
11bf0 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  e. Store the res
11c00 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65 75  ults in the Queu
11c10 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  e..  */.  p->pPr
11c20 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ior = 0;.  sqlit
11c30 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11c40 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b   p, &destQueue);
11c50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
11c60 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  rior==0 );.  p->
11c70 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b  pPrior = pSetup;
11c80 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
11c90 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
11ca0 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
11cb0 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
11cc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11cd0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
11ce0 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
11cf0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11d00 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
11d10 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
11d20 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
11d30 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
11d40 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
11d50 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
11d60 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
11d70 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
11d80 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70  = pLimit;.  p->p
11d90 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
11da0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
11db0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11dc0 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46  MIT_CTE */../* F
11dd0 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
11de0 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
11df0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
11e00 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
11e10 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
11e20 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11e30 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
11e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11e50 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
11e60 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
11e70 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
11e80 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
11e90 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
11ea0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
11eb0 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f  /.);../*.** Erro
11ec0 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68  r message for wh
11ed0 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  en two or more t
11ee0 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75  erms of a compou
11ef0 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20 64  nd select have d
11f00 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65  ifferent.** size
11f10 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f   result sets..*/
11f20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
11f30 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73  ectWrongNumTerms
11f40 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
11f50 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
11f60 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
11f70 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
11f80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
11f90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
11fa0 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68  ll VALUES must h
11fb0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
11fc0 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a  ber of terms");.
11fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
11fe0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11ff0 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
12000 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
12010 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
12020 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
12030 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
12040 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
12050 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
12060 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  p->op));.  }.}..
12070 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65  /*.** Handle the
12080 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   special case of
12090 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65   a compound-sele
120a0 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  ct that originat
120b0 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c  es from a.** VAL
120c0 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20  UES clause.  By 
120d0 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73  handling this as
120e0 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c   a special case,
120f0 20 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a   we avoid deep.*
12100 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64  * recursion, and
12110 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65   thus do not nee
12120 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65  d to enforce the
12130 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
12140 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a  MPOUND_SELECT.**
12150 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61   on a VALUES cla
12160 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75  use..**.** Becau
12170 73 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62  se the Select ob
12180 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20  ject originates 
12190 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c  from a VALUES cl
121a0 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 49  ause:.**   (1) I
121b0 74 20 68 61 73 20 6e 6f 20 4c 49 4d 49 54 20 6f  t has no LIMIT o
121c0 72 20 4f 46 46 53 45 54 0a 2a 2a 20 20 20 28 32  r OFFSET.**   (2
121d0 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65 20  ) All terms are 
121e0 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28  UNION ALL.**   (
121f0 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4f  3) There is no O
12200 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
12210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
12220 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a  tiSelectValues(.
12230 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12240 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
12250 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12260 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
12270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
12280 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
12290 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
122a0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
122b0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
122c0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
122d0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
122e0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
122f0 72 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  r;.  int nExpr =
12300 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
12310 72 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20  r;.  int nRow = 
12320 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  1;.  int rc = 0;
12330 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
12340 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
12350 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a  iValue );.  do{.
12360 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
12370 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
12380 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ues );.    asser
12390 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  t( p->op==TK_ALL
123a0 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   || (p->op==TK_S
123b0 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69  ELECT && p->pPri
123c0 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  or==0) );.    as
123d0 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
123e0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
123f0 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
12400 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45  );.    if( p->pE
12410 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 45 78  List->nExpr!=nEx
12420 70 72 20 29 7b 0a 20 20 20 20 20 20 73 65 6c 65  pr ){.      sele
12430 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45  ctWrongNumTermsE
12440 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 29 3b  rror(pParse, p);
12450 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
12460 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12470 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72  ->pPrior==0 ) br
12480 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
12490 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78   p->pPrior->pNex
124a0 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20  t==p );.    p = 
124b0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e  p->pPrior;.    n
124c0 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  Row++;.  }while(
124d0 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  1);.  while( p )
124e0 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  {.    pPrior = p
124f0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
12500 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
12510 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
12520 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
12530 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50  Dest);.    p->pP
12540 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
12550 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
12560 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  k;.    p->nSelec
12570 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  tRow = nRow;.   
12580 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
12590 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
125a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
125b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
125c0 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d  to process a com
125d0 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d  pound query form
125e0 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20   from.** two or 
125f0 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
12600 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f  eries using UNIO
12610 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58  N, UNION ALL, EX
12620 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45  CEPT, or.** INTE
12630 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20  RSECT.**.** "p" 
12640 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
12650 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
12660 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
12670 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
12680 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
12690 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
126a0 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
126b0 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
126c0 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
126d0 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
126e0 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
126f0 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
12700 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
12710 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
12720 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
12730 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
12740 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
12750 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
12760 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
12770 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
12780 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
12790 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
127a0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
127b0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
127c0 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
127d0 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
127e0 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
127f0 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
12800 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
12810 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
12820 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
12830 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
12840 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
12850 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
12860 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
12870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
12880 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12890 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
128a0 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
128b0 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
128c0 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
128d0 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
128e0 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
128f0 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
12900 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
12910 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
12920 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
12930 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
12940 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
12950 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
12960 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
12970 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
12980 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
12990 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
129a0 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
129b0 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
129c0 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
129d0 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
129e0 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
129f0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
12a00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12a10 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
12a20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12a30 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
12a40 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
12a50 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
12a60 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
12a70 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
12a80 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
12a90 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
12aa0 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
12ab0 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
12ac0 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
12ad0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12ae0 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
12af0 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
12b00 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
12b10 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
12b20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
12b30 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
12b40 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
12b50 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
12b60 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
12b70 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
12b80 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
12b90 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
12ba0 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20   /* Alternative 
12bb0 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  data destination
12bc0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44   */.  Select *pD
12bd0 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43  elete = 0;  /* C
12be0 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73  hain of simple s
12bf0 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65  elects to delete
12c00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12c10 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
12c20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12c30 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  on */.#ifndef SQ
12c40 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
12c50 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20  N.  int iSub1 = 
12c60 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
12c70 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
12c80 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
12c90 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20  iSub2 = 0;      
12ca0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
12cb0 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
12cc0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  */.#endif..  /* 
12cd0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
12ce0 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
12cf0 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
12d00 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
12d10 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
12d20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
12d30 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
12d40 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
12d50 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
12d60 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  IMIT..  */.  ass
12d70 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72  ert( p && p->pPr
12d80 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69  ior );  /* Calli
12d90 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72  ng function guar
12da0 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68  antees this much
12db0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
12dc0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
12dd0 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c  Recursive)==0 ||
12de0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
12df0 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  | p->op==TK_UNIO
12e00 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  N );.  db = pPar
12e10 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72  se->db;.  pPrior
12e20 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
12e30 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20  dest = *pDest;. 
12e40 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
12e50 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
12e60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12e70 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c  rse,"ORDER BY cl
12e80 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
12e90 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
12ea0 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
12eb0 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
12ec0 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
12ed0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
12ee0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
12ef0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
12f00 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
12f10 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12f20 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73  ,"LIMIT clause s
12f30 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
12f40 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
12f50 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
12f60 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
12f70 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
12f80 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
12f90 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73  nd;.  }..  v = s
12fa0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12fb0 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
12fc0 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65   v!=0 );  /* The
12fd0 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72   VDBE already cr
12fe0 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  eated by calling
12ff0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
13000 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
13010 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
13020 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
13030 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
13040 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
13050 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
13060 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13070 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
13080 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13090 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
130a0 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20  , dest.iSDParm, 
130b0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
130c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
130d0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
130e0 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
130f0 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
13100 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
13110 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61  .  /* Special ha
13120 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d  ndling for a com
13130 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
13140 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20  t originates as 
13150 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  a VALUES clause.
13160 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
13170 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
13180 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72  tiValue ){.    r
13190 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 56  c = multiSelectV
131a0 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70 2c  alues(pParse, p,
131b0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f 74   &dest);.    got
131c0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
131d0 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  nd;.  }..  /* Ma
131e0 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
131f0 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
13200 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
13210 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
13220 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
13230 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
13240 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13250 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
13260 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
13270 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
13280 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
13290 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
132a0 20 20 20 20 73 65 6c 65 63 74 57 72 6f 6e 67 4e      selectWrongN
132b0 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70 50 61  umTermsError(pPa
132c0 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 72 63 20  rse, p);.    rc 
132d0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
132e0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
132f0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
13300 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69  ITE_OMIT_CTE.  i
13310 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
13320 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
13330 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74  .    generateWit
13340 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
13350 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
13360 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
13370 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  f..  /* Compound
13380 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
13390 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
133a0 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
133b0 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
133c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
133d0 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
133e0 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
133f0 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
13400 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   pDest);.  }else
13410 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
13420 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
13430 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
13440 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
13450 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
13460 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
13470 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
13480 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
13490 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a      int nLimit;.
134a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
134b0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
134c0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
134d0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
134e0 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
134f0 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  >iOffset = p->iO
13500 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72  ffset;.      pPr
13510 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d  ior->pLimit = p-
13520 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
13530 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d  Prior->pOffset =
13540 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
13550 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
13560 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
13570 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
13580 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
13590 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
135a0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
135b0 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  st);.      p->pL
135c0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
135d0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
135e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
135f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
13600 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
13620 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
13630 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
13640 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
13650 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
13660 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
13670 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
13680 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
13690 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
136a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
136b0 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74  IfNot, p->iLimit
136c0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
136d0 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
136e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
136f0 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
13700 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
13710 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61     }.      expla
13720 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
13730 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
13740 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
13750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
13760 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
13770 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  &dest);.      te
13780 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
13790 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
137a0 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
137b0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
137c0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
137d0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
137e0 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
137f0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
13800 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
13810 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  t.       && sqli
13820 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
13830 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c  (pPrior->pLimit,
13840 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20   &nLimit).      
13850 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20   && nLimit>0 && 
13860 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
13870 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20  (u64)nLimit .   
13880 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d     ){.        p-
13890 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c  >nSelectRow = nL
138a0 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  imit;.      }.  
138b0 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
138c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
138d0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
138e0 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
138f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13900 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
13910 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
13920 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
13930 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
13940 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
13950 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
13960 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
13970 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
13980 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
13990 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
139a0 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
139b0 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
139c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
139d0 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
139e0 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
139f0 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
13a00 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
13a10 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
13a20 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
13a30 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
13a40 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
13a50 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
13a60 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
13a70 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
13a80 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65  ndest;..      te
13a90 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
13aa0 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
13ab0 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
13ac0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
13ad0 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53       priorOp = S
13ae0 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
13af0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
13b00 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
13b10 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
13b20 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
13b30 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
13b40 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
13b50 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
13b60 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
13b70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13b80 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20  ->pLimit==0 );  
13b90 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
13ba0 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
13bb0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
13bc0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13bd0 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
13be0 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
13bf0 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
13c00 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
13c10 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
13c20 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  SDParm;.      }e
13c30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
13c40 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
13c50 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
13c60 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
13c70 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
13c80 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
13c90 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
13ca0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
13cb0 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
13cc0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
13cd0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
13ce0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
13cf0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
13d00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13d10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
13d20 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
13d30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13d40 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13d50 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
13d60 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
13d70 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
13d80 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
13d90 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
13da0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
13db0 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
13dc0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
13dd0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
13de0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
13df0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
13e00 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
13e10 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
13e20 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
13e30 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
13e40 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
13e50 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
13e60 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
13e70 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
13e80 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
13e90 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
13ea0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
13eb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
13ec0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
13ed0 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
13ee0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
13ef0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
13f00 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13f10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
13f20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
13f30 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
13f40 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
13f50 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
13f60 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
13f70 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
13f80 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
13f90 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
13fa0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
13fb0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
13fc0 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
13fd0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
13fe0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
13ff0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
14000 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
14010 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
14020 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
14030 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
14040 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
14050 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
14060 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70   = op;.      exp
14070 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14080 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
14090 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
140a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
140b0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
140c0 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
140d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
140e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
140f0 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
14100 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
14110 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
14120 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
14130 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
14140 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
14150 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
14160 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
14170 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
14180 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
14190 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
141a0 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
141b0 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
141c0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
141d0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
141e0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
141f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
14200 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
14210 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53  TK_UNION ) p->nS
14220 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
14230 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
14240 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14250 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
14260 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
14270 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
14280 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
14290 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
142a0 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
142b0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  0;.      p->iOff
142c0 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  set = 0;..      
142d0 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
142e0 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
142f0 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
14300 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
14310 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
14320 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
14330 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
14340 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
14350 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61  nTab==dest.iSDPa
14360 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
14370 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
14380 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
14390 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
143a0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
143b0 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
143c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
143d0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
143e0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
143f0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
14400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
14410 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
14420 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
14430 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
14440 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
14450 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
14460 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
14470 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
14480 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
14490 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
144a0 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
144b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
144c0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
144d0 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
144e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
144f0 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
14500 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
14510 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
14520 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
14530 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14540 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
14550 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
14560 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14570 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
14580 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
14590 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
145a0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
145b0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
145c0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
145d0 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  nTab,.          
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
145f0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
14600 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
14610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
14620 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
14630 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
14640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14650 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
14660 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56  nTab, iStart); V
14670 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14690 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
146a0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
146b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
146c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
146d0 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
146e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
146f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14700 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
14710 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
14720 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
14730 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
14740 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
14750 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
14760 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
14770 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
14780 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
14790 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
147a0 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
147b0 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20       int r1;..  
147c0 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
147d0 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
147e0 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
147f0 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
14800 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
14810 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
14820 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
14830 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
14840 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
14850 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
14860 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
14870 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14880 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
14890 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
148a0 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
148b0 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b++;.      asser
148c0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
148d0 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72  0 );..      addr
148e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
148f0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14900 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20  phemeral, tab1, 
14910 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
14920 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
14930 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
14940 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
14950 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
14960 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
14970 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
14980 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
14990 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ral;.      asser
149a0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
149b0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
149c0 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
149d0 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
149e0 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
149f0 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
14a00 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
14a10 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73  DestInit(&inters
14a20 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69  ectdest, SRT_Uni
14a30 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20  on, tab1);.     
14a40 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14a50 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
14a60 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14a70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14a80 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14a90 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65  e, pPrior, &inte
14aa0 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
14ab0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14ac0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14ad0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
14ae0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
14af0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
14b00 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
14b10 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
14b20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14b30 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
14b40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
14b50 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
14b60 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
14b70 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
14b80 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
14b90 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
14ba0 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
14bb0 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14bc0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
14bd0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
14be0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14bf0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
14c00 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
14c10 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
14c20 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
14c30 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44  ntersectdest.iSD
14c40 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20  Parm = tab2;.   
14c50 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14c60 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
14c70 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14c80 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
14c90 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
14ca0 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
14cb0 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ctdest);.      t
14cc0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
14cd0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
14ce0 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
14cf0 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
14d00 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
14d10 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
14d20 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e  ectRow>pPrior->n
14d30 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
14d40 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
14d50 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
14d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14d70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
14d80 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
14d90 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
14da0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
14db0 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20  et = pOffset;.. 
14dc0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
14dd0 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
14de0 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
14df0 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
14e00 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
14e10 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
14e20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14e30 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
14e40 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
14e50 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
14e60 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
14e70 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
14e80 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
14e90 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
14ea0 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
14eb0 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
14ec0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
14ed0 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
14ee0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
14ef0 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
14f00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14f10 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
14f20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
14f30 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14f40 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
14f50 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
14f60 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
14f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14f80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
14f90 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
14fa0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
14fb0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20  ge(v);.      r1 
14fc0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
14fd0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
14fe0 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
14ff0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15000 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
15010 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
15020 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
15030 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
15040 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
15050 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  1, 0); VdbeCover
15060 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
15070 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15080 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
15090 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
150a0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
150b0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
150c0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
150d0 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
150e0 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
150f0 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
15100 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15110 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
15120 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15130 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
15140 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
15150 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15170 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15180 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
15190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
151a0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
151b0 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
151c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
151d0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
151e0 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
151f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15200 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  }..  explainComp
15210 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
15220 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
15230 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  2, p->op!=TK_ALL
15240 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );..  /* Compute
15250 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
15260 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
15270 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
15280 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
15290 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
152a0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
152b0 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
152c0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
152d0 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
152e0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
152f0 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
15300 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
15310 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
15320 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
15330 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
15340 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
15350 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
15360 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
15370 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
15380 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
15390 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
153a0 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
153b0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
153c0 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
153d0 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
153e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
153f0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
15400 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
15410 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
15440 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
15450 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
15460 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
15470 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
15480 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
15490 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
154a0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
154b0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
154c0 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
154d0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
154e0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
154f0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
15500 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
15510 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
15520 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
15530 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
15560 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
15570 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
15580 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  t( p->pNext==0 )
15590 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e  ;.    nCol = p->
155a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
155b0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
155c0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
155d0 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  c(db, nCol, 1);.
155e0 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
155f0 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
15600 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15610 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
15620 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
15630 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
15640 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
15650 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
15660 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
15670 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
15680 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
15690 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
156a0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
156b0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
156c0 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  *apColl = db->pD
156d0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
156e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
156f0 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
15700 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
15710 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
15720 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
15730 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
15740 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
15750 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
15760 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
15770 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
15780 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
15790 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
157a0 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
157b0 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
157c0 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
157d0 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
157e0 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
157f0 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
15800 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15810 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
15820 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
15830 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15850 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15860 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
15870 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
15880 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15890 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  4(v, addr, (char
158a0 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
158b0 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20  Ref(pKeyInfo),. 
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
158e0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
158f0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
15900 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
15910 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
15920 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
15930 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
15940 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
15950 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53  end:.  pDest->iS
15960 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  dst = dest.iSdst
15970 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  ;.  pDest->nSdst
15980 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20   = dest.nSdst;. 
15990 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
159a0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65  lete(db, pDelete
159b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
159c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
159d0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
159e0 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
159f0 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
15a00 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
15a10 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
15a20 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
15a30 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
15a40 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
15a50 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
15a60 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
15a70 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
15a80 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
15a90 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
15aa0 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
15ab0 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
15ac0 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
15ad0 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
15ae0 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
15af0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
15b00 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
15b10 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
15b20 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
15b30 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
15b40 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
15b50 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
15b60 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
15b70 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
15b80 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
15b90 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
15ba0 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
15bb0 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
15bc0 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
15bd0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
15be0 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
15bf0 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
15c00 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
15c10 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
15c20 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
15c30 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
15c40 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
15c50 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
15c60 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
15c70 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
15c80 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
15c90 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
15ca0 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
15cb0 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
15cc0 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
15cd0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
15ce0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
15cf0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d10 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
15d20 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
15d30 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
15d40 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
15d50 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
15d60 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15d70 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
15d80 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
15d90 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
15da0 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
15db0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
15dc0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
15dd0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
15de0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
15df0 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
15e00 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
15e10 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
15e20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
15e30 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
15e40 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
15e50 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
15e60 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
15e70 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
15e80 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
15e90 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
15ea0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
15eb0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
15ec0 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
15ed0 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
15ee0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15ef0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15f00 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
15f10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15f20 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
15f30 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
15f40 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
15f50 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
15f60 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
15f70 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
15f80 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
15f90 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
15fa0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
15fb0 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
15fc0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15fd0 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
15fe0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15ff0 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
16000 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
16010 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
16040 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
16050 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
16060 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
16070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16080 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b  (v, OP_Jump, j2+
16090 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32  2, iContinue, j2
160a0 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
160b0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
160c0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
160d0 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   j1);.    sqlite
160e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
160f0 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64  P_Copy, pIn->iSd
16100 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
16110 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20  In->nSdst-1);.  
16120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16130 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
16140 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
16150 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
16160 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16170 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
16180 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
16190 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65  e first OFFSET e
161a0 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20  ntries if there 
161b0 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  is an OFFSET cla
161c0 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f  use.  */.  codeO
161d0 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
161e0 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
161f0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ..  switch( pDes
16200 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
16210 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
16220 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
16230 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
16240 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16250 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
16260 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
16270 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
16280 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16290 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
162a0 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
162b0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
162c0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65  Parse);.      te
162d0 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65  stcase( pDest->e
162e0 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
162f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16300 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  e( pDest->eDest=
16310 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
16320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16330 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
16340 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
16350 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
16360 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
16370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16380 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
16390 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
163a0 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
163b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
163c0 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
163d0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72  ->iSDParm, r1, r
163e0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
163f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
16400 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
16410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16420 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16430 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
16440 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16450 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16460 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16470 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
16480 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16490 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
164a0 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
164b0 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
164c0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
164d0 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
164e0 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
164f0 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
16500 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
16510 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
16520 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
16530 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
16540 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
16550 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16560 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
16570 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
16580 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
16590 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  st==1 );.      p
165a0 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20  Dest->affSdst = 
165b0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
165c0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
165d0 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  (p->pEList->a[0]
165e0 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
165f0 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72  ffSdst);.      r
16600 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
16610 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16630 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
16640 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
16650 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65  dst, 1, r1, &pDe
16660 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a  st->affSdst,1);.
16670 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16680 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
16690 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
166a0 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  ->iSdst, 1);.   
166b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
166c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
166d0 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
166e0 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
166f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16700 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16710 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
16720 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f  .    }..#if 0  /
16730 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f  * Never occurs o
16740 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75  n an ORDER BY qu
16750 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  ery */.    /* If
16760 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
16770 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
16780 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
16790 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
167a0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
167b0 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
167c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
167d0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
167e0 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44  r, 1, pDest->iSD
167f0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
16800 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
16810 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
16820 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
16830 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
16840 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
16850 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16860 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
16870 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
16880 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
16890 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
168a0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
168b0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
168c0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
168d0 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
168e0 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
168f0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
16900 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
16910 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16920 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
16930 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20  rse->nErr>0 );  
16940 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
16950 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst!=1 );.     
16960 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16970 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
16980 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
16990 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
169a0 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
169b0 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
169c0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
169d0 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
169e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
169f0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
16a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16a10 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
16a20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
16a30 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
16a40 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16a50 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
16a60 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
16a70 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
16a80 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
16a90 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16aa0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
16ab0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
16ac0 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
16ad0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
16ae0 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
16af0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
16b00 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16b10 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
16b20 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
16b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16b40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
16b50 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
16b60 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
16b70 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16b90 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16ba0 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
16bb0 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
16bc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
16bd0 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
16be0 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
16bf0 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
16c00 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
16c10 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
16c20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16c30 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
16c40 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
16c50 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
16c60 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
16c70 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
16c80 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
16c90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
16ca0 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
16cb0 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
16cc0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
16cd0 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
16ce0 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
16cf0 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
16d00 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
16d10 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
16d20 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
16d30 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
16d40 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
16d50 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
16d60 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16d70 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
16d80 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
16d90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16da0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
16db0 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
16dc0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
16dd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16de0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
16df0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
16e00 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16e10 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
16e20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16e30 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
16e40 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
16e50 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
16e60 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
16e70 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
16e80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16e90 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
16ea0 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  umpZero, p->iLim
16eb0 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
16ec0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16ed0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
16ee0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
16ef0 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
16f00 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
16f10 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
16f20 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
16f30 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
16f40 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
16f50 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
16f60 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
16f70 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
16f80 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
16f90 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
16fa0 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
16fb0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
16fc0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
16fd0 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
16fe0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
16ff0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
17000 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
17010 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
17020 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
17030 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
17040 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
17050 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
17060 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
17070 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
17080 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
17090 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
170a0 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
170b0 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
170c0 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
170d0 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
170e0 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
170f0 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
17100 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
17110 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
17120 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
17130 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
17140 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
17150 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
17160 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
17170 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
17180 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
17190 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
171a0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
171b0 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
171c0 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
171d0 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
171e0 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
171f0 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
17200 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
17210 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
17220 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
17230 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
17240 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
17250 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
17260 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
17270 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
17280 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
17290 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
172a0 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
172b0 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
172c0 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
172d0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
172e0 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
172f0 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
17300 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
17310 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
17320 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
17330 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
17340 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
17350 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
17360 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
17370 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
17380 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
17390 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
173a0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
173b0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
173c0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
173d0 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
173e0 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
173f0 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
17400 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
17410 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
17420 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17430 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
17440 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
17450 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
17460 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
17470 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
17480 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
17490 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
174a0 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
174b0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
174c0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
174d0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
174e0 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
174f0 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
17500 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
17510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
17520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
17530 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
17540 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17550 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
17560 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
17570 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
17580 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17590 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
175a0 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
175b0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
175c0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
175d0 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
175e0 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
175f0 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
17600 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17610 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
17620 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
17630 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
17640 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
17650 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
17660 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
17670 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
17680 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
17690 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
176a0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
176b0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
176c0 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
176d0 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
176e0 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
176f0 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
17700 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
17710 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
17720 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
17730 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
17740 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
17750 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
17760 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
17770 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
17780 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
17790 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
177a0 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
177b0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
177c0 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
177d0 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
177e0 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
177f0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
17800 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
17810 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
17820 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
17830 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
17840 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
17850 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
17860 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
17870 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
17880 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
17890 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
178a0 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
178b0 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
178c0 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
178d0 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
178e0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
178f0 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
17900 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
17910 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
17920 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
17930 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
17940 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
17950 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
17960 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
17970 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
17980 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
17990 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
179a0 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
179b0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
179c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
179d0 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
179e0 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
179f0 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
17a00 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
17a10 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
17a20 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
17a30 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17a40 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
17a50 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17a60 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
17a70 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
17a80 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
17a90 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
17aa0 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
17ab0 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
17ac0 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
17ad0 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
17ae0 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
17af0 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
17b00 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
17b10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
17b20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
17b30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
17b40 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
17b50 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
17b60 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
17b70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
17b80 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
17b90 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
17ba0 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
17bb0 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
17bc0 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
17bd0 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
17be0 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
17bf0 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
17c00 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
17c10 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
17c20 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
17c30 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
17c40 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
17c50 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
17c60 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
17c70 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
17c80 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
17c90 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
17ca0 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
17cb0 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
17cc0 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
17cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17ce0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
17cf0 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
17d00 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
17d10 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
17d20 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
17d30 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
17d40 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
17d50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17d60 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
17d70 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
17d80 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
17d90 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
17da0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
17db0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
17dc0 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
17de0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
17df0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
17e00 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
17e10 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
17e20 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
17e30 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17e50 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
17e60 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
17e70 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
17e80 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
17e90 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
17ea0 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
17eb0 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
17ec0 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
17ed0 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
17ee0 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
17ef0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
17f00 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
17f10 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
17f20 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
17f30 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
17f40 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
17f50 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
17f60 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
17f70 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
17f80 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17f90 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
17fa0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
17fb0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
17fc0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17fd0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
17fe0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
17ff0 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
18000 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18010 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
18020 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
18030 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
18040 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
18050 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
18060 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
18070 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
18080 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
18090 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
180a0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
180b0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
180c0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
180d0 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
180e0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
180f0 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
18100 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18110 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
18120 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18130 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
18140 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
18150 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f  .  int addrEofA_
18160 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65  noB;     /* Alte
18170 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69  rnate addrEofA i
18180 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  f B is uninitial
18190 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ized */.  int ad
181a0 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
181b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
181c0 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
181d0 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
181e0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
181f0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18200 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
18210 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18220 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
18230 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18240 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
18250 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18260 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
18270 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18280 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
18290 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
182a0 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
182b0 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
182c0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
182d0 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
182e0 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
182f0 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
18300 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
18310 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
18320 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
18330 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
18340 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
18350 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
18360 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
18370 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
18380 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
18390 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
183a0 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
183b0 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
183c0 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
183d0 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
183e0 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
183f0 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
18400 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
18410 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
18420 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
18430 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
18440 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
18450 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
18460 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
18470 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
18480 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
18490 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
184a0 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
184b0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
184c0 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
184d0 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
184e0 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
184f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
18500 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
18510 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
18520 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
18530 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
18540 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
18550 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
18560 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
18570 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
18580 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
18590 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
185a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
185b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
185c0 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
185d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
185e0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
185f0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
18600 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18610 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18620 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
18630 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
18640 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
18650 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
18660 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
18670 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
18680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
18690 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
186a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
186b0 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
186c0 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
186d0 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
186e0 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
186f0 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
18700 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
18710 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
18720 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
18730 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
18740 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
18750 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
18760 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
18770 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
18780 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
18790 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
187a0 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
187b0 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
187c0 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
187d0 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
187e0 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
187f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18800 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
18810 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
18820 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18830 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
18840 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
18850 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
18860 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
18870 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
18880 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
18890 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
188a0 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
188b0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
188c0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
188d0 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
188e0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
188f0 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
18900 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
18910 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
18920 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
18930 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
18940 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
18950 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
18960 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
18970 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
18980 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
18990 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
189a0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
189b0 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
189c0 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
189d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
189e0 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
189f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
18a00 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18a10 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18a20 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
18a30 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
18a40 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
18a50 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
18a60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18a70 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
18a80 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
18a90 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
18aa0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
18ab0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
18ac0 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
18ad0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
18ae0 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
18af0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
18b00 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
18b10 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
18b20 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18b30 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18b40 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
18b50 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
18b60 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
18b70 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
18b80 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
18b90 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
18ba0 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
18bb0 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
18bc0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
18bd0 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
18be0 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
18bf0 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
18c00 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
18c10 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
18c20 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
18c30 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
18c40 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
18c50 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
18c60 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
18c70 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
18c80 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
18c90 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
18ca0 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
18cb0 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
18cc0 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
18cd0 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
18ce0 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
18cf0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
18d00 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
18d10 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
18d20 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
18d30 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
18d40 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
18d50 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
18d60 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
18d70 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
18d80 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
18d90 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
18da0 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79  of(int)*nOrderBy
18db0 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
18dc0 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
18dd0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18de0 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Item;.    for(i=
18df0 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
18e00 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79  y->a; i<nOrderBy
18e10 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
18e20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18e30 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18e40 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
18e50 20 2f 2a 20 61 73 73 65 72 74 28 20 70 49 74 65   /* assert( pIte
18e60 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18e70 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
18e80 45 78 70 72 20 29 20 69 73 20 61 6c 73 6f 20 74  Expr ) is also t
18e90 72 75 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 74  rue.      ** but
18ea0 20 6f 6e 6c 79 20 66 6f 72 20 77 65 6c 6c 2d 66   only for well-f
18eb0 6f 72 6d 65 64 20 53 45 4c 45 43 54 20 73 74 61  ormed SELECT sta
18ec0 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20  tements. */.    
18ed0 20 20 74 65 73 74 63 61 73 65 28 20 70 49 74 65    testcase( pIte
18ee0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18ef0 6f 6c 20 3e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol > p->pEList->
18f00 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
18f10 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
18f20 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
18f30 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  Col - 1;.    }. 
18f40 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d     pKeyMerge = m
18f50 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
18f60 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
18f70 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b   p, 1);.  }else{
18f80 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
18f90 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
18fa0 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  attach the ORDER
18fb0 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68   BY clause to th
18fc0 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
18fd0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
18fe0 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72  rderBy;.  pPrior
18ff0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
19000 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
19010 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
19020 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  erBy, 0);..  /* 
19030 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65  Allocate a range
19040 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65   of temporary re
19050 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
19060 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20  KeyInfo needed. 
19070 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69   ** for the logi
19080 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64  c that removes d
19090 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20  uplicate result 
190a0 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20  rows when the.  
190b0 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ** operator is U
190c0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
190d0 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20   INTERSECT (but 
190e0 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  not UNION ALL)..
190f0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
19100 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
19110 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Prev = 0;.  }els
19120 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  e{.    int nExpr
19130 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
19140 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
19150 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72   nOrderBy>=nExpr
19160 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
19170 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50  iled );.    regP
19180 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
19190 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
191a0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b  ->nMem += nExpr+
191b0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
191c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
191d0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
191e0 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
191f0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
19200 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
19210 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  , 1);.    if( pK
19220 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61  eyDup ){.      a
19230 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
19240 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
19250 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20  (pKeyDup) );.   
19260 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
19270 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
19280 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c     pKeyDup->aCol
19290 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
192a0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
192b0 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , p, i);.       
192c0 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f   pKeyDup->aSortO
192d0 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  rder[i] = 0;.   
192e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
192f0 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74  .  /* Separate t
19300 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20  he left and the 
19310 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d  right query from
19320 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a   one another.  *
19330 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
19340 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  0;.  pPrior->pNe
19350 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  xt = 0;.  sqlite
19360 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
19370 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
19380 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
19390 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72  DER");.  if( pPr
193a0 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
193b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
193c0 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
193d0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
193e0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
193f0 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d  y, "ORDER");.  }
19400 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
19410 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
19420 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
19430 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
19440 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
19450 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
19460 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
19470 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
19480 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
19490 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
194a0 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
194b0 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
194c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
194d0 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
194e0 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
194f0 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19520 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
19530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19540 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
19550 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
19560 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
19570 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
19580 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
19590 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
195a0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
195b0 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
195c0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
195d0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
195e0 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e  >pOffset);.  p->
195f0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  pOffset = 0;..  
19600 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
19610 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
19620 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65  AddrB = ++pParse
19630 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
19640 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
19650 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
19660 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19670 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
19680 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
19690 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
196a0 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
196b0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
196c0 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
196d0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
196e0 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
196f0 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
19700 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
19710 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
19720 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74  to the.  ** left
19730 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
19740 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20   operator - the 
19750 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  "A" select..  */
19760 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d  .  addrSelectA =
19770 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19780 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
19790 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
197a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
197b0 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
197c0 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53  gAddrA, 0, addrS
197d0 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43  electA);.  VdbeC
197e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74  omment((v, "left
197f0 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
19800 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
19810 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c  egLimitA;.  expl
19820 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
19830 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
19840 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
19850 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
19860 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
19870 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
19880 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19890 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  EndCoroutine, re
198a0 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
198b0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
198c0 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  , j1);..  /* Gen
198d0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
198e0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
198f0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
19900 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
19910 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
19920 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64  select.  */.  ad
19930 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69  drSelectB = sqli
19940 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
19950 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20  dr(v) + 1;.  j1 
19960 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19970 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
19980 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
19990 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  B, 0, addrSelect
199a0 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  B);.  VdbeCommen
199b0 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c  t((v, "right SEL
199c0 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c  ECT"));.  savedL
199d0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
199e0 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20  ;.  savedOffset 
199f0 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
19a00 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  p->iLimit = regL
19a10 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66  imitB;.  p->iOff
19a20 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70  set = 0;  .  exp
19a30 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
19a40 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
19a50 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
19a60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
19a70 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29  arse, p, &destB)
19a80 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
19a90 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
19aa0 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
19ab0 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
19ac0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
19ad0 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20  P_EndCoroutine, 
19ae0 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
19af0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
19b00 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
19b10 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
19b20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
19b30 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
19b40 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
19b50 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
19b60 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
19b70 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19b80 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
19b90 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
19ba0 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
19bb0 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
19bc0 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
19be0 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
19bf0 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
19c00 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
19c10 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
19c20 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
19c30 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
19c40 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
19c50 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
19c60 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
19c70 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
19c80 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
19c90 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
19ca0 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
19cb0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
19cc0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
19cd0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
19ce0 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
19cf0 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
19d00 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
19d10 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
19d20 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d40 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
19d50 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
19d60 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
19d70 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
19d80 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  belEnd);.  }.  s
19d90 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
19da0 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20  ef(pKeyDup);..  
19db0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
19dc0 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
19dd0 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
19de0 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
19df0 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
19e00 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
19e10 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
19e20 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
19e30 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
19e40 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
19e50 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
19e60 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41  A_noB = addrEofA
19e70 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d   = labelEnd;.  }
19e80 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
19e90 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
19ea0 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
19eb0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
19ec0 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
19ed0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
19ee0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
19ef0 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72  rOutB);.    addr
19f00 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74  EofA_noB = sqlit
19f10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19f20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
19f30 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  rB, labelEnd);. 
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
19f70 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
19f80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19f90 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f  _Goto, 0, addrEo
19fa0 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  fA);.    p->nSel
19fb0 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
19fc0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
19fd0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
19fe0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
19ff0 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1a000 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1a010 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t B.  ** are exh
1a020 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1a030 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41  data in select A
1a040 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1a050 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
1a060 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1a070 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41  rEofB = addrEofA
1a080 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65  ;.    if( p->nSe
1a090 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72  lectRow > pPrior
1a0a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
1a0b0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
1a0c0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1a0d0 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  w;.  }else{  .  
1a0e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1a0f0 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62  t((v, "eof-B sub
1a100 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1a110 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74  addrEofB = sqlit
1a120 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a130 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1a140 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1a150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a160 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1a170 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c   regAddrA, label
1a180 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61  End); VdbeCovera
1a190 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1a1a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a1b0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
1a1c0 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EofB);.  }..  /*
1a1d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1a1e0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1a1f0 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20  e of A<B.  */.  
1a200 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1a210 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72  (v, "A-lt-B subr
1a220 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
1a230 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAltB = sqlite3V
1a240 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a250 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
1a260 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c  addrOutA);.  sql
1a270 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a280 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1a290 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  ddrA, addrEofA);
1a2a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a2b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1a2c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1a2d0 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
1a2e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a2f0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1a300 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a  he case of A==B.
1a310 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1a320 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64  K_ALL ){.    add
1a330 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
1a340 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
1a350 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1a360 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1a370 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61   addrAltB;.    a
1a380 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c  ddrAltB++;.  }el
1a390 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  se{.    VdbeNoop
1a3a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65  Comment((v, "A-e
1a3b0 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  q-B subroutine")
1a3c0 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  );.    addrAeqB 
1a3d0 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  =.    sqlite3Vdb
1a3e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a3f0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1a400 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1a410 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1a420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a430 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1a440 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
1a450 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1a460 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1a470 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
1a480 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1a490 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
1a4a0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1a4b0 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
1a4c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1a4d0 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
1a4e0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1a4f0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1a500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a510 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1a520 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
1a530 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1a540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a550 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1a560 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1a570 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a590 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1a5a0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1a5b0 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e  /* This code run
1a5c0 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61  s once to initia
1a5d0 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e  lize everything.
1a5e0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1a5f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
1a600 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
1a610 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a620 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1a630 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64  ddrEofA_noB); Vd
1a640 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a660 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a670 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1a680 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1a690 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  e(v);..  /* Impl
1a6a0 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
1a6b0 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
1a6c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a6d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1a6e0 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
1a6f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1a700 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
1a710 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
1a720 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
1a730 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
1a740 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1a750 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
1a760 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64  iSdst, destB.iSd
1a770 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  st, nOrderBy,.  
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1a7a0 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
1a7b0 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
1a7c0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
1a7d0 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a  PFLAG_PERMUTE);.
1a7e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a7f0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
1a800 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
1a810 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56  qB, addrAgtB); V
1a820 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a830 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
1a840 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
1a850 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
1a860 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
1a870 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1a880 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1a890 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
1a8a0 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
1a8b0 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
1a8c0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  s.  */.  if( pDe
1a8d0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
1a8e0 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c  utput ){.    Sel
1a8f0 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50  ect *pFirst = pP
1a900 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  rior;.    while(
1a910 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
1a920 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
1a930 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67  t->pPrior;.    g
1a940 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
1a950 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
1a960 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
1a970 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d   }..  /* Reassem
1a980 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  bly the compound
1a990 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69   query so that i
1a9a0 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
1a9b0 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62  correctly.  ** b
1a9c0 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
1a9d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
1a9e0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
1a9f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1aa00 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69  lete(db, p->pPri
1aa10 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50  or);.  }.  p->pP
1aa20 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1aa30 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
1aa40 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a   p;..  /*** TBD:
1aa50 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74    Insert subrout
1aa60 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f  ine calls to clo
1aa70 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e  se cursors on in
1aa80 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20  complete.  **** 
1aa90 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f  subqueries ****/
1aaa0 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
1aab0 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
1aac0 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
1aad0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50   0);.  return pP
1aae0 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d  arse->nErr!=0;.}
1aaf0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
1ab00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1ab10 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1ab20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ab30 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72  MIT_VIEW)./* For
1ab40 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
1ab50 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
1ab60 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73   substExprList(s
1ab70 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73  qlite3*, ExprLis
1ab80 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73  t*, int, ExprLis
1ab90 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
1aba0 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c   substSelect(sql
1abb0 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c  ite3*, Select *,
1abc0 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a   int, ExprList *
1abd0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
1abe0 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
1abf0 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
1ac00 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
1ac10 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
1ac20 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
1ac30 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
1ac40 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
1ac50 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
1ac60 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
1ac70 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
1ac80 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
1ac90 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
1aca0 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
1acb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
1acc0 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
1acd0 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
1ace0 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
1acf0 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
1ad00 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
1ad10 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
1ad20 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
1ad30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1ad40 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
1ad50 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
1ad60 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
1ad70 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
1ad80 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
1ad90 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
1ada0 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
1adb0 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
1adc0 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
1add0 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
1ade0 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
1adf0 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
1ae00 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
1ae10 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
1ae20 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
1ae30 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  y..*/.static Exp
1ae40 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20  r *substExpr(.  
1ae50 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1ae60 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1ae70 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74  lloc errors to t
1ae80 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
1ae90 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
1aea0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
1aeb0 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
1aec0 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
1aed0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1aee0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1aef0 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
1af00 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1af10 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62  pEList    /* Sub
1af20 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69  stitute expressi
1af30 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ons */.){.  if( 
1af40 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
1af50 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1af60 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1af70 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
1af80 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==iTable ){.    
1af90 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
1afa0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
1afb0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
1afc0 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
1afd0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
1afe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1aff0 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
1b000 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74  ->iColumn<pEList
1b010 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1b020 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1b030 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
1b040 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
1b050 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
1b060 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1b070 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
1b080 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c  >iColumn].pExpr,
1b090 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1b0a0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1b0b0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70   pExpr);.      p
1b0c0 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
1b0d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1b0e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
1b0f0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
1b100 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  pr->pLeft, iTabl
1b110 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1b120 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
1b130 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
1b140 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
1b150 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b160 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1b170 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1b180 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1b190 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1b1a0 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  db, pExpr->x.pSe
1b1b0 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
1b1c0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  List);.    }else
1b1d0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1b1e0 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d  rList(db, pExpr-
1b1f0 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65  >x.pList, iTable
1b200 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
1b210 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
1b220 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
1b230 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1b240 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1b250 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
1b260 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
1b270 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c   here */.  ExprL
1b280 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
1b290 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20  /* List to scan 
1b2a0 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20  and in which to 
1b2b0 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73  make substitutes
1b2c0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1b2d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
1b2e0 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
1b2f0 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
1b300 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
1b310 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
1b320 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lues */.){.  int
1b330 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1b340 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1b350 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1b360 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1b370 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1b380 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1b390 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1b3a0 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
1b3b0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
1b3c0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
1b3d0 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  elect(.  sqlite3
1b3e0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
1b3f0 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
1b400 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
1b410 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1b420 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
1b430 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
1b440 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1b450 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
1b460 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1b470 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
1b480 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45   replaced */.  E
1b490 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1b4a0 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
1b4b0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
1b4c0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
1b4d0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1b4e0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1b4f0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20  int i;.  if( !p 
1b500 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
1b510 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
1b520 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
1b530 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
1b540 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
1b550 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
1b560 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
1b570 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b580 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
1b590 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b5a0 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  p->pHaving = sub
1b5b0 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
1b5c0 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70  aving, iTable, p
1b5d0 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68  EList);.  p->pWh
1b5e0 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
1b5f0 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69  db, p->pWhere, i
1b600 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b610 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
1b620 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61  , p->pPrior, iTa
1b630 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b640 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1b650 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
1b660 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28  ;  /* Even for (
1b670 53 45 4c 45 43 54 20 31 29 20 77 65 20 68 61 76  SELECT 1) we hav
1b680 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20 70  e: pSrc!=0 but p
1b690 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a  Src->nSrc==0 */.
1b6a0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
1b6b0 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  c) ){.    for(i=
1b6c0 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65  pSrc->nSrc, pIte
1b6d0 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20  m=pSrc->a; i>0; 
1b6e0 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
1b6f0 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1b700 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
1b710 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
1b720 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1b730 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1b740 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b750 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1b760 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b770 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1b780 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b790 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1b7a0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1b7b0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1b7c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b7d0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1b7e0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1b7f0 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1b800 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1b810 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1b820 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1b830 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1b840 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1b850 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1b860 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1b870 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1b880 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1b890 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1b8a0 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1b8b0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1b8c0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1b8d0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1b8e0 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1b8f0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1b900 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1b910 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1b920 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1b930 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1b940 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1b950 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1b960 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1b970 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1b980 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1b990 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1b9a0 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1b9b0 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1b9c0 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1b9d0 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1b9e0 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1b9f0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1ba00 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1ba10 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1ba20 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1ba30 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1ba40 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1ba50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ba60 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1ba70 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1ba80 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1ba90 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1baa0 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1bab0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1bac0 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1bad0 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1bae0 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1baf0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1bb00 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1bb10 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1bb20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1bb30 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1bb40 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1bb50 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1bb60 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1bb70 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1bb80 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1bb90 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1bba0 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1bbb0 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1bbc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1bbd0 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
1bbe0 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
1bbf0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1bc00 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1bc10 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
1bc20 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1bc30 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1bc40 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
1bc50 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
1bc60 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1bc70 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1bc80 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f 75 74   or (2a) the out
1bc90 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1bca0 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  a join.**       
1bcb0 20 61 6e 64 20 28 32 62 29 20 74 68 65 20 6f 75   and (2b) the ou
1bcc0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1bcd0 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1bce0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
1bcf0 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 46   one.**        F
1bd00 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1bd10 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63 61  ery that is a ca
1bd20 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c 61 74  ndidate for flat
1bd30 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69 73 0a  tening.  (2b is.
1bd40 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20 74 6f  **        due to
1bd50 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64   ticket [2f7170d
1bd60 37 33 62 66 39 61 62 66 38 30 5d 20 66 72 6f 6d  73bf9abf80] from
1bd70 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a   2015-02-09.).**
1bd80 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
1bd90 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
1bda0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1bdb0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1bdc0 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
1bdd0 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
1bde0 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
1bdf0 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  thened by ticket
1be00 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
1be10 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1be20 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
1be30 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
1be40 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
1be50 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
1be60 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
1be70 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
1be80 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
1be90 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
1bea0 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
1beb0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1bec0 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
1bed0 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
1bee0 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
1bef0 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
1bf00 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
1bf10 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
1bf20 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
1bf30 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1bf40 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
1bf50 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1bf60 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
1bf70 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1bf80 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1bf90 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
1bfa0 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1bfb0 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1bfc0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1bfd0 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1bfe0 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1bff0 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74  a FROM close wit
1c000 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1c010 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1c020 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1c030 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1c040 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1c050 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1c060 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1c070 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
1c080 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c090 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1c0a0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1c0b0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
1c0c0 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
1c0d0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1c0e0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1c0f0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1c100 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
1c110 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
1c120 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72  .**  (**)  Restr
1c130 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20  iction (10) was 
1c140 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1c150 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32   code on 2005-02
1c160 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20  -05 but we.**   
1c170 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20       accidently 
1c180 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d  carried the comm
1c190 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69  ent forward unti
1c1a0 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f  l 2014-09-15.  O
1c1b0 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
1c1c0 20 20 74 65 78 74 3a 20 22 54 68 65 20 73 75 62    text: "The sub
1c1d0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c1e0 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
1c1f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c200 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
1c210 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a      use LIMIT.".
1c220 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
1c230 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
1c240 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1c250 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
1c260 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
1c270 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f  .**.**  (**)  No
1c280 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20  t implemented.  
1c290 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65  Subsumed into re
1c2a0 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20  striction (3).  
1c2b0 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  Was previously.*
1c2c0 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72  *        a separ
1c2d0 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20  ate restriction 
1c2e0 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69  deriving from ti
1c2f0 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a  cket #350..**.**
1c300 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
1c310 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
1c320 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1c330 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
1c340 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
1c350 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c360 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  se OFFSET..**.**
1c370 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65    (15)  The oute
1c380 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70  r query is not p
1c390 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
1c3a0 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a  d select or the.
1c3b0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
1c3c0 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ry does not have
1c3d0 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
1c3e0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
1c3f0 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
1c400 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
1c410 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
1c420 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  6)  The outer qu
1c430 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1c440 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73  gregate or the s
1c450 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20  ubquery does.** 
1c460 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61         not conta
1c470 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  in ORDER BY.  (T
1c480 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
1c490 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
1c4a0 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
1c4b0 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
1c4c0 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
1c4d0 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
1c4e0 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
1c4f0 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  The sub-query is
1c500 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   not a compound 
1c510 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73  select, or it is
1c520 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a   a UNION ALL .**
1c530 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
1c540 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20   clause made up 
1c550 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d  entirely of non-
1c560 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1c570 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  s, and .**      
1c580 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65    the parent que
1c590 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
1c5a0 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65     * is not itse
1c5b0 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  lf part of a com
1c5c0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a  pound select,.**
1c5d0 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1c5e0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1c5f0 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
1c600 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  y, and.**       
1c610 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f     * is not a jo
1c620 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  in.**.**        
1c630 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
1c640 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
1c650 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
1c660 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
1c670 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
1c680 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
1c690 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
1c6a0 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
1c6b0 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
1c6c0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
1c6d0 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62  lauses.  The sub
1c6e0 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65  query cannot use
1c6f0 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1c700 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1c710 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
1c720 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c  N ALL because al
1c730 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70  l the other comp
1c740 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1c750 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e  perators have an
1c760 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43   implied DISTINC
1c770 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c  T which is disal
1c780 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  lowed by.**     
1c790 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28     restriction (
1c7a0 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  4)..**.**       
1c7b0 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70   Also, each comp
1c7c0 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62  onent of the sub
1c7d0 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75  -query must retu
1c7e0 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  rn the same numb
1c7f0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20  er.**        of 
1c800 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20  result columns. 
1c810 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79  This is actually
1c820 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66   a requirement f
1c830 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  or any compound.
1c840 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1c850 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
1c860 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72  all the code her
1c870 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  e does is make s
1c880 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20  ure that no.**  
1c890 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65        such (ille
1c8a0 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69  gal) sub-query i
1c8b0 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65  s flattened. The
1c8c0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74   caller will det
1c8d0 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ect the.**      
1c8e0 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61    syntax error a
1c8f0 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61  nd return a deta
1c900 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  iled message..**
1c910 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
1c920 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1c930 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1c940 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
1c950 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
1c960 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
1c970 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
1c980 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
1c990 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
1c9a0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
1c9b0 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1c9c0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54  ..**.**  (19)  T
1c9d0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c9e0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1c9f0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1ca00 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
1ca10 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52       have a WHER
1ca20 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
1ca30 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75   (20)  If the su
1ca40 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1ca50 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1ca60 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75  en it must not u
1ca70 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20  se.**        an 
1ca80 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1ca90 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20    Ticket #3773. 
1caa0 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20   We could relax 
1cab0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a  this constraint.
1cac0 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68  **        somewh
1cad0 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61  at by saying tha
1cae0 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  t the terms of t
1caf0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1cb00 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20  se must.**      
1cb10 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f    appear as unmo
1cb20 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f  dified result co
1cb30 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74  lumns in the out
1cb40 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77  er query.  But w
1cb50 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  e.**        have
1cb60 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
1cb70 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20  ions in mind to 
1cb80 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63  deal with that c
1cb90 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29  ase..**.**  (21)
1cba0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1cbb0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1cbc0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1cbd0 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
1cbe0 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20        DISTINCT. 
1cbf0 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35   (See ticket [75
1cc00 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a  2e1646fc])..**.*
1cc10 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62  *  (22)  The sub
1cc20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72  query is not a r
1cc30 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a  ecursive CTE..**
1cc40 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20 70  .**  (23)  The p
1cc50 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72  arent is not a r
1cc60 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72  ecursive CTE, or
1cc70 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1cc80 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20  s not a.**      
1cc90 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79    compound query
1cca0 2e 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69  . This restricti
1ccb0 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72  on is because tr
1ccc0 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a  ansforming the.*
1ccd0 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20  *        parent 
1cce0 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  to a compound qu
1ccf0 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65  ery confuses the
1cd00 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c   code that handl
1cd10 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63  es.**        rec
1cd20 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69  ursive queries i
1cd30 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e  n multiSelect().
1cd40 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68  .**.**  (24)  Th
1cd50 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1cd60 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74  t an aggregate t
1cd70 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69  hat uses the bui
1cd80 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a  lt-in min() or .
1cd90 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78  **        or max
1cda0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28  () functions.  (
1cdb0 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73  Without this res
1cdc0 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72  triction, a quer
1cdd0 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20  y like:.**      
1cde0 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d    "SELECT x FROM
1cdf0 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c   (SELECT max(y),
1ce00 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75   x FROM t1)" wou
1ce10 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  ld not necessari
1ce20 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74  ly.**        ret
1ce30 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20  urn the value X 
1ce40 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20  for which Y was 
1ce50 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a  maximal.).**.**.
1ce60 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
1ce70 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
1ce80 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
1ce90 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
1cea0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
1ceb0 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
1cec0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
1ced0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1cee0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
1cef0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
1cf00 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
1cf10 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1cf20 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1cf30 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1cf40 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1cf50 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
1cf60 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1cf70 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
1cf80 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
1cf90 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
1cfa0 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
1cfb0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
1cfc0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
1cfd0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
1cfe0 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
1cff0 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
1d000 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
1d010 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
1d020 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1d030 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
1d040 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
1d050 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
1d060 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
1d070 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1d080 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1d090 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d0a0 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
1d0b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1d0c0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1d0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1d0e0 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
1d0f0 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
1d100 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
1d110 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
1d120 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
1d130 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
1d140 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1d150 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
1d160 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
1d170 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
1d180 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
1d190 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1d1a0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1d1b0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
1d1c0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
1d1d0 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
1d1e0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
1d1f0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
1d200 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1d210 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
1d220 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
1d230 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
1d240 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
1d250 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
1d260 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
1d270 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1d280 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
1d290 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1d2a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d2b0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1d2c0 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
1d2d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1d2e0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1d2f0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1d300 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
1d310 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
1d320 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
1d330 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
1d340 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1d350 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
1d360 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
1d370 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
1d380 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1d390 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1d3a0 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
1d3b0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
1d3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d3d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1d3e0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1d3f0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
1d400 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
1d410 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1d420 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d430 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
1d440 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
1d450 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1d460 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
1d470 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
1d480 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
1d490 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
1d4a0 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
1d4b0 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
1d4c0 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
1d4d0 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1d4e0 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
1d4f0 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
1d500 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ner) ) return 0;
1d510 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1d520 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1d530 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
1d540 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
1d550 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
1d560 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
1d570 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
1d580 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
1d590 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
1d5a0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1d5b0 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
1d5c0 29 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  );.  if( subquer
1d5d0 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66  yIsAgg ){.    if
1d5e0 28 20 69 73 41 67 67 20 29 20 72 65 74 75 72 6e  ( isAgg ) return
1d5f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d610 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d620 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20 20 20 69  n (1)   */.    i
1d630 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  f( pSrc->nSrc>1 
1d640 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1d670 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20 20 20  on (2a)  */.    
1d680 69 66 28 20 28 70 2d 3e 70 57 68 65 72 65 20 26  if( (p->pWhere &
1d690 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
1d6a0 79 28 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f 53  y(p->pWhere,EP_S
1d6b0 75 62 71 75 65 72 79 29 29 0a 20 20 20 20 20 7c  ubquery)).     |
1d6c0 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69  | (sqlite3ExprLi
1d6d0 73 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69 73  stFlags(p->pELis
1d6e0 74 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79  t) & EP_Subquery
1d6f0 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73 71  )!=0.     || (sq
1d700 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
1d710 67 73 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 20  gs(p->pOrderBy) 
1d720 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d  & EP_Subquery)!=
1d730 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  0.    ){.      r
1d740 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d770 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1d780 20 28 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d 0a   (2b)  */.    }.
1d790 20 20 7d 0a 20 20 20 20 0a 20 20 70 53 75 62 53    }.    .  pSubS
1d7a0 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
1d7b0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
1d7c0 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
1d7d0 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
1d7e0 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
1d7f0 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
1d800 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
1d810 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
1d820 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1d830 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
1d840 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
1d850 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
1d860 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
1d870 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
1d880 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
1d890 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
1d8a0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1d8b0 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
1d8c0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1d8d0 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
1d8e0 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
1d8f0 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
1d900 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
1d910 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1d920 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
1d930 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1d940 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d950 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
1d960 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
1d970 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d9a0 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
1d9b0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1d9c0 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64  gs & SF_Compound
1d9d0 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c  )!=0 && pSub->pL
1d9e0 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75  imit ){.    retu
1d9f0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1da30 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
1da40 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
1da50 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1da80 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
1da90 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1daa0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
1dab0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1dac0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dad0 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66  ion (5)  */.  if
1dae0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1daf0 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
1db00 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
1db10 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1db20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1db30 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20  ons (8)(9) */.  
1db40 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
1db50 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1db60 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65  ct)!=0 && subque
1db70 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
1db80 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1db90 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1dba0 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69   (6)  */.  }.  i
1dbb0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
1dbc0 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
1dbd0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1dbe0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc10 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
1dc20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
1dc30 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
1dc40 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
1dc50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc60 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1dc70 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (16) */.  if( pS
1dc80 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
1dc90 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
1dca0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dcb0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1dcc0 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (19) */.  if( pS
1dcd0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1dce0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1dcf0 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a  Distinct)!=0 ){.
1dd00 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1dd10 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1dd20 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20  ction (21) */.  
1dd30 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53  }.  testcase( pS
1dd40 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1dd50 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20  F_Recursive );. 
1dd60 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d   testcase( pSub-
1dd70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
1dd80 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69 66  inMaxAgg );.  if
1dd90 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1dda0 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65   & (SF_Recursive
1ddb0 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29  |SF_MinMaxAgg) )
1ddc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1ddd0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
1dde0 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a 2f  (22) and (24) */
1ddf0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1de00 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
1de10 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62 2d  ursive) && pSub-
1de20 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
1de30 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74  eturn 0; /* Rest
1de40 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a  riction (23) */.
1de50 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45    }..  /* OBSOLE
1de60 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20  TE COMMENT 1:.  
1de70 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  ** Restriction 3
1de80 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1de90 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
1dea0 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1deb0 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
1dec0 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
1ded0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1dee0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
1def0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
1df00 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
1df10 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1df20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1df30 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
1df40 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
1df50 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
1df60 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
1df70 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
1df80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
1df90 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1dfa0 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
1dfb0 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
1dfc0 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
1dfd0 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
1dfe0 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    ** OBSOLETE CO
1dff0 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65  MMENT 2:.  ** Re
1e000 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
1e010 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1e020 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1e030 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
1e040 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
1e050 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1e060 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
1e070 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
1e080 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
1e090 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
1e0a0 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1e0b0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1e0c0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
1e0d0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
1e0e0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
1e0f0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
1e100 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
1e110 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
1e120 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
1e130 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1e140 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
1e150 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
1e160 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
1e170 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
1e180 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
1e190 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
1e1a0 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
1e1b0 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
1e1c0 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
1e1d0 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a  NNER JOIN..  **.
1e1e0 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49    ** THIS OVERRI
1e1f0 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d  DES OBSOLETE COM
1e200 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42  MENTS 1 AND 2 AB
1e210 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74  OVE:.  ** Ticket
1e220 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61   #3300 shows tha
1e230 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  t flattening the
1e240 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
1e250 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
1e260 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20  is fraught with 
1e270 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f  danger.  Best to
1e280 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65   avoid the whole
1e290 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a   thing.  If the.
1e2a0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
1e2b0 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1e2c0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
1e2d0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74  then do not flat
1e2e0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ten..  */.  if( 
1e2f0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
1e300 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
1e310 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1e320 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
1e330 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66  striction 17: If
1e340 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1e350 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
1e360 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
1e370 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
1e380 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
1e390 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
1e3a0 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
1e3b0 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
1e3c0 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
1e3d0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
1e3e0 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
1e3f0 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
1e400 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
1e410 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
1e420 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
1e430 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
1e440 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
1e450 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1e460 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32  /* Restriction 2
1e470 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 */.    }.    i
1e480 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e  f( isAgg || (p->
1e490 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1e4a0 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
1e4b0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
1e4c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1e4d0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75     }.    for(pSu
1e4e0 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20  b1=pSub; pSub1; 
1e4f0 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72  pSub1=pSub1->pPr
1e500 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ior){.      test
1e510 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
1e520 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1e530 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1e540 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
1e550 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
1e560 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1e570 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1e580 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1e590 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
1e5a0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
1e5b0 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30  t( pSub->pSrc!=0
1e5c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
1e5d0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1e5e0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1e5f0 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a  _Aggregate))!=0.
1e600 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
1e610 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
1e620 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a  1->op!=TK_ALL) .
1e630 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d         || pSub1-
1e640 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20  >pSrc->nSrc<1.  
1e650 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45       || pSub->pE
1e660 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75  List->nExpr!=pSu
1e670 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
1e680 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  r.      ){.     
1e690 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1e6a0 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
1e6b0 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63  ase( pSub1->pSrc
1e6c0 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20  ->nSrc>1 );.    
1e6d0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
1e6e0 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20  ction 18. */.   
1e6f0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1e700 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
1e710 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
1e720 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  ; ii<p->pOrderBy
1e730 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
1e740 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
1e750 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75  OrderBy->a[ii].u
1e760 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
1e770 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1e780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e790 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20  .  /***** If we 
1e7a0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
1e7b0 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  , flattening is 
1e7c0 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a  permitted. *****
1e7d0 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  /.  SELECTTRACE(
1e7e0 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61  1,pParse,p,("fla
1e7f0 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20  tten %s.%p from 
1e800 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  term %d\n",.    
1e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e820 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70  Sub->zSelName, p
1e830 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20  Sub, iFrom));.. 
1e840 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68   /* Authorize th
1e850 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1e860 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1e870 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  text = pSubitem-
1e880 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e  >zName;.  TESTON
1e890 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41  LY(i =) sqlite3A
1e8a0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1e8b0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
1e8c0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74  0, 0, 0);.  test
1e8d0 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f  case( i==SQLITE_
1e8e0 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65  DENY );.  pParse
1e8f0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1e900 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
1e910 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  xt;..  /* If the
1e920 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1e930 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
1e940 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
1e950 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73  (by restrictions
1e960 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20  .  ** 17 and 18 
1e970 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62  above) it must b
1e980 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e  e a UNION ALL an
1e990 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  d the parent que
1e9a0 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65  ry must .  ** be
1e9b0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
1e9c0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
1e9d0 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46  CT <expr-list> F
1e9e0 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e  ROM (<sub-query>
1e9f0 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e  ) <where-clause>
1ea00 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c   .  **.  ** foll
1ea10 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45  owed by any ORDE
1ea20 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f  R BY, LIMIT and/
1ea30 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  or OFFSET clause
1ea40 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20  s. This block.  
1ea50 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63  ** creates N-1 c
1ea60 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
1ea70 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75  ent query withou
1ea80 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  t any ORDER BY, 
1ea90 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f  LIMIT or .  ** O
1eaa0 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e  FFSET clauses an
1eab0 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20  d joins them to 
1eac0 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69  the left-hand-si
1ead0 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  de of the origin
1eae0 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e  al.  ** using UN
1eaf0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1eb00 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
1eb10 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
1eb20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73  of simple.  ** s
1eb30 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
1eb40 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
1eb50 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a   sub-query..  **
1eb60 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20  .  ** Example:. 
1eb70 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1eb80 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20  ECT a+1 FROM (. 
1eb90 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1eba0 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T x FROM tab.  *
1ebb0 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
1ebc0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
1ebd0 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62  ELECT y FROM tab
1ebe0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
1ebf0 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1ec00 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
1ec10 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a  2) FROM tab2.  *
1ec20 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21  *     ) WHERE a!
1ec30 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  =5 ORDER BY 1.  
1ec40 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72  **.  ** Transfor
1ec50 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  med into:.  **. 
1ec60 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
1ec70 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1ec80 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E x+1!=5.  **   
1ec90 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1eca0 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20       SELECT y+1 
1ecb0 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79  FROM tab WHERE y
1ecc0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
1ecd0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1ece0 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
1ecf0 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48  )+1 FROM tab2 WH
1ed00 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d  ERE abs(z*2)+1!=
1ed10 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52  5.  **     ORDER
1ed20 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
1ed30 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65  We call this the
1ed40 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75   "compound-subqu
1ed50 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e  ery flattening".
1ed60 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62  .  */.  for(pSub
1ed70 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70  =pSub->pPrior; p
1ed80 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e  Sub; pSub=pSub->
1ed90 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
1eda0 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45  ect *pNew;.    E
1edb0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1edc0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1edd0 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  .    Expr *pLimi
1ede0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
1edf0 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74     Expr *pOffset
1ee00 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
1ee10 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
1ee20 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
1ee30 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1ee40 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   0;.    p->pSrc 
1ee50 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  = 0;.    p->pPri
1ee60 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  or = 0;.    p->p
1ee70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
1ee80 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
1ee90 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1eea0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
1eeb0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1eec0 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
1eed0 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e  New, pSub->zSelN
1eee0 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66  ame);.    p->pOf
1eef0 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
1ef00 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
1ef10 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70  pLimit;.    p->p
1ef20 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1ef30 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  By;.    p->pSrc 
1ef40 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f  = pSrc;.    p->o
1ef50 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20  p = TK_ALL;.    
1ef60 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1ef70 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
1ef80 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c   pPrior;.    }el
1ef90 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
1efa0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1efb0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
1efc0 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  r ) pPrior->pNex
1efd0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  t = pNew;.      
1efe0 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pNew->pNext = p;
1eff0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
1f000 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53   = pNew;.      S
1f010 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50 61  ELECTTRACE(2,pPa
1f020 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20  rse,p,.         
1f030 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  ("compound-subqu
1f040 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63 72  ery flattener cr
1f050 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20 70  eates %s.%p as p
1f060 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  eer\n",.        
1f070 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c   pNew->zSelName,
1f080 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20   pNew));.    }. 
1f090 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1f0a0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1f0b0 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
1f0c0 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
1f0d0 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
1f0e0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
1f0f0 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
1f100 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1f110 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
1f120 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
1f130 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
1f140 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
1f150 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
1f160 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
1f170 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
1f180 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
1f190 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1f1a0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1f1b0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1f1c0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1f1d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
1f1e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1f1f0 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
1f200 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
1f210 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
1f220 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
1f230 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
1f240 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
1f250 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
1f260 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
1f270 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
1f280 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
1f290 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
1f2a0 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
1f2b0 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
1f2c0 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
1f2d0 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
1f2e0 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
1f2f0 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
1f300 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
1f310 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
1f320 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
1f330 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
1f340 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
1f350 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
1f360 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
1f370 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
1f380 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
1f390 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
1f3a0 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
1f3b0 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
1f3c0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
1f3d0 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
1f3e0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
1f3f0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1f400 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
1f410 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1f420 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1f430 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1f440 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
1f450 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
1f460 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1f470 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
1f480 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
1f490 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
1f4a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
1f4b0 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b  abToDel->nRef--;
1f4c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
1f4d0 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
1f4e0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1f4f0 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
1f500 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1f510 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
1f520 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
1f530 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
1f540 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
1f550 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
1f560 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
1f570 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
1f580 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
1f590 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
1f5a0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
1f5b0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
1f5c0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
1f5d0 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
1f5e0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
1f5f0 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
1f600 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
1f610 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
1f620 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1f630 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
1f640 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1f650 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
1f660 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
1f670 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
1f680 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
1f690 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
1f6a0 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
1f6b0 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
1f6c0 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
1f6d0 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
1f6e0 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
1f6f0 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
1f700 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
1f710 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
1f720 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
1f730 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
1f740 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
1f750 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
1f760 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
1f770 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
1f780 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
1f790 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
1f7a0 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
1f7b0 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
1f7c0 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
1f7d0 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
1f7e0 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
1f7f0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
1f800 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
1f810 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
1f820 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
1f830 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1f840 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
1f850 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
1f860 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
1f870 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
1f880 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
1f890 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
1f8a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1f8b0 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
1f8c0 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
1f8d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1f8e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f8f0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
1f900 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1f910 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
1f920 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
1f930 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1f940 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
1f950 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  e = pSubitem->jo
1f960 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
1f970 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1f980 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
1f990 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
1f9a0 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
1f9b0 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
1f9c0 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
1f9d0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
1f9e0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1f9f0 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
1fa00 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
1fa10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1fa20 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1fa30 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
1fa40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1fa50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1fa60 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fa70 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
1fa80 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1fa90 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
1faa0 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
1fab0 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
1fac0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
1fad0 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
1fae0 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
1faf0 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
1fb00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
1fb10 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1fb20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
1fb30 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
1fb40 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1fb50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
1fb60 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1fb70 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
1fb80 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
1fb90 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
1fba0 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
1fbb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1fbc0 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
1fbd0 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
1fbe0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
1fbf0 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
1fc00 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
1fc10 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
1fc20 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
1fc30 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
1fc40 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
1fc50 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
1fc60 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75  xpand the out qu
1fc70 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20  ery to 4 slots. 
1fc80 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20   The middle.    
1fc90 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  ** slot is expan
1fca0 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
1fcb0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
1fcc0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a  e space for the.
1fcd0 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65      ** two eleme
1fce0 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
1fcf0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1fd00 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
1fd10 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
1fd20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1fd30 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
1fd40 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1fd50 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
1fd60 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
1fd70 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
1fd80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1fd90 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1fda0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fdb0 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
1fdc0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1fdd0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
1fde0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1fdf0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1fe00 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1fe10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
1fe20 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1fe30 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1fe40 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
1fe50 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
1fe60 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
1fe70 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
1fe80 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1fe90 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
1fea0 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
1feb0 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
1fec0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
1fed0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
1fee0 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
1fef0 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
1ff00 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
1ff10 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
1ff20 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
1ff30 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
1ff40 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1ff50 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
1ff60 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
1ff70 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
1ff80 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1ff90 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
1ffa0 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
1ffb0 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
1ffc0 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
1ffd0 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
1ffe0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
1fff0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
20000 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
20010 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
20020 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
20030 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
20040 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
20050 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
20060 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20070 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
20080 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
20090 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
200a0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
200b0 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
200c0 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
200d0 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
200e0 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
200f0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
20100 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
20110 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
20120 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
20130 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
20140 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
20150 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
20160 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
20170 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
20180 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
20190 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
201a0 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73  bStrDup(db, pLis
201b0 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
201c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
201d0 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
201e0 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b         pList->a[
201f0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  i].zName = zName
20200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20210 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
20220 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
20230 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
20240 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
20250 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a     if( isAgg ){.
20260 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
20270 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
20280 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
20290 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
202a0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
202b0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
202c0 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
202d0 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
202e0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
202f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
20300 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
20310 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20   ){.      /* At 
20320 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20  this point, any 
20330 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42  non-zero iOrderB
20340 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64 69  yCol values indi
20350 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20  cate that the.  
20360 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
20370 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
20380 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74  n is identical t
20390 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43 6f  o the iOrderByCo
203a0 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65 78  l'th.      ** ex
203b0 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65  pression returne
203c0 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61 74  d by SELECT stat
203d0 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e 63  ement pSub. Sinc
203e0 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a 20  e these values. 
203f0 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e       ** do not n
20400 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65  ecessarily corre
20410 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73  spond to columns
20420 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65   in SELECT state
20430 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20 20  ment pParent,.  
20440 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d      ** zero them
20450 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72   before transfer
20460 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
20470 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a   clause..      *
20480 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64  *.      ** Not d
20490 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63 61  oing this may ca
204a0 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20  use an error if 
204b0 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  a subsequent cal
204c0 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20  l to this.      
204d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  ** function atte
204e0 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
204f0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  a compound sub-q
20500 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65 6e  uery into pParen
20510 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20  t.      ** (the 
20520 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63 61  only way this ca
20530 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20 74  n happen is if t
20540 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
20550 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20 2a  query is.      *
20560 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74  * currently part
20570 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29 2e   of pSub->pSrc).
20580 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31 31   See ticket [d11
20590 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20  a6e908f].  */.  
205a0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
205b0 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
205c0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 66  OrderBy;.      f
205d0 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
205e0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
205f0 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
20600 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  y->a[i].u.x.iOrd
20610 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  erByCol = 0;.   
20620 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
20630 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
20640 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
20650 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
20660 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20  Prior==0 );.    
20670 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65    pParent->pOrde
20680 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
20690 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64        pSub->pOrd
206a0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erBy = 0;.    }e
206b0 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d  lse if( pParent-
206c0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
206d0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
206e0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f  (db, pParent->pO
206f0 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
20700 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
20710 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
20720 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
20730 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
20740 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
20750 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29  pSub->pWhere, 0)
20760 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20770 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
20780 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62     }.    if( sub
20790 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
207a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
207b0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ent->pHaving==0 
207c0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
207d0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72  ->pHaving = pPar
207e0 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  ent->pWhere;.   
207f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
20800 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
20810 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
20820 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
20830 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
20840 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
20850 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
20860 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
20870 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
20880 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
20890 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20  t->pHaving, .   
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
208c0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
208d0 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c  , pSub->pHaving,
208e0 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65   0));.      asse
208f0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72  rt( pParent->pGr
20900 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
20910 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75    pParent->pGrou
20920 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
20930 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75  rListDup(db, pSu
20940 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b  b->pGroupBy, 0);
20950 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20960 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
20970 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  e = substExpr(db
20980 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
20990 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
209a0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
209b0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
209c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
209d0 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
209e0 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a  Where, pWhere);.
209f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
20a00 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
20a10 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
20a20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
20a30 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ner or the.    *
20a40 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
20a50 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20   distinct. .    
20a60 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  */.    pParent->
20a70 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62  selFlags |= pSub
20a80 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
20a90 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20  Distinct;.  .   
20aa0 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43   /*.    ** SELEC
20ab0 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
20ac0 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
20ad0 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
20ae0 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a   OFFSET y;.    *
20af0 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20  *.    ** One is 
20b00 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74  tempted to try t
20b10 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f  o add a and b to
20b20 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d   combine the lim
20b30 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20  its.  But this. 
20b40 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77     ** does not w
20b50 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69  ork if either li
20b60 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
20b70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20b80 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
20b90 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20ba0 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
20bb0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62  imit;.      pSub
20bc0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
20bd0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
20be0 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
20bf0 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
20c00 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
20c10 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
20c20 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
20c30 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
20c40 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66  db, pSub1);..#if
20c50 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
20c60 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
20c70 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
20c80 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c  0x100 ){.    sql
20c90 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
20ca0 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e  "After flattenin
20cb0 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  g:\n");.    sqli
20cc0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
20cd0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
20ce0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
20cf0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
20d00 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
20d10 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
20d20 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
20d30 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
20d40 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20  ./*.** Based on 
20d50 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
20d60 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
20d70 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
20d80 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  by the first.** 
20d90 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66  argument, this f
20da0 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
20db0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
20dc0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
20dd0 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20 63     * the query c
20de0 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73  ontains just a s
20df0 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65 20  ingle aggregate 
20e00 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20  function,.**    
20e10 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  * the aggregate 
20e20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68  function is eith
20e30 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  er min() or max(
20e40 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74  ), and.**    * t
20e50 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
20e60 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
20e70 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ction is a colum
20e80 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  n value..**.** I
20e90 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
20ea0 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68 65  ve are true, the
20eb0 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
20ec0 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
20ed0 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72  ERBY_MAX.** is r
20ee0 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f  eturned as appro
20ef0 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70  priate. Also, *p
20f00 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74  pMinMax is set t
20f10 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a  o point to the .
20f20 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d  ** list of argum
20f30 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74  ents passed to t
20f40 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65 66  he aggregate bef
20f50 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
20f60 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  *.** Or, if the 
20f70 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
20f80 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70   are not met, *p
20f90 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74  pMinMax is set t
20fa0 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45  o 0 and.** WHERE
20fb0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20  _ORDERBY_NORMAL 
20fc0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
20fd0 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78  static u8 minMax
20fe0 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70  Query(AggInfo *p
20ff0 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73  AggInfo, ExprLis
21000 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20  t **ppMinMax){. 
21010 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52   int eRet = WHER
21020 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
21030 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
21040 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
21050 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a   *ppMinMax = 0;.
21060 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
21070 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20  nFunc==1 ){.    
21080 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41  Expr *pExpr = pA
21090 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
210a0 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65  .pExpr; /* Aggre
210b0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
210c0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
210d0 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
210e0 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  .pList;      /* 
210f0 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67  Arguments to agg
21100 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
21110 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
21120 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
21130 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  TION );.    if( 
21140 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
21150 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ->nExpr==1 && pE
21160 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
21170 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
21180 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  UMN ){.      con
21190 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d  st char *zFunc =
211a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
211b0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
211c0 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
211d0 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20  , "min")==0 ){. 
211e0 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48         eRet = WH
211f0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
21200 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d  .        *ppMinM
21210 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  ax = pEList;.   
21220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
21230 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
21240 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a  c, "max")==0 ){.
21250 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
21260 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
21270 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
21280 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
21290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
212a0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69  .  assert( *ppMi
212b0 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d  nMax==0 || (*ppM
212c0 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31  inMax)->nExpr==1
212d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65   );.  return eRe
212e0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
212f0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
21300 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
21310 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
21320 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
21330 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ery..** The seco
21340 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
21350 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67  he associated ag
21360 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a  gregate-info obj
21370 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ect. This .** fu
21380 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
21390 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
213a0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
213b0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
213c0 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a  *) FROM <tbl>.**
213d0 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20  .** where table 
213e0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61  is a database ta
213f0 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73  ble, not a sub-s
21400 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49  elect or view. I
21410 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64  f the query.** d
21420 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70  oes match this p
21430 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70  attern, then a p
21440 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
21450 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
21460 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e  senting.** <tbl>
21470 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
21480 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
21490 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
214a0 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c  c Table *isSimpl
214b0 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70  eCount(Select *p
214c0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
214d0 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  nfo){.  Table *p
214e0 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  Tab;.  Expr *pEx
214f0 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  pr;..  assert( !
21500 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a  p->pGroupBy );..
21510 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
21520 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
21530 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d  xpr!=1 .   || p-
21540 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c  >pSrc->nSrc!=1 |
21550 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  | p->pSrc->a[0].
21560 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20  pSelect.  ){.   
21570 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
21580 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
21590 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45  >a[0].pTab;.  pE
215a0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
215b0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61  >a[0].pExpr;.  a
215c0 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21  ssert( pTab && !
215d0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26  pTab->pSelect &&
215e0 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28   pExpr );..  if(
215f0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
21600 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
21610 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
21620 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
21630 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
21640 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e  NEVER(pAggInfo->
21650 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75  nFunc==0) ) retu
21660 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67  rn 0;.  if( (pAg
21670 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
21680 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
21690 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55  &SQLITE_FUNC_COU
216a0 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  NT)==0 ) return 
216b0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
216c0 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63  flags&EP_Distinc
216d0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
216e0 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
216f0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
21700 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
21710 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
21720 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
21730 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
21740 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
21750 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
21760 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
21770 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
21780 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
21790 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
217a0 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
217b0 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
217c0 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
217d0 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
217e0 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
217f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
21800 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
21810 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
21820 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
21830 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
21840 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
21850 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
21860 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
21870 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
21880 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
21890 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20  om->zIndex ){.  
218a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
218b0 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
218c0 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20   char *zIndex = 
218d0 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20  pFrom->zIndex;. 
218e0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
218f0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
21900 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20  b->pIndex; .    
21910 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69      pIdx && sqli
21920 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d  te3StrICmp(pIdx-
21930 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b  >zName, zIndex);
21940 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70   .        pIdx=p
21950 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  Idx->pNext.    )
21960 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20  ;.    if( !pIdx 
21970 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21980 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21990 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
219a0 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29   %s", zIndex, 0)
219b0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
219c0 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
219d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
219e0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
219f0 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e  }.    pFrom->pIn
21a00 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
21a10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21a20 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65  OK;.}./*.** Dete
21a30 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  ct compound SELE
21a40 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  CT statements th
21a50 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20  at use an ORDER 
21a60 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a  BY clause with .
21a70 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  ** an alternativ
21a80 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
21a90 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  ence..**.**    S
21aa0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
21ab0 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
21ac0 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  ... FROM t2 ORDE
21ad0 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20  R BY .. COLLATE 
21ae0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ....**.** These 
21af0 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73  are rewritten as
21b00 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a   a subquery:.**.
21b10 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
21b20 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
21b30 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
21b40 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
21b50 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  2).**     ORDER 
21b60 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e  BY ... COLLATE .
21b70 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  ...**.** This tr
21b80 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
21b90 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
21ba0 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63  e the multiSelec
21bb0 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69  tOrderBy() routi
21bc0 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74  ne.** above that
21bd0 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
21be0 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ode for a compou
21bf0 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61  nd SELECT with a
21c00 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
21c10 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67  e.** uses a merg
21c20 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
21c30 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61   requires the sa
21c40 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
21c50 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  uence on the.** 
21c60 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61  result columns a
21c70 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s on the ORDER B
21c80 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74  Y clause.  See t
21c90 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f  icket.** http://
21ca0 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
21cb0 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64  rc/info/6709574d
21cc0 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  2a.**.** This tr
21cd0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
21ce0 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
21cf0 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43  EXCEPT, INTERSEC
21d00 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a  T, and UNION..**
21d10 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
21d20 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69  perator works fi
21d30 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c  ne with multiSel
21d40 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65  ectOrderBy() eve
21d50 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20  n when.** there 
21d60 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d  are COLLATE term
21d70 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
21d80 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
21d90 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
21da0 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
21db0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
21dc0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
21dd0 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20  int i;.  Select 
21de0 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
21df0 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *pX;.  sqlite3 *
21e00 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  db;.  struct Exp
21e10 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
21e20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72   SrcList *pNewSr
21e30 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c;.  Parse *pPar
21e40 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  se;.  Token dumm
21e50 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  y;..  if( p->pPr
21e60 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
21e70 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
21e80 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
21e90 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
21ea0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28  Continue;.  for(
21eb0 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d  pX=p; pX && (pX-
21ec0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
21ed0 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  X->op==TK_SELECT
21ee0 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  ); pX=pX->pPrior
21ef0 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20  ){}.  if( pX==0 
21f00 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
21f10 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e  tinue;.  a = p->
21f20 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66  pOrderBy->a;.  f
21f30 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79  or(i=p->pOrderBy
21f40 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b  ->nExpr-1; i>=0;
21f50 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
21f60 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73  [i].pExpr->flags
21f70 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20   & EP_Collate ) 
21f80 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
21f90 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52   i<0 ) return WR
21fa0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f  C_Continue;..  /
21fb0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
21fc0 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
21fd0 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f  eans the transfo
21fe0 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  rmation is requi
21ff0 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73  red. */..  pPars
22000 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
22010 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
22020 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
22030 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
22040 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
22050 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
22060 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
22070 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65   WRC_Abort;.  me
22080 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20  mset(&dummy, 0, 
22090 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a  sizeof(dummy));.
220a0 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69    pNewSrc = sqli
220b0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
220c0 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
220d0 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65  0,0,0,&dummy,pNe
220e0 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e  w,0,0);.  if( pN
220f0 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  ewSrc==0 ) retur
22100 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a  n WRC_Abort;.  *
22110 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e  pNew = *p;.  p->
22120 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a  pSrc = pNewSrc;.
22130 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71    p->pEList = sq
22140 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
22150 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
22160 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
22170 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d  K_ALL, 0));.  p-
22180 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
22190 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30  .  p->pWhere = 0
221a0 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
221b0 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
221c0 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70  pHaving = 0;.  p
221d0 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
221e0 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  0;.  p->pPrior =
221f0 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   0;.  p->pNext =
22200 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d   0;.  p->pWith =
22210 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   0;.  p->selFlag
22220 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e  s &= ~SF_Compoun
22230 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  d;.  assert( (p-
22240 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
22250 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a  onverted)==0 );.
22260 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
22270 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20   SF_Converted;. 
22280 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
22290 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e  Prior!=0 );.  pN
222a0 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ew->pPrior->pNex
222b0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77  t = pNew;.  pNew
222c0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
222d0 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
222e0 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
222f0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66  Continue;.}..#if
22300 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22310 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  _CTE./*.** Argum
22320 65 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68  ent pWith (which
22330 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f   may be NULL) po
22340 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64  ints to a linked
22350 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20   list of nested 
22360 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74  .** WITH context
22370 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f  s, from inner to
22380 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74   outermost. If t
22390 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
223a0 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20  ied by .** FROM 
223b0 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70  clause element p
223c0 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61  Item is really a
223d0 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78   common-table-ex
223e0 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a  pression (CTE) .
223f0 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  ** then return a
22400 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
22410 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66  CTE definition f
22420 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f  or that table. O
22430 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75  therwise.** retu
22440 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
22450 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  f a non-NULL val
22460 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ue is returned, 
22470 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74  set *ppContext t
22480 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57  o point to the W
22490 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ith.** object th
224a0 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
224b0 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a  CTE belongs to..
224c0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
224d0 20 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68   Cte *searchWith
224e0 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  (.  With *pWith,
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22500 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
22510 75 74 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c  utermost WITH cl
22520 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
22530 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
22540 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f  Item,     /* FRO
22550 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
22560 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20   to resolve */. 
22570 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78   With **ppContex
22580 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
22590 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c   /* OUT: WITH cl
225a0 61 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75  ause return valu
225b0 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
225c0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
225d0 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49  *zName;.  if( pI
225e0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
225f0 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49  0 && (zName = pI
22600 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  tem->zName)!=0 )
22610 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20  {.    With *p;. 
22620 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20     for(p=pWith; 
22630 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b  p; p=p->pOuter){
22640 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
22650 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
22660 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
22670 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22680 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
22690 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  p->a[i].zName)==
226a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
226b0 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20  ppContext = p;. 
226c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
226d0 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  &p->a[i];.      
226e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
226f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
22700 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65  ;.}../* The code
22710 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74   generator maint
22720 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20  ains a stack of 
22730 61 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75  active WITH clau
22740 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ses.** with the 
22750 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20  inner-most WITH 
22760 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20  clause being at 
22770 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
22780 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tack..**.** This
22790 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20   routine pushes 
227a0 74 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20  the WITH clause 
227b0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
227c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
227d0 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66   onto the top of
227e0 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61   the stack. If a
227f0 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73  rgument bFree is
22800 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73   true, then this
22810 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20  .** WITH clause 
22820 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f  will never be po
22830 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
22840 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
22850 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  e it.** should b
22860 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
22870 74 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  th the Parse obj
22880 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61  ect. In other ca
22890 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72  ses, when.** bFr
228a0 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20  ee==0, the With 
228b0 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66  object will be f
228c0 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
228d0 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73  the SELECT .** s
228e0 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68  tatement with wh
228f0 69 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69  ich it is associ
22900 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
22910 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61  lite3WithPush(Pa
22920 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74  rse *pParse, Wit
22930 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72  h *pWith, u8 bFr
22940 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62  ee){.  assert( b
22950 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61 72 73  Free==0 || pPars
22960 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20  e->pWith==0 );. 
22970 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
22980 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20    pWith->pOuter 
22990 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
229a0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
229b0 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
229c0 70 50 61 72 73 65 2d 3e 62 46 72 65 65 57 69 74  pParse->bFreeWit
229d0 68 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d 0a 7d  h = bFree;.  }.}
229e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
229f0 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
22a00 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72  argument pFrom r
22a10 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64  efers to a CTE d
22a20 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61  eclared by .** a
22a30 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20   WITH clause on 
22a40 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e  the stack curren
22a50 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  tly maintained b
22a60 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e  y the parser. An
22a70 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74  d,.** if current
22a80 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  ly processing a 
22a90 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  CTE expression, 
22aa0 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72  if it is a recur
22ab0 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  sive.** referenc
22ac0 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
22ad0 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   CTE..**.** If p
22ae0 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20  From falls into 
22af0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
22b00 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f  o categories abo
22b10 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a  ve, pFrom->pTab.
22b20 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
22b30 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  lds are populate
22b40 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
22b50 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
22b60 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d   check.** (pFrom
22b70 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65  ->pTab!=0) to de
22b80 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
22b90 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73  or not a success
22ba0 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73  ful match.** was
22bb0 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   found..**.** Wh
22bc0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d  ether or not a m
22bd0 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53  atch is found, S
22be0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
22bf0 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
22c00 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61  .** occurs. If a
22c10 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
22c20 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ur, an error mes
22c30 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
22c40 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20  n the.** parser 
22c50 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63  and some error c
22c60 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ode other than S
22c70 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
22c80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
22c90 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57   withExpand(.  W
22ca0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
22cb0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
22cc0 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b  t_item *pFrom.){
22cd0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
22ce0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
22cf0 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  se;.  sqlite3 *d
22d00 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
22d10 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
22d20 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
22d30 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45    /* Matched CTE
22d40 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20   (or NULL if no 
22d50 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68  match) */.  With
22d60 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20   *pWith;        
22d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
22d80 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20  ITH clause that 
22d90 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  pCte belongs to 
22da0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
22db0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
22dc0 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68  .  pCte = search
22dd0 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69  With(pParse->pWi
22de0 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74  th, pFrom, &pWit
22df0 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29  h);.  if( pCte )
22e00 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
22e10 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  b;.    ExprList 
22e20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c  *pEList;.    Sel
22e30 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53  ect *pSel;.    S
22e40 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20  elect *pLeft;   
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e60 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  Left-most SELECT
22e70 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
22e80 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73    int bMayRecurs
22e90 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ive;            
22ea0 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f  /* True if compo
22eb0 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e  und joined by UN
22ec0 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20  ION [ALL] */.   
22ed0 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74   With *pSavedWit
22ee0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
22ef0 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
22f00 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  of pParse->pWith
22f10 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   */..    /* If p
22f20 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 6e 6f 6e  Cte->zErr is non
22f30 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f  -NULL at this po
22f40 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69  int, then this i
22f50 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20  s an illegal.   
22f60 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65   ** recursive re
22f70 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70  ference to CTE p
22f80 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72  Cte. Leave an er
22f90 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ror in pParse an
22fa0 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
22fb0 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e  early. If pCte->
22fc0 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68  zErr is NULL, th
22fd0 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  en this is not a
22fe0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
22ff0 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  ence..    ** In 
23000 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65  this case, proce
23010 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
23020 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b 0a 20 20  pCte->zErr ){.  
23030 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
23040 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65  Msg(pParse, pCte
23050 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e  ->zErr, pCte->zN
23060 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
23070 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
23080 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
23090 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
230a0 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 );.    pFrom-
230b0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
230c0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
230d0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
230e0 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ble));.    if( p
230f0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
23100 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70  WRC_Abort;.    p
23110 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
23120 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
23130 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
23140 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
23150 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
23160 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61  ey = -1;.    pTa
23170 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
23180 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
23190 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
231a0 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
231b0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
231c0 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
231d0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
231e0 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
231f0 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  ctDup(db, pCte->
23200 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
23210 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
23220 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
23230 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
23240 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
23250 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
23260 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
23270 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
23280 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
23290 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
232a0 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
232b0 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
232c0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
232d0 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
232e0 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
232f0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
23300 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
23310 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
23320 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
23330 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
23340 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
23350 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
23360 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
23370 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
23380 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
23390 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
233a0 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
233b0 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
233c0 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
233d0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
233e0 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
233f0 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
23400 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
23410 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
23420 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
23430 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 52        pItem->isR
23440 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
23450 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
23460 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
23470 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSel->selFlags |
23480 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a  = SF_Recursive;.
23490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
234a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
234b0 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69  Only one recursi
234c0 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ve reference is 
234d0 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20  permitted. */ . 
234e0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65     if( pTab->nRe
234f0 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  f>2 ){.      sql
23500 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20  ite3ErrorMsg(.  
23510 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
23520 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65  "multiple refere
23530 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76  nces to recursiv
23540 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43  e table: %s", pC
23550 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  te->zName.      
23560 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23570 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
23580 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
23590 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c  pTab->nRef==1 ||
235a0 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67   ((pSel->selFlag
235b0 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  s&SF_Recursive) 
235c0 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32  && pTab->nRef==2
235d0 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
235e0 7a 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72  zErr = "circular
235f0 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b   reference: %s";
23600 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20  .    pSavedWith 
23610 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
23620 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
23630 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
23640 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
23650 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52  t(pWalker, bMayR
23660 65 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d  ecursive ? pSel-
23670 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b  >pPrior : pSel);
23680 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d  ..    for(pLeft=
23690 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72  pSel; pLeft->pPr
236a0 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74  ior; pLeft=pLeft
236b0 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70  ->pPrior);.    p
236c0 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  EList = pLeft->p
236d0 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  EList;.    if( p
236e0 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20  Cte->pCols ){.  
236f0 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
23700 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  & pEList->nExpr!
23710 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45  =pCte->pCols->nE
23720 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
23730 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
23740 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
23750 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66   has %d values f
23760 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a  or %d columns",.
23770 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65              pCte
23780 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d  ->zName, pEList-
23790 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43  >nExpr, pCte->pC
237a0 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ols->nExpr.     
237b0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50     );.        pP
237c0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
237d0 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20  avedWith;.      
237e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
237f0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
23800 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43       pEList = pC
23810 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d  te->pCols;.    }
23820 0a 0a 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75  ..    selectColu
23830 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
23840 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
23850 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
23860 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->aCol);.    i
23870 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
23880 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
23890 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
238a0 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
238b0 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72         pCte->zEr
238c0 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  r = "multiple re
238d0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
238e0 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  es: %s";.      }
238f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
23900 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65 63 75  te->zErr = "recu
23910 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
23920 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25  in a subquery: %
23930 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s";.      }.    
23940 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
23950 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
23960 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  l);.    }.    pC
23970 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a 20 20  te->zErr = 0;.  
23980 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
23990 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
239a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
239b0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
239c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
239d0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49  OMIT_CTE./*.** I
239e0 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73  f the SELECT pas
239f0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
23a00 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  d argument has a
23a10 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54  n associated WIT
23a20 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f  H .** clause, po
23a30 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74  p it from the st
23a40 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61  ack stored as pa
23a50 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20  rt of the Parse 
23a60 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
23a70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
23a80 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65  sed as the xSele
23a90 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61  ctCallback2() ca
23aa0 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c  llback by.** sql
23ab0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
23ac0 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20  () when walking 
23ad0 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f  a SELECT tree to
23ae0 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a   resolve table.*
23af0 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65  * names and othe
23b00 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  r FROM clause el
23b10 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74  ements. .*/.stat
23b20 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f  ic void selectPo
23b30 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57  pWith(Walker *pW
23b40 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
23b50 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
23b60 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
23b70 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70 57  arse;.  With *pW
23b80 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d  ith = findRightm
23b90 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20  ost(p)->pWith;. 
23ba0 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b   if( pWith!=0 ){
23bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
23bc0 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74  rse->pWith==pWit
23bd0 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  h );.    pParse-
23be0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e  >pWith = pWith->
23bf0 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65  pOuter;.  }.}.#e
23c00 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65  lse.#define sele
23c10 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64  ctPopWith 0.#end
23c20 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
23c30 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
23c40 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
23c50 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
23c60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
23c70 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
23c80 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
23c90 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
23ca0 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
23cb0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
23cc0 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
23cd0 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
23ce0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
23cf0 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
23d00 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
23d10 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
23d20 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
23d30 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
23d40 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
23d50 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
23d60 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
23d70 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
23d80 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
23d90 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
23da0 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
23db0 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
23dc0 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
23dd0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
23de0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
23df0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
23e00 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
23e10 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
23e20 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
23e30 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
23e40 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
23e50 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
23e60 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
23e70 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
23e80 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
23e90 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
23ea0 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74  g up the persist
23eb0 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
23ec0 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
23ed0 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
23ee0 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
23ef0 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
23f00 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d  clause to accomm
23f10 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
23f20 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
23f30 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
23f40 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
23f50 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
23f60 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
23f70 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
23f80 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
23f90 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
23fa0 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
23fb0 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
23fc0 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
23fd0 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
23fe0 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
23ff0 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
24000 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
24010 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
24020 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
24030 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
24040 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
24050 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
24060 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
24070 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
24080 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
24090 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
240a0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
240b0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
240c0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
240d0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
240e0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
240f0 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
24100 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
24110 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
24120 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
24130 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
24140 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52  .  Expr *pE, *pR
24150 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20  ight, *pExpr;.  
24160 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70  u16 selFlags = p
24170 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70  ->selFlags;..  p
24180 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
24190 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28  _Expanded;.  if(
241a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
241b0 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
241c0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
241d0 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
241e0 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46  Src==0) || (selF
241f0 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
24200 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
24210 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
24220 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
24230 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
24240 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
24250 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 78    if( pWalker->x
24260 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 3d  SelectCallback2=
24270 3d 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 29  =selectPopWith )
24280 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74  {.    sqlite3Wit
24290 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 66 69  hPush(pParse, fi
242a0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
242b0 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a  pWith, 0);.  }..
242c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
242d0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
242e0 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
242f0 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
24300 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
24310 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
24320 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
24330 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
24340 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
24350 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
24360 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
24370 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
24380 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
24390 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
243a0 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
243b0 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
243c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
243d0 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
243e0 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
243f0 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
24400 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
24410 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
24420 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
24430 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
24440 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
24450 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
24460 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
24470 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
24480 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
24490 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
244a0 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69  pFrom->isRecursi
244b0 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e  ve==0 || pFrom->
244c0 70 54 61 62 20 29 3b 0a 20 20 20 20 69 66 28 20  pTab );.    if( 
244d0 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69  pFrom->isRecursi
244e0 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ve ) continue;. 
244f0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
24500 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
24510 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
24520 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
24530 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
24540 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
24550 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
24560 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
24570 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 23  ssert( i==0 );.#
24580 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24590 49 54 5f 43 54 45 0a 20 20 20 20 20 20 73 65 6c  IT_CTE.      sel
245a0 65 63 74 50 6f 70 57 69 74 68 28 70 57 61 6c 6b  ectPopWith(pWalk
245b0 65 72 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20  er, p);.#endif. 
245c0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
245d0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66  Prune;.    }.#if
245e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
245f0 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74  _CTE.    if( wit
24600 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c  hExpand(pWalker,
24610 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
24620 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
24630 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
24640 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  ) {} else.#endif
24650 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
24660 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
24670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24680 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
24690 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
246a0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
246b0 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
246c0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
246d0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
246e0 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
246f0 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
24700 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
24710 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
24720 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
24730 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
24740 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72  r, pSel) ) retur
24750 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
24760 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
24770 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
24780 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
24790 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
247a0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
247b0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
247c0 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62  bort;.      pTab
247d0 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
247e0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
247f0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
24800 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70  b, "sqlite_sq_%p
24810 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
24820 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
24830 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
24840 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
24850 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63  r; }.      selec
24860 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
24870 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
24880 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  l->pEList, &pTab
24890 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
248a0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
248b0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
248c0 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
248d0 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
248e0 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
248f0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
24900 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  );.      pTab->t
24910 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
24920 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
24930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24940 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
24950 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
24960 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
24970 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
24980 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
24990 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
249a0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
249b0 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
249c0 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
249d0 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
249e0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
249f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
24a00 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
24a10 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66  ab->nRef==0xffff
24a20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24a30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
24a40 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65  se, "too many re
24a50 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73  ferences to \"%s
24a60 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a  \": max 65535",.
24a70 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
24a80 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
24a90 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30   pFrom->pTab = 0
24aa0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
24ab0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
24ac0 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
24ad0 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66  nRef++;.#if !def
24ae0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
24af0 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
24b00 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
24b10 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
24b20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
24b30 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75  elect || IsVirtu
24b40 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
24b50 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20      /* We reach 
24b60 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65  here if the name
24b70 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61  d table is a rea
24b80 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  lly a view */.  
24b90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24ba0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
24bb0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
24bc0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
24bd0 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  bort;.        as
24be0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
24bf0 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
24c00 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
24c10 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
24c20 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70  tDup(db, pTab->p
24c30 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
24c40 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
24c50 74 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e  tSetName(pFrom->
24c60 70 53 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a  pSelect, pTab->z
24c70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73  Name);.        s
24c80 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
24c90 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d  (pWalker, pFrom-
24ca0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
24cb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
24cc0 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  .    /* Locate t
24cd0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62  he index named b
24ce0 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  y the INDEXED BY
24cf0 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e   clause, if any.
24d00 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
24d10 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
24d20 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  up(pParse, pFrom
24d30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
24d40 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
24d50 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
24d60 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
24d70 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
24d80 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
24d90 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
24da0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
24db0 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50  ailed || sqliteP
24dc0 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
24dd0 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
24de0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
24df0 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65   }..  /* For eve
24e00 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
24e10 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
24e20 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
24e30 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
24e40 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
24e50 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
24e60 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
24e70 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
24e80 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
24e90 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
24ea0 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
24eb0 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
24ec0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
24ed0 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20  with the TK_ALL 
24ee0 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
24ef0 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
24f00 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
24f10 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65  n list..  ** The
24f20 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
24f30 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
24f40 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78  te the TK_ALL ex
24f50 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
24f60 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f  pand.  ** each o
24f70 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
24f80 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
24f90 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
24fa0 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
24fb0 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
24fc0 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
24fd0 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
24fe0 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
24ff0 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
25000 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
25010 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
25020 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20  r; k++){.    pE 
25030 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
25040 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
25050 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
25060 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
25070 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
25080 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d   || pE->pRight!=
25090 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
250a0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
250b0 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30  || (pE->pLeft!=0
250c0 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
250d0 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20  p==TK_ID) );.   
250e0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
250f0 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
25100 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  t->op==TK_ALL ) 
25110 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
25120 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
25130 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
25140 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
25150 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
25160 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
25170 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
25180 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
25190 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
251a0 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
251b0 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
251c0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
251d0 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
251e0 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
251f0 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
25200 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
25210 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
25220 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
25230 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
25240 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
25250 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
25260 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
25270 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
25280 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
25290 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
252c0 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
252d0 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
252e0 20 2f 2a 20 57 68 65 6e 20 70 72 6f 63 65 73 73   /* When process
252f0 69 6e 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ing FROM-clause 
25300 73 75 62 71 75 65 72 69 65 73 2c 20 69 74 20 69  subqueries, it i
25310 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  s always the cas
25320 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 66 75  e.    ** that fu
25330 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d  ll_column_names=
25340 4f 46 46 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f  OFF and short_co
25350 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20  lumn_names=ON.  
25360 54 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  The.    ** sqlit
25370 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
25380 65 63 74 28 29 20 72 6f 75 74 69 6e 65 20 6d 61  ect() routine ma
25390 6b 65 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20  kes it so. */.  
253a0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
253b0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
253c0 65 64 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20  edFrom)==0.     
253d0 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 20       || ((flags 
253e0 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
253f0 4e 61 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20 20  Names)==0 &&.   
25400 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
25410 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
25420 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b  ColNames)!=0) );
25430 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ..    for(k=0; k
25440 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
25450 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d  k++){.      pE =
25460 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
25470 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e     pRight = pE->
25480 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
25490 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
254a0 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d  _DOT || pRight!=
254b0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
254c0 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
254d0 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54   (pE->op!=TK_DOT
254e0 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d   || pRight->op!=
254f0 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
25500 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
25510 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
25520 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
25530 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
25540 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25550 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
25560 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
25570 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
25580 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
25590 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
255a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
255b0 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
255c0 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
255d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
255e0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
255f0 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
25600 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
25610 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
25620 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
25630 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
25640 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
25650 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
25660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25670 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
25680 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
25690 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
256a0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
256b0 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
256c0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
256d0 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
256e0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
256f0 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
25700 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
25710 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
25720 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
25730 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
25740 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
25750 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
25760 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
25770 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
25780 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
25790 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
257a0 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
257b0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
257c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
257d0 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
257e0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
257f0 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
25800 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
25810 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
25820 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
25830 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
25840 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
25850 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
25860 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
25870 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
25880 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
25890 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
258a0 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
258b0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
258c0 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
258d0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
258e0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
258f0 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
25900 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
25910 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
25920 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
25930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25940 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
25950 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
25960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
25970 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
25980 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
25990 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
259a0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
259b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
259c0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
259d0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
259e0 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
259f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
25a00 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
25a10 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
25a20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
25a30 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
25a40 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
25a50 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
25a60 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
25a70 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
25a80 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20  Db[iDb].zName : 
25a90 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  "*";.          }
25aa0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
25ab0 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
25ac0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
25ad0 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
25ae0 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
25af0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
25b00 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d     char *zColnam
25b10 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75  e;  /* The compu
25b20 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
25b30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
25b40 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20  har *zToFree;   
25b50 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69  /* Malloced stri
25b60 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ng that needs to
25b70 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
25b80 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73           Token s
25b90 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d  Colname;  /* Com
25ba0 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
25bb0 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a  e as a token */.
25bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
25bd0 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20  ert( zName );.  
25be0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
25bf0 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20  Name && pSub.   
25c00 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
25c10 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d  ite3MatchSpanNam
25c20 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  e(pSub->pEList->
25c30 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a  a[j].zSpan, 0, z
25c40 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20  TName, 0)==0.   
25c50 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
25c60 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
25c70 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
25c80 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  }..            /
25c90 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73  * If a column is
25ca0 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64   marked as 'hidd
25cb0 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f  en' (currently o
25cc0 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20  nly possible.   
25cd0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
25ce0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c  virtual tables),
25cf0 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20   do not include 
25d00 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64  it in the expand
25d10 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
25d20 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
25d30 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
25d40 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
25d50 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  ( IsHiddenColumn
25d60 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29  (&pTab->aCol[j])
25d70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25d80 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74 75    assert(IsVirtu
25d90 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20  al(pTab));.     
25da0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
25db0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
25dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62  .            tab
25dd0 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20  leSeen = 1;..   
25de0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
25df0 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b   && zTName==0 ){
25e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
25e10 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74  f( (pFrom->joint
25e20 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
25e30 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
25e40 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64       && tableAnd
25e50 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  ColumnIndex(pTab
25e60 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  List, i, zName, 
25e70 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20  0, 0).          
25e80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
25e90 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
25ea0 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
25eb0 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
25ec0 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
25ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
25ee0 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67  table to the rig
25ef0 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ht of the join *
25f00 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
25f10 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
25f20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25f30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
25f40 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
25f50 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20  (pFrom->pUsing, 
25f60 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f80 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
25f90 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
25fa0 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
25fb0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
25fc0 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
25fd0 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
25fe0 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
25ff0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
26000 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26010 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26020 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26030 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
26040 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
26050 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20  TK_ID, zName);. 
26060 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
26070 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
26080 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
26090 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
260a0 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
260b0 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
260c0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
260d0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
260e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
260f0 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
26100 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
26110 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
26120 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
26130 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
26140 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
26150 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
26170 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b  ( zSchemaName ){
26180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26190 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
261a0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
261b0 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20  zSchemaName);.  
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
261d0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
261e0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
261f0 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c  T, pLeft, pExpr,
26200 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
26210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26220 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
26230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26240 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73      zColname = s
26250 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
26260 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  , "%s.%s", zTabN
26270 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f               zTo
26290 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  Free = zColname;
262a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
262b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
262c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
262d0 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
262e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
262f0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
26300 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
26310 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
26320 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20   pNew, pExpr);. 
26330 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e             sColn
26340 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65  ame.z = zColname
26350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43  ;.            sC
26360 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74  olname.n = sqlit
26370 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e  e3Strlen30(zColn
26380 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
26390 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
263a0 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
263b0 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65   pNew, &sColname
263c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
263d0 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70    if( pNew && (p
263e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
263f0 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29  NestedFrom)!=0 )
26400 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26410 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
26420 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77  item *pX = &pNew
26430 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
26440 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
26450 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20    if( pSub ){.  
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
26470 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
26480 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53  3DbStrDup(db, pS
26490 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
264a0 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20  .zSpan);.       
264b0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
264c0 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
264d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
264e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
264f0 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
26500 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  n = sqlite3MPrin
26510 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73  tf(db, "%s.%s.%s
26520 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53                zS
26550 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e  chemaName, zTabN
26560 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  ame, zColname);.
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26580 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
26590 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
265a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
265b0 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61          pX->bSpa
265c0 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  nIsTab = 1;.    
265d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
265e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
265f0 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29  ree(db, zToFree)
26600 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26620 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
26630 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
26640 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
26650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
26660 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
26670 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
26680 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
26690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
266a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
266b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
266c0 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
266d0 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
266e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
266f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
26700 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
26710 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73  Delete(db, pELis
26720 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
26730 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69  t = pNew;.  }.#i
26740 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
26750 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c  UMN.  if( p->pEL
26760 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74  ist && p->pEList
26770 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
26780 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
26790 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
267a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
267b0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
267c0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
267d0 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65  lt set");.  }.#e
267e0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52  ndif.  return WR
267f0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
26800 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
26810 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
26820 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a  -tree walker..**
26830 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
26840 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c  utine is the Wal
26850 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
26860 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  k then expressio
26870 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77  n trees.** are w
26880 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e  alked without an
26890 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20  y actions being 
268a0 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f  taken at each no
268b0 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c  de.  Presumably,
268c0 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
268d0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
268e0 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  r Walker.xExprCa
268f0 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20  llback then .** 
26900 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
26910 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f  llback is set to
26920 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73   do something us
26930 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a  eful for every .
26940 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
26950 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
26960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
26970 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  prWalkNoop(Walke
26980 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72  r *NotUsed, Expr
26990 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
269a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
269b0 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
269c0 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
269d0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
269e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
269f0 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45  e "expands" a SE
26a00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
26a10 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75  nd all of its su
26a20 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72  bqueries..** For
26a30 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
26a40 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20  rmation on what 
26a50 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70  it means to "exp
26a60 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a  and" a SELECT.**
26a70 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20   statement, see 
26a80 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
26a90 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20  he selectExpand 
26aa0 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  worker callback 
26ab0 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70  above..**.** Exp
26ac0 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20  anding a SELECT 
26ad0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65  statement is the
26ae0 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70   first step in p
26af0 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53  rocessing a.** S
26b00 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
26b10 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61    The SELECT sta
26b20 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65  tement must be e
26b30 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a  xpanded before.*
26b40 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  * name resolutio
26b50 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  n is performed..
26b60 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e  **.** If anythin
26b70 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e  g goes wrong, an
26b80 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
26b90 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  s written into p
26ba0 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61  Parse..** The ca
26bb0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  lling function c
26bc0 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72  an detect the pr
26bd0 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67  oblem by looking
26be0 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   at pParse->nErr
26bf0 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73  .** and/or pPars
26c00 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
26c10 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
26c20 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
26c30 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70  tExpand(Parse *p
26c40 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
26c50 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65  Select){.  Walke
26c60 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
26c70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
26c80 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
26c90 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f  ck = exprWalkNoo
26ca0 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
26cb0 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50  pParse;.  if( pP
26cc0 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e  arse->hasCompoun
26cd0 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65  d ){.    w.xSele
26ce0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e  ctCallback = con
26cf0 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
26d00 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20  ctToSubquery;.  
26d10 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
26d20 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
26d30 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63  ;.  }.  w.xSelec
26d40 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
26d50 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 69 66  ctExpander;.  if
26d60 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  ( (pSelect->selF
26d70 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
26d80 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
26d90 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
26da0 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69  k2 = selectPopWi
26db0 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  th;.  }.  sqlite
26dc0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
26dd0 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
26de0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26df0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
26e00 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
26e10 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
26e20 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
26e30 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
26e40 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
26e50 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
26e60 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
26e70 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
26e80 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
26e90 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
26ea0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
26eb0 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
26ec0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
26ed0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
26ee0 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
26ef0 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
26f00 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
26f10 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
26f20 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
26f30 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
26f40 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
26f50 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
26f60 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
26f70 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
26f80 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
26f90 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
26fa0 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
26fb0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
26fc0 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
26fd0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
26fe0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
26ff0 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
27000 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
27010 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62  oid selectAddSub
27020 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
27030 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
27040 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
27050 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
27060 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
27070 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
27080 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
27090 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
270a0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
270b0 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
270c0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
270d0 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
270e0 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nfo)==0 ){.    p
270f0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
27100 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20  _HasTypeInfo;.  
27110 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
27120 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  er->pParse;.    
27130 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
27140 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rc;.    for(i=0,
27150 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
27160 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
27170 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
27180 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  ++){.      Table
27190 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
271a0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
271b0 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29 20  ALWAYS(pTab!=0) 
271c0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
271d0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
271e0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
271f0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
27200 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
27210 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
27220 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
27230 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
27240 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
27250 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
27260 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
27270 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
27280 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
27290 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c 65  ;.          sele
272a0 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
272b0 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
272c0 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b  se, pTab, pSel);
272d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
272e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23   }.    }.  }.}.#
272f0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
27300 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
27310 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
27320 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
27330 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
27340 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
27350 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
27360 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
27370 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
27380 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
27390 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
273a0 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
273b0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
273c0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
273d0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
273e0 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
273f0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
27400 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
27410 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
27420 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
27430 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
27440 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
27450 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
27460 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
27470 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
27480 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
27490 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
274a0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
274b0 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
274c0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
274d0 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
274e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
274f0 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
27500 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
27510 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
27520 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
27530 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
27540 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
27550 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
27560 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
27570 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
27580 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
27590 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
275a0 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
275b0 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
275c0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
275d0 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
275e0 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
275f0 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
27600 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
27610 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
27620 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
27630 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
27640 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
27650 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
27660 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
27670 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
27680 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
27690 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
276a0 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
276b0 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
276c0 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
276d0 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
276e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
276f0 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
27700 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
27710 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
27720 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
27730 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
27740 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
27750 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
27760 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
27770 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
27780 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
27790 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
277a0 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
277b0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
277c0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
277d0 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
277e0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
277f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
27800 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
27810 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
27820 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
27830 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
27840 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
27850 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
27860 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
27870 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
27880 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
27890 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
278a0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
278b0 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
278c0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
278d0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
278e0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
278f0 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
27900 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
27910 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
27920 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
27930 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
27940 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
27950 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
27960 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
27970 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
27980 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
27990 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
279a0 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
279b0 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
279c0 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
279d0 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74  tes code that st
279e0 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
279f0 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
27a00 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  y.** cells..*/.s
27a10 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
27a20 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
27a30 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
27a40 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
27a50 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
27a60 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
27a70 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
27a80 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
27a90 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41  .  int nReg = pA
27aa0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20  ggInfo->nFunc + 
27ab0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
27ac0 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30  n;.  if( nReg==0
27ad0 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65   ) return;.#ifde
27ae0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
27af0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
27b00 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69  all AggInfo regi
27b10 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e  sters are within
27b20 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69   the range speci
27b30 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67  fied by.  ** Agg
27b40 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49  Info.mnReg..AggI
27b50 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61  nfo.mxReg */.  a
27b60 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67  ssert( nReg==pAg
27b70 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67  gInfo->mxReg-pAg
27b80 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29  gInfo->mnReg+1 )
27b90 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
27ba0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
27bb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
27bc0 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  rt( pAggInfo->aC
27bd0 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  ol[i].iMem>=pAgg
27be0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
27bf0 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
27c00 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d  ->aCol[i].iMem<=
27c10 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
27c20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
27c30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
27c40 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  unc; i++){.    a
27c50 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
27c60 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d  >aFunc[i].iMem>=
27c70 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
27c80 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
27c90 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
27ca0 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
27cb0 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  xReg );.  }.#end
27cc0 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  if.  sqlite3Vdbe
27cd0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
27ce0 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
27cf0 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d  mnReg, pAggInfo-
27d00 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70  >mxReg);.  for(p
27d10 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
27d20 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
27d30 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
27d40 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
27d50 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
27d60 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
27d70 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
27d80 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
27d90 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
27da0 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
27db0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
27dc0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
27dd0 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
27de0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
27df0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27e00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
27e10 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
27e20 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
27e30 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
27e40 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
27e50 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
27e60 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
27e70 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
27e80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
27e90 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
27ea0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
27eb0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
27ec0 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  >x.pList, 0, 0);
27ed0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27ee0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
27ef0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
27f00 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
27f10 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f30 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
27f40 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
27f50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27f60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
27f70 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
27f80 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
27f90 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
27fa0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
27fb0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
27fc0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
27fd0 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
27fe0 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
27ff0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
28000 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
28010 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
28020 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
28030 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
28040 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
28050 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
28060 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
28070 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
28080 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
28090 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
280a0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
280b0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
280c0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
280d0 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
280e0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
280f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28100 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
28110 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
28120 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
28130 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
28140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28150 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
28160 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
28170 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
28180 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
28190 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
281a0 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
281b0 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
281c0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
281d0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
281e0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
281f0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
28200 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
28210 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
28220 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
28230 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
28240 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
28250 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
28260 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
28270 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
28280 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
28290 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
282a0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
282b0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
282c0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
282d0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
282e0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
282f0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
28300 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
28310 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
28320 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
28330 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
28340 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
28350 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
28360 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
28370 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
28380 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
28390 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
283a0 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
283b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
283c0 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
283d0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
283e0 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
283f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28400 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
28410 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
28420 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  Agg, SQLITE_ECEL
28430 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
28440 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
28450 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
28460 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
28470 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
28480 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
28490 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
284a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
284b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
284c0 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45  nArg==0 );  /* E
284d0 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
284e0 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
284f0 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a  ( nArg>1 );   /*
28500 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a   Also an error *
28510 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  /.      codeDist
28520 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
28530 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
28540 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
28550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28560 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  pF->pFunc->funcF
28570 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
28580 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
28590 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
285a0 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
285b0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
285c0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
285d0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
285e0 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
285f0 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
28600 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
28610 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
28620 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
28630 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
28640 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
28650 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
28660 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
28670 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
28680 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
28690 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
286a0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
286b0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
286c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
286d0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
286e0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48  }.      if( regH
286f0 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66  it==0 && pAggInf
28700 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
28710 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61  ) regHit = ++pPa
28720 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
28730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28740 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
28750 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20  , regHit, 0, 0, 
28760 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
28770 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
28780 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
28790 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
287a0 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67  gStep, 0, regAgg
287b0 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20  , pF->iMem,.    
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
287e0 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
287f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
28800 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
28810 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
28820 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
28830 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
28840 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
28850 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
28860 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
28870 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
28880 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
28890 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
288a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
288b0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
288c0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
288d0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
288e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
288f0 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
28900 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61  populating the a
28910 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
28920 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ters, clear the 
28930 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
28940 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
28950 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75   any of the requ
28960 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ired column valu
28970 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  es are already p
28980 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20  resent .  ** in 
28990 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74  registers, sqlit
289a0 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79  e3ExprCode() may
289b0 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f   use OP_SCopy to
289c0 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a   copy the value.
289d0 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d    ** to pC->iMem
289e0 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d  . But by the tim
289f0 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75  e the value is u
28a00 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  sed, the origina
28a10 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20  l register.  ** 
28a20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73  may have been us
28a30 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  ed, invalidating
28a40 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
28a50 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74  buffer holding t
28a60 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20  he.  ** text or 
28a70 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20  blob value. See 
28a80 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63  ticket [883034dc
28a90 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  b5]..  **.  ** A
28aa0 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20  nother solution 
28ab0 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e  would be to chan
28ac0 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20  ge the OP_SCopy 
28ad0 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63  used to copy cac
28ae0 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  hed.  ** values 
28af0 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20  to an OP_Copy.. 
28b00 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74   */.  if( regHit
28b10 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54   ){.    addrHitT
28b20 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
28b30 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
28b40 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43  , regHit); VdbeC
28b50 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
28b60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
28b70 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
28b80 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
28b90 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
28ba0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
28bb0 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
28bc0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
28bd0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
28be0 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
28bf0 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
28c00 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
28c10 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
28c20 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
28c30 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64  Parse);.  if( ad
28c40 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
28c50 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28c60 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
28c70 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
28c80 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
28c90 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
28ca0 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
28cb0 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
28cc0 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
28cd0 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
28ce0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
28cf0 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
28d00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
28d10 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
28d20 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
28d30 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
28d40 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
28d50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
28d60 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
28d70 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d90 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
28da0 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
28db0 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
28dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28dd0 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
28de0 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
28df0 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
28e00 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
28e10 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f  2 ){.    int bCo
28e20 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26  ver = (pIdx!=0 &
28e30 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
28e40 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
28e50 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b  eyIndex(pIdx)));
28e60 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20  .    char *zEqp 
28e70 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
28e80 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43  (pParse->db, "SC
28e90 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22  AN TABLE %s%s%s"
28ea0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
28eb0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62  zName,.        b
28ec0 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20  Cover ? " USING 
28ed0 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22  COVERING INDEX "
28ee0 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62   : "",.        b
28ef0 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e  Cover ? pIdx->zN
28f00 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a  ame : "".    );.
28f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28f20 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70  ddOp4(.        p
28f30 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
28f40 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
28f50 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
28f60 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41  0, zEqp, P4_DYNA
28f70 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  MIC.    );.  }.}
28f80 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
28f90 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
28fa0 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  nt(a,b,c).#endif
28fb0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
28fc0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
28fd0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
28fe0 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
28ff0 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
29000 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
29010 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69  returned accordi
29020 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74  ng to the Select
29030 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
29040 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
29050 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66  in sqliteInt.h f
29060 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
29070 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
29080 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29090 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
290a0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
290b0 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
290c0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
290d0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
290e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
290f0 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
29100 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
29110 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29120 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
29130 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
29140 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
29150 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
29160 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
29170 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
29180 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
29190 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
291a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
291b0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
291c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
291d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
291e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
291f0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
29200 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
29210 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
29220 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
29230 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
29240 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
29250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29260 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
29270 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
29280 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
29290 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
292a0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
292b0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
292c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
292d0 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
292e0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
292f0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
29300 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
29310 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
29320 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
29330 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
29340 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
29350 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
29360 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
29370 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
29380 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
29390 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
293a0 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
293b0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
293c0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
293d0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
293e0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
293f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
29400 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
29410 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
29420 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
29430 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
29440 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
29450 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
29460 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
29470 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
29480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
29490 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
294a0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
294b0 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
294c0 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
294d0 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
294e0 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
294f0 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53  T keyword */.  S
29500 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20  ortCtx sSort;   
29510 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e        /* Info on
29520 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
29530 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
29540 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
29550 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
29560 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
29570 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
29580 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
29590 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
295a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
295b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
295c0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
295d0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
295e0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
295f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
29600 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29610 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
29620 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  t iRestoreSelect
29630 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
29640 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65  lectId;.  pParse
29650 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50  ->iSelectId = pP
29660 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
29670 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  tId++;.#endif.. 
29680 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
29690 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
296a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
296b0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
296c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
296d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
296e0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
296f0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
29700 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
29710 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
29720 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
29730 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
29740 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
29750 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61  CE_ENABLED.  pPa
29760 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
29770 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52  nt++;.  SELECTTR
29780 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20  ACE(1,pParse,p, 
29790 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69  ("begin processi
297a0 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20  ng:\n"));.  if( 
297b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
297c0 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
297d0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
297e0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
297f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
29800 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
29810 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
29820 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
29830 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
29840 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
29850 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
29860 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  !=SRT_Fifo );.  
29870 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
29880 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
29890 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
298a0 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72  Queue );.  asser
298b0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
298c0 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
298d0 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a  t!=SRT_Queue );.
298e0 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
298f0 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
29900 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
29910 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
29920 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
29930 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
29940 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
29950 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
29960 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
29970 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
29980 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20  card ||.        
29990 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
299a0 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70  =SRT_Queue  || p
299b0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
299c0 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20  _DistFifo ||.   
299d0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
299e0 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
299f0 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  eue || pDest->eD
29a00 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a  est==SRT_Fifo);.
29a10 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20      /* If ORDER 
29a20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66  BY makes no diff
29a30 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75  erence in the ou
29a40 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65  tput then neithe
29a50 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49  r does.    ** DI
29a60 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e  STINCT so it can
29a70 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e   be removed too.
29a80 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
29a90 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
29aa0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
29ab0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
29ac0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  = 0;.    p->selF
29ad0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
29ae0 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
29af0 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
29b00 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d  arse, p, 0);.  m
29b10 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c  emset(&sSort, 0,
29b20 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b   sizeof(sSort));
29b30 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  .  sSort.pOrderB
29b40 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
29b50 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
29b60 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
29b70 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
29b80 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
29b90 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
29ba0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
29bb0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
29bc0 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65    isAgg = (p->se
29bd0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
29be0 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73  egate)!=0;.  ass
29bf0 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
29c00 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
29c10 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
29c20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
29c30 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
29c40 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
29c50 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  100,pParse,p, ("
29c60 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
29c70 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ution:\n"));.   
29c80 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
29c90 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
29ca0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20  .  }.#endif...  
29cb0 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
29cc0 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
29cd0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
29ce0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
29cf0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
29d00 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
29d10 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
29d20 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
29d30 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
29d40 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
29d50 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
29d60 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
29d70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
29d80 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b  UERY.  if( check
29d90 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
29da0 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
29db0 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d  , pDest, pEList-
29dc0 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67  >nExpr) ){.    g
29dd0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
29de0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
29df0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
29e00 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
29e10 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
29e20 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21  lause.  */.#if !
29e30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
29e40 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
29e50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
29e60 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
29e70 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
29e80 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
29e90 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
29ea0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
29eb0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
29ec0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
29ed0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
29ee0 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
29ef0 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
29f00 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69  elect;.    int i
29f10 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66  sAggSub;..    if
29f20 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
29f30 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
29f40 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
29f50 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
29f60 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
29f70 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
29f80 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
29f90 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
29fa0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
29fb0 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
29fc0 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
29fd0 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
29fe0 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
29ff0 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
2a000 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
2a010 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
2a020 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
2a030 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
2a040 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
2a050 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
2a060 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
2a070 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
2a080 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
2a090 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
2a0a0 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
2a0b0 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
2a0c0 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2a0d0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
2a0e0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2a0f0 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30  >viaCoroutine==0
2a100 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2a110 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2a120 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
2a130 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
2a140 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
2a150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a160 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2a170 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
2a180 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
2a190 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
2a1a0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
2a1b0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
2a1c0 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
2a1d0 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
2a1e0 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
2a1f0 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
2a200 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
2a210 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
2a220 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
2a230 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
2a240 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
2a250 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
2a260 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
2a270 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
2a280 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
2a290 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
2a2a0 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
2a2b0 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
2a2c0 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
2a2d0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
2a2e0 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
2a2f0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2a300 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41  ght(p);..    isA
2a310 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73  ggSub = (pSub->s
2a320 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2a330 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20  regate)!=0;.    
2a340 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
2a350 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
2a360 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75  , isAgg, isAggSu
2a370 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
2a380 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
2a390 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
2a3a0 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
2a3b0 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
2a3c0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
2a3d0 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
2a3e0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2a3f0 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
2a400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
2a410 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   -1;.    }else i
2a420 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
2a430 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20  c==1.           
2a440 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2a450 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2a460 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29  E_SubqCoroutine)
2a470 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2a480 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
2a490 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
2a4a0 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
2a4b0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
2a4c0 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
2a4d0 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
2a4e0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
2a4f0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
2a500 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2a510 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
2a520 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2a530 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
2a540 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
2a550 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2a560 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
2a570 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
2a580 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f  eturn, 0, addrTo
2a590 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
2a5a0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
2a5b0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2a5c0 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  me));.      pIte
2a5d0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
2a5e0 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
2a5f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
2a600 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
2a610 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  _Coroutine, pIte
2a620 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2a630 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2a640 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2a650 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
2a660 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2a670 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
2a680 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
2a690 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
2a6a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
2a6b0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73  ->nRowLogEst = s
2a6c0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75  qlite3LogEst(pSu
2a6d0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  b->nSelectRow);.
2a6e0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76 69 61        pItem->via
2a6f0 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20  Coroutine = 1;. 
2a700 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2a710 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64  esult = dest.iSd
2a720 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
2a730 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2a740 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20  P_EndCoroutine, 
2a750 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2a760 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a770 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2a780 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20  addrTop-1);.    
2a790 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
2a7a0 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
2a7b0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
2a7c0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2a7d0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
2a7e0 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20  at will fill an 
2a7f0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
2a800 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  with.      ** th
2a810 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
2a820 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74  s subquery.  pIt
2a830 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2a840 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20  will point.     
2a850 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65   ** to the addre
2a860 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ss of the genera
2a870 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  ted subroutine. 
2a880 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2a890 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  n.      ** is a 
2a8a0 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
2a8b0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
2a8c0 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
2a8d0 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
2a8e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41  /.      int topA
2a8f0 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ddr;.      int o
2a900 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  nceAddr = 0;.   
2a910 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a     int retAddr;.
2a920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2a930 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2a940 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
2a950 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2a960 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2a970 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
2a980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a990 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2a9a0 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
2a9b0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
2a9c0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2a9d0 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
2a9e0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 73     if( pItem->is
2a9f0 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b  Correlated==0 ){
2aa00 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2aa10 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
2aa20 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e  ot correlated an
2aa30 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  d if we are not 
2aa40 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20  inside of.      
2aa50 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20    ** a trigger, 
2aa60 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65  then we only nee
2aa70 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
2aa80 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75   value of the su
2aa90 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a  bquery.        *
2aaa0 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20  * once. */.     
2aab0 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71     onceAddr = sq
2aac0 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
2aad0 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
2aae0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2aaf0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2ab00 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
2ab10 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
2ab20 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2ab30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ab40 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
2ab50 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
2ab60 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
2ab70 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2ab80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2ab90 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
2aba0 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
2abb0 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
2abc0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2abd0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2abe0 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63  er(pItem->iSelec
2abf0 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d  tId, (u8)pParse-
2ac00 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
2ac10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
2ac20 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
2ac30 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
2ac40 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
2ac50 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74  owLogEst = sqlit
2ac60 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e  e3LogEst(pSub->n
2ac70 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
2ac80 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
2ac90 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2aca0 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
2acb0 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
2acc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2acd0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2ace0 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
2acf0 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
2ad00 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
2ad10 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
2ad20 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2ad30 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2ad40 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
2ad50 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
2ad60 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
2ad70 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
2ad80 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2ad90 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72  ( /*pParse->nErr
2ada0 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63   ||*/ db->malloc
2adb0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
2adc0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2add0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
2ade0 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
2adf0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2ae00 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54  eight(p);.    pT
2ae10 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2ae20 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
2ae30 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
2ae40 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  t) ){.      sSor
2ae50 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
2ae60 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
2ae70 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
2ae80 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66  ->pEList;.#endif
2ae90 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
2aea0 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
2aeb0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
2aec0 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
2aed0 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
2aee0 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
2aef0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2af00 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
2af10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2af20 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
2af30 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  CT.  /* If there
2af40 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
2af50 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
2af60 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
2af70 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
2af80 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
2af90 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
2afa0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2afb0 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78  , pDest);.    ex
2afc0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2afd0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2afe0 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2aff0 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  tId);.#if SELECT
2b000 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2b010 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2b020 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63  pParse,p,("end c
2b030 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70  ompound-select p
2b040 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
2b050 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c      pParse->nSel
2b060 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e  ectIndent--;.#en
2b070 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72  dif.    return r
2b080 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
2b090 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
2b0a0 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74   is DISTINCT wit
2b0b0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75  h an ORDER BY bu
2b0c0 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  t is not an aggr
2b0d0 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a  egate, and .  **
2b0e0 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c   if the select-l
2b0f0 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ist is the same 
2b100 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  as the ORDER BY 
2b110 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20  list, then this 
2b120 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62  query.  ** can b
2b130 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
2b140 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74   GROUP BY. In ot
2b150 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a  her words, this:
2b160 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
2b170 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
2b180 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45  yz FROM ... ORDE
2b190 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
2b1a0 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** is transforme
2b1b0 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d to:.  **.  ** 
2b1c0 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46      SELECT xyz F
2b1d0 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59  ROM ... GROUP BY
2b1e0 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79   xyz ORDER BY xy
2b1f0 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  z.  **.  ** The 
2b200 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70  second form is p
2b210 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69  referred as a si
2b220 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74  ngle index (or t
2b230 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62  emp-table) may b
2b240 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  e .  ** used for
2b250 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20   both the ORDER 
2b260 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
2b270 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f  processing. As o
2b280 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20  riginally .  ** 
2b290 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72  written the quer
2b2a0 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d  y must use a tem
2b2b0 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c  p-table for at l
2b2c0 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
2b2d0 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61  ORDER .  ** BY a
2b2e0 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64  nd DISTINCT, and
2b2f0 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70   an index or sep
2b300 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65  arate temp-table
2b310 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a   for the other..
2b320 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73    */.  if( (p->s
2b330 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
2b340 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
2b350 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
2b360 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ct .   && sqlite
2b370 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
2b380 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c  (sSort.pOrderBy,
2b390 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d   p->pEList, -1)=
2b3a0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73  =0.  ){.    p->s
2b3b0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
2b3c0 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e  istinct;.    p->
2b3d0 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
2b3e0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
2b3f0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b  , p->pEList, 0);
2b400 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
2b410 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
2b420 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20   /* Notice that 
2b430 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f  even thought SF_
2b440 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65  Distinct has bee
2b450 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70  n cleared from p
2b460 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20  ->selFlags,.    
2b470 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74  ** the sDistinct
2b480 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c  .isTnct is still
2b490 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73   set.  Hence, is
2b4a0 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20  Tnct represents 
2b4b0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69  the.    ** origi
2b4c0 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74  nal setting of t
2b4d0 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66  he SF_Distinct f
2b4e0 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72  lag, not the cur
2b4f0 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rent setting */.
2b500 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73      assert( sDis
2b510 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a  tinct.isTnct );.
2b520 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2b530 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
2b540 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
2b550 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
2b560 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
2b570 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
2b580 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
2b590 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
2b5a0 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
2b5b0 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
2b5c0 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
2b5d0 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
2b5e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
2b5f0 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
2b600 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
2b610 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
2b620 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
2b630 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
2b640 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
2b650 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
2b660 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
2b670 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
2b680 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
2b690 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
2b6a0 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
2b6b0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
2b6c0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
2b6d0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
2b6e0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2b6f0 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70  (pParse, sSort.p
2b700 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69  OrderBy, 0, pELi
2b710 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
2b720 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d  sSort.iECursor =
2b730 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2b740 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
2b750 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
2b760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b770 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
2b780 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
2b790 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
2b7a0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2b7b0 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74  ->nExpr+1+pEList
2b7c0 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20  ->nExpr, 0,.    
2b7d0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
2b7e0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2b7f0 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c  O.      );.  }el
2b800 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  se{.    sSort.ad
2b810 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31  drSortIndex = -1
2b820 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2b830 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
2b840 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
2b850 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
2b860 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
2b870 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
2b880 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
2b890 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
2b8a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2b8b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2b8c0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
2b8d0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
2b8e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
2b8f0 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
2b900 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
2b910 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2b920 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
2b930 52 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e  Row = LARGEST_IN
2b940 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  T64;.  computeLi
2b950 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
2b960 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
2b970 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
2b980 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53  0 && sSort.addrS
2b990 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20  ortIndex>=0 ){. 
2b9a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65     sqlite3VdbeGe
2b9b0 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  tOp(v, sSort.add
2b9c0 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63  rSortIndex)->opc
2b9d0 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f  ode = OP_SorterO
2b9e0 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73  pen;.    sSort.s
2b9f0 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54  ortFlags |= SORT
2ba00 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a  FLAG_UseSorter;.
2ba10 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
2ba20 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
2ba30 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
2ba40 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
2ba50 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
2ba60 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
2ba70 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63   ){.    sDistinc
2ba80 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72  t.tabTnct = pPar
2ba90 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2baa0 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e  sDistinct.addrTn
2bab0 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ct = sqlite3Vdbe
2bac0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2bad0 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
2bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2baf0 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73              sDis
2bb00 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30  tinct.tabTnct, 0
2bb10 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb30 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49       (char*)keyI
2bb40 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2bb50 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
2bb60 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20  t,0,0),.        
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb80 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
2bb90 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
2bba0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2bbb0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
2bbc0 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
2bbd0 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2bbe0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
2bbf0 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ERED;.  }else{. 
2bc00 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2bc10 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
2bc20 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
2bc30 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  }..  if( !isAgg 
2bc40 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
2bc50 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72  {.    /* No aggr
2bc60 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
2bc70 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
2bc80 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31  clause */.    u1
2bc90 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  6 wctrlFlags = (
2bca0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2bcb0 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   ? WHERE_WANT_DI
2bcc0 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20  STINCT : 0);..  
2bcd0 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
2bce0 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f  atabase scan. */
2bcf0 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
2bd00 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2bd10 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2bd20 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e  , pWhere, sSort.
2bd30 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
2bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd50 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
2bd60 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  st, wctrlFlags, 
2bd70 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  0);.    if( pWIn
2bd80 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
2bd90 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2bda0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
2bdb0 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
2bdc0 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
2bdd0 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
2bde0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
2bdf0 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
2be00 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
2be10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
2be20 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2be30 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
2be40 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
2be50 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
2be60 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
2be70 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
2be80 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
2be90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
2bea0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
2beb0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
2bec0 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
2bed0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2bee0 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  fo);.      if( s
2bef0 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f  Sort.nOBSat==sSo
2bf00 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  rt.pOrderBy->nEx
2bf10 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53  pr ){.        sS
2bf20 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
2bf30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2bf40 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
2bf50 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
2bf60 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
2bf70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
2bf80 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
2bf90 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
2bfa0 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
2bfb0 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
2bfc0 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
2bfd0 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
2bfe0 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
2bff0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f    */.    if( sSo
2c000 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2c010 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72  >=0 && sSort.pOr
2c020 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
2c030 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2c040 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f  ngeToNoop(v, sSo
2c050 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2c060 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
2c070 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
2c080 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f  d inner loop. */
2c090 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  .    selectInner
2c0a0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
2c0b0 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f  pEList, -1, &sSo
2c0c0 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20  rt, &sDistinct, 
2c0d0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
2c0e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c0f0 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c  e3WhereContinueL
2c100 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20  abel(pWInfo),.  
2c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c120 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72    sqlite3WhereBr
2c130 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
2c140 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74  );..    /* End t
2c150 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
2c160 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
2c170 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2c180 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
2c190 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
2c1a0 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20  case when there 
2c1b0 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20  exist aggregate 
2c1c0 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47  functions or a G
2c1d0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20  ROUP BY clause. 
2c1e0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f     ** or both */
2c1f0 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
2c200 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
2c210 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
2c220 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
2c230 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
2c240 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
2c250 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2c260 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
2c270 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
2c280 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
2c290 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
2c2a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
2c2b0 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
2c2c0 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
2c2d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
2c2e0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
2c2f0 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
2c300 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
2c310 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
2c320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c330 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
2c340 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
2c350 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
2c360 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
2c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c380 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
2c390 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
2c3a0 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
2c3b0 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
2c3c0 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
2c3d0 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
2c3e0 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
2c3f0 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
2c400 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
2c410 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
2c420 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
2c430 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
2c440 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65   /* End of proce
2c450 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
2c460 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74  ELECT */.    int
2c470 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20   sortPTab = 0;  
2c480 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20   /* Pseudotable 
2c490 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73  used to decode s
2c4a0 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  orting results *
2c4b0 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75  /.    int sortOu
2c4c0 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74  t = 0;    /* Out
2c4d0 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f  put register fro
2c4e0 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  m the sorter */.
2c4f0 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47      int orderByG
2c500 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20  rp = 0; /* True 
2c510 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  if the GROUP BY 
2c520 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65  and ORDER BY are
2c530 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20   the same */..  
2c540 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
2c550 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
2c560 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
2c570 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
2c580 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
2c590 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
2c5a0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
2c5b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
2c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2c5e0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
2c5f0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2c600 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
2c610 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2c620 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
2c630 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
2c640 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(k=p->pEList-
2c650 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
2c660 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b  >pEList->a; k>0;
2c670 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
2c680 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
2c690 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
2c6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
2c6b0 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
2c6c0 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
2c6d0 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
2c6e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2c6f0 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
2c700 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
2c710 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  }.      if( p->n
2c720 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20  SelectRow>100 ) 
2c730 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2c740 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  100;.    }else{.
2c750 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
2c760 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Row = 1;.    }..
2c770 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2c780 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50   is both a GROUP
2c790 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52   BY and an ORDER
2c7a0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
2c7b0 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69  hey are.    ** i
2c7c0 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69  dentical, then i
2c7d0 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c  t may be possibl
2c7e0 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  e to disable the
2c7f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2c800 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20   .    ** on the 
2c810 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65  grounds that the
2c820 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63   GROUP BY will c
2c830 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f  ause elements to
2c840 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a   come out .    *
2c850 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
2c860 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20   order. It also 
2c870 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52  may not - the GR
2c880 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65 20 61  OUP BY may use a
2c890 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2c8a0 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73   index that caus
2c8b0 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72  es rows to be gr
2c8c0 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61  ouped together a
2c8d0 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a  s required.    *
2c8e0 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  * but not actual
2c8f0 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65  ly sorted. Eithe
2c900 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68  r way, record th
2c910 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a  e fact that the.
2c920 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
2c930 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61  and GROUP BY cla
2c940 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d  uses are the sam
2c950 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  e by setting the
2c960 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20   orderByGrp.    
2c970 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
2c980 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2c990 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2c9a0 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e  pGroupBy, sSort.
2c9b0 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30  pOrderBy, -1)==0
2c9c0 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42   ){.      orderB
2c9d0 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  yGrp = 1;.    }.
2c9e0 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
2c9f0 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
2ca00 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
2ca10 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
2ca20 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
2ca30 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
2ca40 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
2ca50 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
2ca60 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
2ca70 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
2ca80 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
2ca90 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
2caa0 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
2cab0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
2cac0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
2cad0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
2cae0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2caf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
2cb00 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
2cb10 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
2cb20 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
2cb30 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
2cb40 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
2cb50 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
2cb60 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
2cb70 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67    sAggInfo.mnReg
2cb80 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2cb90 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  1;.    sAggInfo.
2cba0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
2cbb0 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
2cbc0 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  upBy->nExpr : 0;
2cbd0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
2cbe0 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2cbf0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  y;.    sqlite3Ex
2cc00 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2cc10 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a  (&sNC, pEList);.
2cc20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2cc30 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2cc40 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  NC, sSort.pOrder
2cc50 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
2cc60 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
2cc70 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2cc80 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
2cc90 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
2cca0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
2ccb0 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
2ccc0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
2ccd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
2cce0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
2ccf0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
2cd00 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2cd10 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
2cd20 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
2cd30 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2cd40 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c     sNC.ncFlags |
2cd50 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a  = NC_InAggFunc;.
2cd60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2cd70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2cd80 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
2cd90 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
2cda0 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  .pList);.      s
2cdb0 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  NC.ncFlags &= ~N
2cdc0 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
2cdd0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
2cde0 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mxReg = pParse->
2cdf0 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62  nMem;.    if( db
2ce00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2ce10 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2ce20 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
2ce30 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
2ce40 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
2ce50 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
2ce60 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
2ce70 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
2ce80 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
2ce90 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
2cea0 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
2ceb0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
2cec0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2ced0 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
2cee0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
2cef0 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
2cf00 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
2cf10 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20   int j1;        
2cf20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
2cf30 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
2cf40 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2cf50 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
2cf60 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
2cf70 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
2cf80 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
2cf90 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
2cfa0 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
2cfb0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
2cfc0 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
2cfd0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
2cfe0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
2cff0 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
2d000 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
2d010 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
2d020 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
2d030 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
2d040 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
2d050 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2d060 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
2d070 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
2d080 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
2d090 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
2d0a0 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
2d0b0 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
2d0c0 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
2d0d0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
2d0e0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
2d0f0 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
2d100 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
2d110 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
2d120 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
2d130 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
2d140 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
2d150 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
2d160 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
2d170 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
2d180 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
2d190 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
2d1a0 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
2d1b0 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
2d1c0 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
2d1d0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
2d1e0 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
2d1f0 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
2d200 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
2d210 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
2d220 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
2d230 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
2d240 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
2d250 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
2d260 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2d270 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
2d280 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2d290 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
2d2a0 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66  upBy, 0, sAggInf
2d2b0 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  o.nColumn);.    
2d2c0 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
2d2d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2d2e0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
2d2f0 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  rOpen, .        
2d300 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2d310 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e  ngIdx, sAggInfo.
2d320 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
2d330 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63  .          0, (c
2d340 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2d350 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20  4_KEYINFO);..   
2d360 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
2d370 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2d380 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
2d390 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
2d3a0 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
2d3b0 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
2d3c0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2d3d0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
2d3e0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2d3f0 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
2d400 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
2d410 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2d420 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
2d430 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2d440 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
2d450 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
2d460 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2d470 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
2d480 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2d490 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
2d4a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
2d4b0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
2d4c0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
2d4d0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2d4e0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
2d4f0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
2d500 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2d510 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2d520 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
2d530 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d540 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
2d550 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
2d560 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2d570 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
2d580 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2d590 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d5a0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2d5b0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
2d5c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2d5d0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
2d5e0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
2d5f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d600 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
2d610 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69  ull, 0, iAMem, i
2d620 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e  AMem+pGroupBy->n
2d630 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20  Expr-1);..      
2d640 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
2d650 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
2d660 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
2d670 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
2d680 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
2d690 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
2d6a0 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
2d6b0 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
2d6c0 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
2d6d0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
2d6e0 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
2d6f0 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
2d700 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
2d710 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
2d720 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
2d730 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
2d740 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
2d750 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2d760 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2d770 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
2d780 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
2d790 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
2d7a0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2d7b0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2d7c0 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
2d7d0 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  By, 0,.         
2d7e0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c   WHERE_GROUPBY |
2d7f0 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57   (orderByGrp ? W
2d800 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
2d810 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29   : 0), 0.      )
2d820 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
2d830 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
2d840 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
2d850 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
2d860 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
2d870 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ==pGroupBy->nExp
2d880 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
2d890 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
2d8a0 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
2d8b0 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
2d8c0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
2d8d0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
2d8e0 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
2d8f0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2d900 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
2d910 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
2d920 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
2d930 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
2d940 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
2d950 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
2d960 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
2d970 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
2d980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d990 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
2d9a0 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
2d9b0 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
2d9c0 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
2d9d0 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
2d9e0 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
2d9f0 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
2da00 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
2da10 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
2da20 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
2da30 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
2da40 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
2da50 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
2da60 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
2da70 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
2da80 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
2da90 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
2daa0 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
2dab0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
2dac0 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
2dad0 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70  By;..        exp
2dae0 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
2daf0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
2db00 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73     (sDistinct.is
2db10 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  Tnct && (p->selF
2db20 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74  lags&SF_Distinct
2db30 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
2db40 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53              "DIS
2db50 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20  TINCT" : "GROUP 
2db60 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
2db70 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
2db80 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
2db90 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
2dba0 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
2dbb0 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
2dbc0 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2dbd0 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
2dbe0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2dbf0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2dc00 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
2dc10 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
2dc20 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
2dc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
2dc40 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
2dc50 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
2dc60 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2dc70 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
2dc80 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2dc90 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
2dca0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2dcb0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2dcc0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
2dcd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
2dce0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2dcf0 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
2dd00 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  e, 0);.        j
2dd10 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
2dd20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2dd30 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2dd40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2dd50 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2dd60 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
2dd70 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
2dd80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2dd90 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2dda0 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
2ddb0 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
2ddc0 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
2ddd0 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20        int r2;.. 
2dde0 20 20 20 20 20 20 20 20 20 20 20 72 32 20 3d 20             r2 = 
2ddf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
2de00 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
2de10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de30 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
2de40 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
2de50 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29  ->iTable, r1, 0)
2de60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2de70 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20  ( r1!=r2 ){.    
2de80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2de90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2dea0 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29  P_SCopy, r2, r1)
2deb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2dec0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
2ded0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2dee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2def0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
2df00 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2df10 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
2df20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2df30 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
2df40 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
2df50 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
2df60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2df70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2df80 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49  terInsert, sAggI
2df90 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2dfa0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
2dfb0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2dfc0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
2dfd0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
2dfe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
2dff0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
2e000 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
2e010 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
2e020 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2e030 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
2e040 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2e050 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61  dxPTab = sortPTa
2e060 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
2e070 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74  ++;.        sort
2e080 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Out = sqlite3Get
2e090 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
2e0a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e0b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2e0c0 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72  _OpenPseudo, sor
2e0d0 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20  tPTab, sortOut, 
2e0e0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2e0f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e100 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
2e110 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
2e120 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29  ingIdx, addrEnd)
2e130 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2e140 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50  mment((v, "GROUP
2e150 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62   BY sort")); Vdb
2e160 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2e170 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
2e180 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
2e190 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e1a0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2e1b0 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
2e1c0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
2e1d0 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70  he index or temp
2e1e0 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64  orary table used
2e1f0 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59   by the GROUP BY
2e200 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77   sort.      ** w
2e210 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65  ill naturally de
2e220 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68  liver rows in th
2e230 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64  e order required
2e240 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59   by the ORDER BY
2e250 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
2e260 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68  , cancel the eph
2e270 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65  emeral table ope
2e280 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e  n coded earlier.
2e290 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2e2a0 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
2e2b0 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65  timization - the
2e2c0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
2e2d0 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65  should result re
2e2e0 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20  gardless..      
2e2f0 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54  ** Use the SQLIT
2e300 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66  E_GroupByOrder f
2e310 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f  lag with SQLITE_
2e320 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
2e330 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ER to .      ** 
2e340 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
2e350 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
2e360 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  sting purposes. 
2e370 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72   */.      if( or
2e380 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69  derByGrp && Opti
2e390 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2e3a0 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  db, SQLITE_Group
2e3b0 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20  ByOrder) .      
2e3c0 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74   && (groupBySort
2e3d0 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65   || sqlite3Where
2e3e0 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29  IsSorted(pWInfo)
2e3f0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2e400 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2e410 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  y = 0;.        s
2e420 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2e430 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
2e440 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
2e450 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2e460 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  * Evaluate the c
2e470 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
2e480 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20  terms and store 
2e490 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e  in b0, b1, b2...
2e4a0 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73  .      ** (b0 is
2e4b0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2e4c0 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20   iBMem+0, b1 is 
2e4d0 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20  iBMem+1, and so 
2e4e0 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20  forth).      ** 
2e4f0 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65  Then compare the
2e500 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
2e510 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20  Y terms against 
2e520 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
2e530 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ms.      ** from
2e540 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
2e550 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  w currently stor
2e560 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32  ed in a0, a1, a2
2e570 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
2e580 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70     addrTopOfLoop
2e590 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2e5a0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2e5b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2e5c0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2e5d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  );.      if( gro
2e5e0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2e5f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e600 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
2e610 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f  erData, sAggInfo
2e620 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f 72  .sortingIdx, sor
2e630 74 4f 75 74 2c 73 6f 72 74 50 54 61 62 29 3b 0a  tOut,sortPTab);.
2e640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2e650 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
2e660 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
2e670 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
2e680 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2e690 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e6a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
2e6b0 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a  umn, sortPTab, j
2e6c0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
2e6d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e6e0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
2e6f0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
2e700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2e710 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2e720 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
2e730 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
2e740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e750 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
2e760 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2e770 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
2e780 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
2e790 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
2e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7b0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
2e7c0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
2e7d0 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
2e7e0 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71  );.      j1 = sq
2e7f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2e800 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2e810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2e820 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b  (v, OP_Jump, j1+
2e830 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20 56 64 62  1, 0, j1+1); Vdb
2e840 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
2e850 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2e860 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
2e870 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
2e880 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
2e890 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
2e8a0 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
2e8b0 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
2e8c0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
2e8d0 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
2e8e0 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
2e8f0 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
2e900 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
2e910 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2e920 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
2e930 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
2e940 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
2e950 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
2e960 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
2e970 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
2e980 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
2e990 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
2e9a0 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
2e9b0 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
2e9c0 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
2e9d0 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
2e9e0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
2e9f0 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
2ea00 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
2ea10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2ea20 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
2ea30 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
2ea40 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
2ea50 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
2ea60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ea70 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
2ea80 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
2ea90 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2eaa0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2eab0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
2eac0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ead0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2eae0 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
2eaf0 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64  ag, addrEnd); Vd
2eb00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2eb10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2eb20 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
2eb30 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2eb40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2eb50 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2eb60 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
2eb70 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
2eb80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
2eb90 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
2eba0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
2ebb0 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
2ebc0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
2ebd0 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
2ebe0 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
2ebf0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
2ec00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2ec10 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2ec20 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
2ec30 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
2ec40 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
2ec50 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2ec60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2ec70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
2ec80 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
2ec90 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2eca0 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
2ecb0 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
2ecc0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
2ecd0 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
2ece0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2ecf0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2ed00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2ed10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2ed20 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67  SorterNext, sAgg
2ed30 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2ed40 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b   addrTopOfLoop);
2ed50 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
2ed60 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2ed70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2ed80 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2ed90 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
2eda0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2edb0 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
2edc0 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20  ortingIdx);.    
2edd0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75    }..      /* Ou
2ede0 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72  tput the final r
2edf0 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20  ow of result.   
2ee00 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2ee10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ee20 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
2ee30 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
2ee40 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2ee50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2ee60 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77  output final row
2ee70 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a  "));..      /* J
2ee80 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62  ump over the sub
2ee90 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a  routines.      *
2eea0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2eeb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2eec0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64  Goto, 0, addrEnd
2eed0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
2eee0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
2eef0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
2ef00 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
2ef10 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
2ef20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
2ef30 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
2ef40 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
2ef50 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
2ef60 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
2ef70 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2ef80 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
2ef90 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
2efa0 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
2efb0 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
2efc0 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
2efd0 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
2efe0 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
2eff0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
2f000 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
2f010 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
2f020 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
2f030 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
2f040 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
2f050 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
2f060 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
2f070 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
2f080 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
2f090 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2f0a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f0b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2f0c0 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46  eger, 1, iAbortF
2f0d0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2f0e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74  Comment((v, "set
2f0f0 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
2f100 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f110 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2f120 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
2f130 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
2f140 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2f150 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74  el(v, addrOutput
2f160 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72  Row);.      addr
2f170 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
2f180 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2f190 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
2f1a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f1b0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65  , OP_IfPos, iUse
2f1c0 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
2f1d0 52 6f 77 2b 32 29 3b 20 56 64 62 65 43 6f 76 65  Row+2); VdbeCove
2f1e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
2f1f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2f200 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
2f210 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
2f220 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
2f230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2f240 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
2f250 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
2f260 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
2f270 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
2f280 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2f290 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
2f2a0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
2f2b0 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
2f2c0 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
2f2d0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2f2e0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
2f2f0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
2f300 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f  pEList, -1, &sSo
2f310 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
2f320 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74            &sDist
2f330 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
2f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f350 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2f360 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
2f370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f380 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2f390 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2f3a0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
2f3b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
2f3c0 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
2f3d0 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
2f3e0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2f3f0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2f400 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
2f410 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
2f420 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
2f430 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2f440 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2f450 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  v, addrReset);. 
2f460 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
2f470 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2f480 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2f490 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f4a0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2f4b0 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20  regReset);.     
2f4c0 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
2f4d0 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e  pGroupBy.  Begin
2f4e0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
2f4f0 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50  es without GROUP
2f500 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65   BY: */.    else
2f510 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
2f520 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66  t *pDel = 0;.#if
2f530 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f540 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
2f550 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
2f560 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d       if( (pTab =
2f570 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70   isSimpleCount(p
2f580 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30  , &sAggInfo))!=0
2f590 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2f5a0 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  f isSimpleCount(
2f5b0 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  ) returns a poin
2f5c0 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73  ter to a Table s
2f5d0 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20  tructure, then. 
2f5e0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
2f5f0 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  L statement is o
2f600 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20  f the form:.    
2f610 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2f620 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
2f630 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20  (*) FROM <tbl>. 
2f640 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2f650 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54    ** where the T
2f660 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72  able structure r
2f670 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e  eturned represen
2f680 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a  ts table <tbl>..
2f690 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2f6a0 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65     ** This state
2f6b0 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f  ment is so commo
2f6c0 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74  n that it is opt
2f6d0 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79  imized specially
2f6e0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
2f6f0 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75   OP_Count instru
2f700 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65  ction is execute
2f710 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20  d either on the 
2f720 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61  intkey table tha
2f730 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
2f740 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66  tains the data f
2f750 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f  or table <tbl> o
2f760 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20  r on one of its 
2f770 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20  indexes. It.    
2f780 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72      ** is better
2f790 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
2f7a0 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20  op on an index, 
2f7b0 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  as indexes are a
2f7c0 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  lmost.        **
2f7d0 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61   always spread a
2f7e0 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73  cross less pages
2f7f0 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72   than their corr
2f800 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73  esponding tables
2f810 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2f820 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
2f830 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
2f840 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
2f850 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
2f860 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ema);.        co
2f870 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70  nst int iCsr = p
2f880 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
2f890 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
2f8a0 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20  scan b-tree */. 
2f8b0 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
2f8c0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
2f8d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f8e0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2f8f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49   */.        KeyI
2f900 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
2f910 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2f920 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20   /* Keyinfo for 
2f930 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f  scanned index */
2f940 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
2f950 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
2f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f970 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e   Best index foun
2f980 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  d so far */.    
2f990 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
2f9a0 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20  pTab->tnum;     
2f9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
2f9c0 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64   page of scanned
2f9d0 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
2f9e0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
2f9f0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
2fa00 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
2fa10 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
2fa20 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
2fa30 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
2fa40 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
2fa50 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
2fa60 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68  for the index th
2fa70 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73  at has the lowes
2fa80 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20  t scan cost..   
2fa90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2faa0 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20  ** (2011-04-15) 
2fab0 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c  Do not do a full
2fac0 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72   scan of an unor
2fad0 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20  dered index..   
2fae0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2faf0 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20  ** (2013-10-03) 
2fb00 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65  Do not count the
2fb10 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61   entries in a pa
2fb20 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20  rtial index..   
2fb30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2fb40 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74  ** In practice t
2fb50 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
2fb60 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ture will not be
2fb70 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c   used. It is onl
2fb80 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  y .        ** pa
2fb90 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f  ssed to keep OP_
2fba0 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a  OpenRead happy..
2fbb0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2fbc0 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
2fbd0 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d  (pTab) ) pBest =
2fbe0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
2fbf0 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
2fc00 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
2fc10 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
2fc20 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
2fc30 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
2fc40 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
2fc50 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
2fc60 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49      && pIdx->szI
2fc70 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
2fc80 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20  bRow.           
2fc90 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  && pIdx->pPartId
2fca0 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20  xWhere==0.      
2fcb0 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20       && (!pBest 
2fcc0 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  || pIdx->szIdxRo
2fcd0 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f  w<pBest->szIdxRo
2fce0 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  w).          ){.
2fcf0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
2fd00 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
2fd10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2fd20 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
2fd30 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
2fd40 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e  Root = pBest->tn
2fd50 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b  um;.          pK
2fd60 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
2fd70 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
2fd80 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
2fd90 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2fda0 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
2fdb0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
2fdc0 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
2fdd0 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
2fde0 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
2fdf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fe00 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
2fe10 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
2fe20 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  t, iDb, 1);.    
2fe30 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
2fe40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2fe50 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2fe60 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
2fe70 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2fe80 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
2fe90 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2fea0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2feb0 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73  P_Count, iCsr, s
2fec0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
2fed0 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
2fee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fef0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
2ff00 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  Csr);.        ex
2ff10 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2ff20 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
2ff30 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Best);.      }el
2ff40 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
2ff50 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
2ff60 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
2ff70 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
2ff80 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
2ff90 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
2ffa0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
2ffb0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2ffc0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
2ffd0 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
2ffe0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
2fff0 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
30000 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
30010 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
30020 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
30030 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
30040 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
30050 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
30060 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
30070 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
30080 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
30090 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
300a0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
300b0 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
300c0 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
300d0 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
300e0 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
300f0 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
30100 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
30110 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
30120 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
30130 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
30140 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
30150 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
30160 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
30170 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
30180 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
30190 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
301a0 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
301b0 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
301c0 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
301d0 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
301e0 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
301f0 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
30200 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
30210 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
30220 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
30230 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
30240 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
30250 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
30260 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77  havior as follow
30270 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
30280 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
30290 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
302a0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
302b0 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
302c0 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ded by.        *
302d0 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
302e0 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
302f0 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
30300 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
30310 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ue.        **   
30320 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20    for x..       
30330 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
30340 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72   + The optimizer
30350 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
30360 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74   (the thing that
30370 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20   decides which. 
30380 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
30390 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
303a0 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
303b0 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
303c0 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
303d0 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
303e0 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
303f0 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
30400 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
30410 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
30420 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
30430 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
30440 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
30450 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
30460 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45      */.        E
30470 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
30480 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
30490 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52   flag = WHERE_OR
304a0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
304b0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61        .        a
304c0 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
304d0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
304e0 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
304f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
30500 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b  p->pHaving==0 ){
30510 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  .          flag 
30520 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73  = minMaxQuery(&s
30530 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61  AggInfo, &pMinMa
30540 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
30550 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
30560 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61  ag==0 || (pMinMa
30570 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d  x!=0 && pMinMax-
30580 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20  >nExpr==1) );.. 
30590 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20         if( flag 
305a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
305b0 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
305c0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
305d0 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20  inMax, 0);.     
305e0 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
305f0 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Max;.          i
30600 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64  f( pMinMax && !d
30610 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
30620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
30630 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
30640 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
30650 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
30660 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20   ?1:0;.         
30670 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
30680 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
30690 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
306a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
306b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
306c0 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
306d0 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
306e0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
306f0 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  se.  The.       
30700 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
30710 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
30720 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
30730 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
30740 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75          ** of ou
30750 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tput..        */
30760 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63  .        resetAc
30770 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
30780 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
30790 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
307a0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
307b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
307c0 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d  t, pWhere, pMinM
307d0 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20  ax,0,flag,0);.  
307e0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
307f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
30800 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
30810 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
30820 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
30830 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
30840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
30850 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
30860 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
30870 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  fo);.        ass
30880 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20  ert( pMinMax==0 
30890 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  || pMinMax->nExp
308a0 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  r==1 );.        
308b0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
308c0 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
308d0 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>0 ){.         
308e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
308f0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
30900 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
30910 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
30920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
30930 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
30940 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
30950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
30960 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
30970 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
30980 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
30990 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
309a0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
309b0 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
309c0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
309d0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
309e0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
309f0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
30a00 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
30a10 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
30a20 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
30a30 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
30a40 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
30a50 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
30a60 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
30a70 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20  >pEList, -1, 0, 
30a80 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
30a90 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
30aa0 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
30ab0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
30ac0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
30ad0 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
30ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
30af0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
30b00 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
30b10 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
30b20 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
30b30 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
30b40 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
30b50 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
30b60 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  RED ){.    expla
30b70 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
30b80 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b  se, "DISTINCT");
30b90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
30ba0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
30bb0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
30bc0 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
30bd0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
30be0 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
30bf0 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
30c00 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
30c10 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
30c20 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c  erBy ){.    expl
30c30 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
30c40 72 73 65 2c 20 73 53 6f 72 74 2e 6e 4f 42 53 61  rse, sSort.nOBSa
30c50 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
30c60 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
30c70 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
30c80 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
30c90 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
30ca0 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
30cb0 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
30cc0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
30cd0 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
30ce0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
30cf0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
30d00 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
30d10 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
30d20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
30d30 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
30d40 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
30d50 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
30d60 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
30d70 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
30d80 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
30d90 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
30da0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
30db0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
30dc0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
30dd0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
30de0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
30df0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
30e00 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
30e10 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
30e20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
30e30 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
30e40 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
30e50 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
30e60 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
30e70 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
30e80 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
30e90 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
30ea0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
30eb0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
30ec0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
30ed0 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
30ee0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
30ef0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
30f00 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
30f10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
30f20 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
30f30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
30f40 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
30f50 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45  aFunc);.#if SELE
30f60 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
30f70 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
30f80 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70  pParse,p,("end p
30f90 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
30fa0 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
30fb0 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
30fc0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
30fd0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
30fe0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  DEBUG./*.** Gene
30ff0 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61  rate a human-rea
31000 64 61 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f  dable descriptio
31010 6e 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63  n of a the Selec
31020 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  t object..*/.voi
31030 64 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65  d sqlite3TreeVie
31040 77 53 65 6c 65 63 74 28 54 72 65 65 56 69 65 77  wSelect(TreeView
31050 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74 20 53   *pView, const S
31060 65 6c 65 63 74 20 2a 70 2c 20 75 38 20 6d 6f 72  elect *p, u8 mor
31070 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20 69 6e  eToFollow){.  in
31080 74 20 6e 20 3d 20 30 3b 0a 20 20 70 56 69 65 77  t n = 0;.  pView
31090 20 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69   = sqlite3TreeVi
310a0 65 77 50 75 73 68 28 70 56 69 65 77 2c 20 6d 6f  ewPush(pView, mo
310b0 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 73  reToFollow);.  s
310c0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
310d0 6e 65 28 70 56 69 65 77 2c 20 22 53 45 4c 45 43  ne(pView, "SELEC
310e0 54 25 73 25 73 20 28 30 78 25 70 29 22 2c 0a 20  T%s%s (0x%p)",. 
310f0 20 20 20 28 28 70 2d 3e 73 65 6c 46 6c 61 67 73     ((p->selFlags
31100 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 20   & SF_Distinct) 
31110 3f 20 22 20 44 49 53 54 49 4e 43 54 22 20 3a 20  ? " DISTINCT" : 
31120 22 22 29 2c 0a 20 20 20 20 28 28 70 2d 3e 73 65  ""),.    ((p->se
31130 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
31140 65 67 61 74 65 29 20 3f 20 22 20 61 67 67 5f 66  egate) ? " agg_f
31150 6c 61 67 22 20 3a 20 22 22 29 2c 20 70 0a 20 20  lag" : ""), p.  
31160 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  );.  if( p->pSrc
31170 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   && p->pSrc->nSr
31180 63 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70  c ) n++;.  if( p
31190 2d 3e 70 57 68 65 72 65 20 29 20 6e 2b 2b 3b 0a  ->pWhere ) n++;.
311a0 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
311b0 79 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70  y ) n++;.  if( p
311c0 2d 3e 70 48 61 76 69 6e 67 20 29 20 6e 2b 2b 3b  ->pHaving ) n++;
311d0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
311e0 42 79 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20  By ) n++;.  if( 
311f0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 6e 2b 2b 3b  p->pLimit ) n++;
31200 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65  .  if( p->pOffse
31210 74 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70  t ) n++;.  if( p
31220 2d 3e 70 50 72 69 6f 72 20 29 20 6e 2b 2b 3b 0a  ->pPrior ) n++;.
31230 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31240 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c  wExprList(pView,
31250 20 70 2d 3e 70 45 4c 69 73 74 2c 20 28 6e 2d 2d   p->pEList, (n--
31260 29 3e 30 2c 20 22 72 65 73 75 6c 74 2d 73 65 74  )>0, "result-set
31270 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72  ");.  if( p->pSr
31280 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53  c && p->pSrc->nS
31290 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  rc ){.    int i;
312a0 0a 20 20 20 20 70 56 69 65 77 20 3d 20 73 71 6c  .    pView = sql
312b0 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68  ite3TreeViewPush
312c0 28 70 56 69 65 77 2c 20 28 6e 2d 2d 29 3e 30 29  (pView, (n--)>0)
312d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
312e0 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
312f0 20 22 46 52 4f 4d 22 29 3b 0a 20 20 20 20 66 6f   "FROM");.    fo
31300 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
31310 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
31320 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
31330 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
31340 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
31350 0a 20 20 20 20 20 20 53 74 72 41 63 63 75 6d 20  .      StrAccum 
31360 78 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c  x;.      char zL
31370 69 6e 65 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20  ine[100];.      
31380 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
31390 6e 69 74 28 26 78 2c 20 30 2c 20 7a 4c 69 6e 65  nit(&x, 0, zLine
313a0 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  , sizeof(zLine),
313b0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
313c0 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c  e3XPrintf(&x, 0,
313d0 20 22 7b 25 64 2c 2a 7d 22 2c 20 70 49 74 65 6d   "{%d,*}", pItem
313e0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
313f0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
31400 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  tabase ){.      
31410 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
31420 28 26 78 2c 20 30 2c 20 22 20 25 73 2e 25 73 22  (&x, 0, " %s.%s"
31430 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
31440 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  se, pItem->zName
31450 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
31460 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  f( pItem->zName 
31470 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31480 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c  e3XPrintf(&x, 0,
31490 20 22 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a   " %s", pItem->z
314a0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
314b0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
314c0 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
314d0 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
314e0 78 2c 20 30 2c 20 22 20 74 61 62 6e 61 6d 65 3d  x, 0, " tabname=
314f0 25 51 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %Q", pItem->pTab
31500 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
31510 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
31520 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
31530 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
31540 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 28 41 53  ntf(&x, 0, " (AS
31550 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41   %s)", pItem->zA
31560 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
31570 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
31580 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
31590 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  FT ){.        sq
315a0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
315b0 20 30 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22   0, " LEFT-JOIN"
315c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
315d0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
315e0 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 20 20  Finish(&x);.    
315f0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31600 77 49 74 65 6d 28 70 56 69 65 77 2c 20 7a 4c 69  wItem(pView, zLi
31610 6e 65 2c 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  ne, i<p->pSrc->n
31620 53 72 63 2d 31 29 3b 20 0a 20 20 20 20 20 20 69  Src-1); .      i
31630 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
31640 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
31650 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
31660 63 74 28 70 56 69 65 77 2c 20 70 49 74 65 6d 2d  ct(pView, pItem-
31670 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
31680 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
31690 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
316a0 56 69 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20  View);.    }.   
316b0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
316c0 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a  Pop(pView);.  }.
316d0 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
316e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
316f0 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
31700 2c 20 22 57 48 45 52 45 22 2c 20 28 6e 2d 2d 29  , "WHERE", (n--)
31710 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >0);.    sqlite3
31720 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
31730 65 77 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 30  ew, p->pWhere, 0
31740 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
31750 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
31760 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
31770 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
31780 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
31790 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d  prList(pView, p-
317a0 3e 70 47 72 6f 75 70 42 79 2c 20 28 6e 2d 2d 29  >pGroupBy, (n--)
317b0 3e 30 2c 20 22 47 52 4f 55 50 42 59 22 29 3b 0a  >0, "GROUPBY");.
317c0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
317d0 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
317e0 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
317f0 70 56 69 65 77 2c 20 22 48 41 56 49 4e 47 22 2c  pView, "HAVING",
31800 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73   (n--)>0);.    s
31810 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
31820 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 48 61  pr(pView, p->pHa
31830 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 73 71  ving, 0);.    sq
31840 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
31850 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69  (pView);.  }.  i
31860 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
31870 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
31880 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56  eViewExprList(pV
31890 69 65 77 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  iew, p->pOrderBy
318a0 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 4f 52 44 45  , (n--)>0, "ORDE
318b0 52 42 59 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  RBY");.  }.  if(
318c0 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
318d0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
318e0 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 4c 49  wItem(pView, "LI
318f0 4d 49 54 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a  MIT", (n--)>0);.
31900 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
31910 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
31920 2d 3e 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  ->pLimit, 0);.  
31930 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31940 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d  wPop(pView);.  }
31950 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65  .  if( p->pOffse
31960 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
31970 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
31980 65 77 2c 20 22 4f 46 46 53 45 54 22 2c 20 28 6e  ew, "OFFSET", (n
31990 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69  --)>0);.    sqli
319a0 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
319b0 70 56 69 65 77 2c 20 70 2d 3e 70 4f 66 66 73 65  pView, p->pOffse
319c0 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
319d0 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
319e0 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  iew);.  }.  if( 
319f0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
31a00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
31a10 20 3d 20 22 55 4e 49 4f 4e 22 3b 0a 20 20 20 20   = "UNION";.    
31a20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
31a30 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41  .      case TK_A
31a40 4c 4c 3a 20 20 20 20 20 20 20 20 20 7a 4f 70 20  LL:         zOp 
31a50 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
31a60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
31a70 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
31a80 20 20 7a 4f 70 20 3d 20 22 49 4e 54 45 52 53 45    zOp = "INTERSE
31a90 43 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  CT";  break;.   
31aa0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
31ab0 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45  T:      zOp = "E
31ac0 58 43 45 50 54 22 3b 20 20 20 20 20 62 72 65 61  XCEPT";     brea
31ad0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  k;.    }.    sql
31ae0 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d  ite3TreeViewItem
31af0 28 70 56 69 65 77 2c 20 7a 4f 70 2c 20 28 6e 2d  (pView, zOp, (n-
31b00 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  -)>0);.    sqlit
31b10 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
31b20 28 70 56 69 65 77 2c 20 70 2d 3e 70 50 72 69 6f  (pView, p->pPrio
31b30 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
31b40 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
31b50 69 65 77 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  iew);.  }.  sqli
31b60 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
31b70 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  View);.}.#endif 
31b80 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
31b90 2a 2f 0a                                         */.