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

Artifact 718954db86277d696c520fe671148db1e9c4ed3c:


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 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e  its */.};.#defin
0840: 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  e SORTFLAG_UseSo
0850: 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20  rter  0x01   /* 
0860: 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69  Use SorterOpen i
0870: 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70  nstead of OpenEp
0880: 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a  hemeral */../*.*
0890: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65  * Delete all the
08a0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65   content of a Se
08b0: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20  lect structure. 
08c0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20   Deallocate the 
08d0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73  structure.** its
08e0: 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65  elf only if bFre
08f0: 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  e is true..*/.st
0900: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53  atic void clearS
0910: 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  elect(sqlite3 *d
0920: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
0930: 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c  t bFree){.  whil
0940: 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65  e( p ){.    Sele
0950: 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
0960: 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69  pPrior;.    sqli
0970: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0980: 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e(db, p->pEList)
0990: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
09a0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
09b0: 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  ->pSrc);.    sql
09c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
09d0: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
09e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
09f0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0a00: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
0a10: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0a20: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  (db, p->pHaving)
0a30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
0a40: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
0a50: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
0a60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0a70: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
0a80: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
0a90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0aa0: 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >pOffset);.    s
0ab0: 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65  qlite3WithDelete
0ac0: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
0ad0: 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
0ae0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
0af0: 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 50  , p);.    p = pP
0b00: 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65 20  rior;.    bFree 
0b10: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
0b20: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53  * Initialize a S
0b30: 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
0b40: 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
0b50: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
0b60: 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70  it(SelectDest *p
0b70: 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c  Dest, int eDest,
0b80: 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70   int iParm){.  p
0b90: 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75  Dest->eDest = (u
0ba0: 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74  8)eDest;.  pDest
0bb0: 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72  ->iSDParm = iPar
0bc0: 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53  m;.  pDest->affS
0bd0: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
0be0: 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  ->iSdst = 0;.  p
0bf0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b  Dest->nSdst = 0;
0c00: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
0c10: 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74  ate a new Select
0c20: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
0c30: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
0c40: 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63  to that.** struc
0c50: 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20  ture..*/.Select 
0c60: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65  *sqlite3SelectNe
0c70: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
0c80: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
0c90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
0ca0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
0cb0: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
0cc0: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
0cd0: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
0ce0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
0cf0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
0d00: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
0d10: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
0d20: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
0d30: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
0d40: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
0d50: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0d60: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
0d70: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
0d80: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
0d90: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
0da0: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
0db0: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
0dc0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
0dd0: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
0de0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
0df0: 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20 20   u16 selFlags,  
0e00: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70         /* Flag p
0e10: 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20  arameters, such 
0e20: 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a  as SF_Distinct *
0e30: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
0e40: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d  ,         /* LIM
0e50: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
0e60: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
0e70: 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65  /.  Expr *pOffse
0e80: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  t         /* OFF
0e90: 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  SET value.  NULL
0ea0: 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74   means no offset
0eb0: 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
0ec0: 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
0ed0: 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74  standin;.  sqlit
0ee0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0ef0: 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
0f00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
0f10: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
0f20: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
0f30: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
0f40: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
0f50: 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20  led );.    pNew 
0f60: 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a  = &standin;.  }.
0f70: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
0f80: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
0f90: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
0fa0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
0fb0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
0fc0: 54 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29 29 3b  TK_ASTERISK,0));
0fd0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0fe0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0ff0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
1000: 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 73 65  LECT;.  pNew->se
1010: 6c 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c 61 67  lFlags = selFlag
1020: 73 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  s;.  pNew->iLimi
1030: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  t = 0;.  pNew->i
1040: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 23 69 66 20  Offset = 0;.#if 
1050: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1060: 4c 45 44 0a 20 20 70 4e 65 77 2d 3e 7a 53 65 6c  LED.  pNew->zSel
1070: 4e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e  Name[0] = 0;.#en
1080: 64 69 66 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  dif.  pNew->addr
1090: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
10a0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
10b0: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
10c0: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
10d0: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
10e0: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
10f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1100: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
1110: 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  Src));.  pNew->p
1120: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e  Src = pSrc;.  pN
1130: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ew->pWhere = pWh
1140: 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  ere;.  pNew->pGr
1150: 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
1160: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
1170: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70  g = pHaving;.  p
1180: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
1190: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77  pOrderBy;.  pNew
11a0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
11b0: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pNew->pNext = 0;
11c0: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
11d0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77  = pLimit;.  pNew
11e0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
11f0: 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69  set;.  pNew->pWi
1200: 74 68 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  th = 0;.  assert
1210: 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  ( pOffset==0 || 
1220: 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50 61  pLimit!=0 || pPa
1230: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 64  rse->nErr>0 || d
1240: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
1250: 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  =0 );.  if( db->
1260: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b  mallocFailed ) {
1270: 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74  .    clearSelect
1280: 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21  (db, pNew, pNew!
1290: 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20  =&standin);.    
12a0: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pNew = 0;.  }els
12b0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
12c0: 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20  New->pSrc!=0 || 
12d0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
12e0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
12f0: 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29  pNew!=&standin )
1300: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
1310: 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  .}..#if SELECTTR
1320: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
1330: 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
1340: 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  f a Select objec
1350: 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
1360: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53  3SelectSetName(S
1370: 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20  elect *p, const 
1380: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1390: 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29  if( p && zName )
13a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
13b0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
13c0: 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a  >zSelName), p->z
13d0: 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  SelName, "%s", z
13e0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Name);.  }.}.#en
13f0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  dif.../*.** Dele
1400: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
1410: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
1420: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
1430: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
1440: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1450: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1460: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
1470: 0a 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64  .  clearSelect(d
1480: 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  b, p, 1);.}../*.
1490: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
14a0: 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
14b0: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
14c0: 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70  tement in a comp
14d0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
14e0: 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68  Select *findRigh
14f0: 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29  tmost(Select *p)
1500: 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e  {.  while( p->pN
1510: 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65  ext ) p = p->pNe
1520: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  xt;.  return p;.
1530: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31  }../*.** Given 1
1540: 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72   to 3 identifier
1550: 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65 20  s preceding the 
1560: 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65  JOIN keyword, de
1570: 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74  termine the.** t
1580: 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65  ype of join.  Re
1590: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
15a0: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78  constant that ex
15b0: 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70  presses that typ
15c0: 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66  e.** in terms of
15d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
15e0: 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a  it values:.**.**
15f0: 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a       JT_INNER.**
1600: 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a       JT_CROSS.**
1610: 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a       JT_OUTER.**
1620: 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a       JT_NATURAL.
1630: 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a  **     JT_LEFT.*
1640: 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a  *     JT_RIGHT.*
1650: 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65  *.** A full oute
1660: 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f  r join is the co
1670: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f  mbination of JT_
1680: 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48  LEFT and JT_RIGH
1690: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  T..**.** If an i
16a0: 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70  llegal or unsupp
16b0: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20  orted join type 
16c0: 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74  is seen, then st
16d0: 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  ill return.** a 
16e0: 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70  join type, but p
16f0: 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  ut an error in t
1700: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
1710: 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
1720: 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73  te3JoinType(Pars
1730: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
1740: 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c   *pA, Token *pB,
1750: 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69   Token *pC){.  i
1760: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  nt jointype = 0;
1770: 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b  .  Token *apAll[
1780: 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a  3];.  Token *p;.
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33    0123456789 123
17c0: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
17d0: 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63   123 */.  static
17e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
17f0: 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61  Text[] = "natura
1800: 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c  leftouterightful
1810: 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20  linnercross";.  
1820: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1830: 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20  uct {.    u8 i; 
1840: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
1850: 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74  ing of keyword t
1860: 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b  ext in zKeyText[
1870: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61  ] */.    u8 nCha
1880: 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20  r;    /* Length 
1890: 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69  of the keyword i
18a0: 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  n characters */.
18b0: 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20      u8 code;    
18c0: 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61   /* Join type ma
18d0: 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f  sk */.  } aKeywo
18e0: 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  rd[] = {.    /* 
18f0: 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20  natural */ { 0, 
1900: 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20   7, JT_NATURAL  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1920: 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20  .    /* left    
1930: 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c  */ { 6,  4, JT_L
1940: 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20  EFT|JT_OUTER    
1950: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1960: 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c  outer   */ { 10,
1970: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20   5, JT_OUTER    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1990: 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20  .    /* right   
19a0: 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52  */ { 14, 5, JT_R
19b0: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  IGHT|JT_OUTER   
19c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
19d0: 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c  full    */ { 19,
19e0: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
19f0: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
1a00: 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20  .    /* inner   
1a10: 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49  */ { 23, 5, JT_I
1a20: 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NNER            
1a30: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1a40: 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c  cross   */ { 28,
1a50: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
1a60: 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c  CROSS         },
1a70: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
1a80: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
1a90: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
1aa0: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
1ab0: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
1ac0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
1ad0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
1ae0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
1af0: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
1b00: 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b  e(aKeyword); j++
1b10: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1b20: 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e  n==aKeyword[j].n
1b30: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
1b40: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
1b50: 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20  mp((char*)p->z, 
1b60: 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f  &zKeyText[aKeywo
1b70: 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d  rd[j].i], p->n)=
1b80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
1b90: 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f  intype |= aKeywo
1ba0: 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  rd[j].code;.    
1bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1bc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
1bd0: 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a  tcase( j==0 || j
1be0: 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a  ==1 || j==2 || j
1bf0: 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a  ==3 || j==4 || j
1c00: 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20  ==5 || j==6 );. 
1c10: 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53     if( j>=ArrayS
1c20: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b  ize(aKeyword) ){
1c30: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1c40: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
1c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c60: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
1c70: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
1c80: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
1c90: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
1ca0: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
1cb0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
1cc0: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
1cd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d  onst char *zSp =
1ce0: 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74   " ";.    assert
1cf0: 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pB!=0 );.    i
1d00: 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b  f( pC==0 ){ zSp+
1d10: 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33  +; }.    sqlite3
1d20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d30: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73   "unknown or uns
1d40: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
1d50: 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54  pe: ".       "%T
1d60: 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42   %T%s%T", pA, pB
1d70: 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20  , zSp, pC);.    
1d80: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1d90: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
1da0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1db0: 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20  OUTER)!=0 .     
1dc0: 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65      && (jointype
1dd0: 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   & (JT_LEFT|JT_R
1de0: 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20  IGHT))!=JT_LEFT 
1df0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1e00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1e10: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
1e20: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1e30: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1e40: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1e50: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1e60: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1e70: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e90: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1ea0: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
1eb0: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
1ec0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
1ed0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
1ee0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
1ef0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
1f00: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
1f10: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
1f20: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1f30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1f40: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1f50: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1f60: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1f70: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1f80: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1f90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
1fb0: 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74 61  h the first N ta
1fc0: 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72  bles in pSrc, fr
1fd0: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1fe0: 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a  , looking for a.
1ff0: 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68 61  ** table that ha
2000: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  s a column named
2010: 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57   zCol.  .**.** W
2020: 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a  hen found, set *
2030: 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c  piTab and *piCol
2040: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e   to the table in
2050: 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69  dex and column i
2060: 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  ndex.** of the m
2070: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61  atching column a
2080: 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a  nd return TRUE..
2090: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75  **.** If not fou
20a0: 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  nd, return FALSE
20b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20c0: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
20d0: 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  dex(.  SrcList *
20e0: 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41  pSrc,       /* A
20f0: 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74  rray of tables t
2100: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
2110: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
2120: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2130: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e  tables in pSrc->
2140: 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  a[] to search */
2150: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2160: 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Col,    /* Name 
2170: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65  of the column we
2180: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
2190: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62   */.  int *piTab
21a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ,          /* Wr
21b0: 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72  ite index of pSr
21c0: 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20  c->a[] here */. 
21d0: 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20   int *piCol     
21e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69        /* Write i
21f0: 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b  ndex of pSrc->a[
2200: 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43  *piTab].pTab->aC
2210: 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ol[] here */.){.
2220: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2230: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
2240: 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
2250: 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  s in pSrc */.  i
2260: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
2270: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2280: 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20  column matching 
2290: 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  zCol */..  asser
22a0: 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28  t( (piTab==0)==(
22b0: 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a  piCol==0) );  /*
22c0: 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72   Both or neither
22d0: 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66   are NULL */.  f
22e0: 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b  or(i=0; i<N; i++
22f0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f  ){.    iCol = co
2300: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e  lumnIndex(pSrc->
2310: 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29  a[i].pTab, zCol)
2320: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
2330: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2340: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  iTab ){.        
2350: 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20  *piTab = i;.    
2360: 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f      *piCol = iCo
2370: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
2380: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
23a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23b0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
23c0: 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70  to add terms imp
23d0: 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e  lied by JOIN syn
23e0: 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  tax to the.** WH
23f0: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
2400: 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43  ssion of a SELEC
2410: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65  T statement. The
2420: 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68   new term, which
2430: 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74  .** is ANDed wit
2440: 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 57  h the existing W
2450: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20  HERE clause, is 
2460: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
2470: 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31  **    (tab1.col1
2480: 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a   = tab2.col2).**
2490: 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20 69  .** where tab1 i
24a0: 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74 61  s the iSrc'th ta
24b0: 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70  ble in SrcList p
24c0: 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73 20  Src and tab2 is 
24d0: 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29  the .** (iSrc+1)
24e0: 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31  'th. Column col1
24f0: 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c   is column iColL
2500: 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64  eft of tab1, and
2510: 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75   col2 is.** colu
2520: 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20  mn iColRight of 
2530: 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tab2..*/.static 
2540: 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72  void addWhereTer
2550: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
2560: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2570: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
2580: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
2590: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
25c0: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
25d0: 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20  .  int iLeft,   
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
2600: 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f  irst table to jo
2610: 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  in in pSrc */.  
2620: 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20  int iColLeft,   
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
2650: 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c  mn in first tabl
2660: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68  e */.  int iRigh
2670: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2680: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2690: 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  of second table 
26a0: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
26b0: 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20   iColRight,     
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
26e0: 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  in second table 
26f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72  */.  int isOuter
2700: 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Join,           
2710: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2720: 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52  this is an OUTER
2730: 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20   join */.  Expr 
2740: 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20 20  **ppWhere       
2750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2760: 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45 20  /OUT: The WHERE 
2770: 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f  clause to add to
2780: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
2790: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
27a0: 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a  b;.  Expr *pE1;.
27b0: 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45    Expr *pE2;.  E
27c0: 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73  xpr *pEq;..  ass
27d0: 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68  ert( iLeft<iRigh
27e0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
27f0: 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74  Src->nSrc>iRight
2800: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2810: 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61  rc->a[iLeft].pTa
2820: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
2830: 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70  Src->a[iRight].p
2840: 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20  Tab );..  pE1 = 
2850: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
2860: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
2870: 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66  , iLeft, iColLef
2880: 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69  t);.  pE2 = sqli
2890: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
28a0: 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52  xpr(db, pSrc, iR
28b0: 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29  ight, iColRight)
28c0: 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74  ;..  pEq = sqlit
28d0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
28e0: 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 2c  TK_EQ, pE1, pE2,
28f0: 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26   0);.  if( pEq &
2900: 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b  & isOuterJoin ){
2910: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
2920: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f  erty(pEq, EP_Fro
2930: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
2940: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2950: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b  erty(pEq, EP_Tok
2960: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2970: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
2980: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 71  tVVAProperty(pEq
2990: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
29a0: 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a      pEq->iRightJ
29b0: 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29  oinTable = (i16)
29c0: 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d  pE2->iTable;.  }
29d0: 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71  .  *ppWhere = sq
29e0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
29f0: 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b   *ppWhere, pEq);
2a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2a10: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2a20: 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65  operty on all te
2a30: 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  rms of the given
2a40: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
2a50: 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72  And set the Expr
2a60: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2a70: 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65   to iTable for e
2a80: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
2a90: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
2aa0: 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f  **.** The EP_Fro
2ab0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69  mJoin property i
2ac0: 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20  s used on terms 
2ad0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
2ae0: 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20   to tell.** the 
2af0: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
2b00: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
2b10: 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20   that this term 
2b20: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  is part of the.*
2b30: 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69  * join restricti
2b40: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  on specified in 
2b50: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2b60: 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61  clause and not a
2b70: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
2b80: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45  more general WHE
2b90: 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73  RE clause.  Thes
2ba0: 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65  e terms are move
2bb0: 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a  d over to the.**
2bc0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75   WHERE clause du
2bd0: 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73  ring join proces
2be0: 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64  sing but we need
2bf0: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
2c00: 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e  t they.** origin
2c10: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
2c20: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
2c30: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
2c40: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2c50: 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63  ells the WHERE c
2c60: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2c70: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70   that the.** exp
2c80: 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20  ression depends 
2c90: 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a  on table iRightJ
2ca0: 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66  oinTable even if
2cb0: 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e   that table is n
2cc0: 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79  ot.** explicitly
2cd0: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2ce0: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  e expression.  T
2cf0: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
2d00: 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72  is needed.** for
2d10: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
2d20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
2d30: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
2d40: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
2d50: 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35  =t2.b AND t1.x=5
2d60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65  .**.** The where
2d70: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
2d80: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2d90: 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d  ing of the t1.x=
2da0: 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20  5.** term until 
2db0: 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f  after the t2 loo
2dc0: 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  p of the join.  
2dd0: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a  In that way, a.*
2de0: 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69  * NULL t2 row wi
2df0: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77  ll be inserted w
2e00: 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e  henever t1.x!=5.
2e10: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a    If we do not.*
2e20: 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  * defer the hand
2e30: 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20  ling of t1.x=5, 
2e40: 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  it will be proce
2e50: 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ssed immediately
2e60: 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31  .** after the t1
2e70: 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77   loop and rows w
2e80: 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c  ith t1.x!=5 will
2e90: 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e   never appear in
2ea0: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20  .** the output, 
2eb0: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  which is incorre
2ec0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2ed0: 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45  id setJoinExpr(E
2ee0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
2ef0: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
2f00: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2f10: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
2f20: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
2f30: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2f40: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
2f50: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2f60: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2f70: 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  VAProperty(p, EP
2f80: 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
2f90: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
2fa0: 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65  le = (i16)iTable
2fb0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
2fc0: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20  =TK_FUNCTION && 
2fd0: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
2fe0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2ff0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78   for(i=0; i<p->x
3000: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  .pList->nExpr; i
3010: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ++){.        set
3020: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c  JoinExpr(p->x.pL
3030: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
3040: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   iTable);.      
3050: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a  }.    }.    setJ
3060: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
3070: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
3080: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
3090: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
30a0: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
30b0: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
30c0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
30d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
30e0: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
30f0: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
3100: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
3110: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
3120: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
3130: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
3140: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
3150: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
3160: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
3170: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
3180: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
3190: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
31a0: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
31b0: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
31c0: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
31d0: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
31e0: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
31f0: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
3200: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
3210: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
3220: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
3230: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
3240: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
3250: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
3260: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
3270: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
3280: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
3290: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
32a0: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
32b0: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
32c0: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
32d0: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
32e0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
32f0: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
3300: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
3310: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
3320: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
3330: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
3340: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
3350: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
3360: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
3370: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
3380: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3390: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
33a0: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
33b0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
33c0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
33d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
33e0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
33f0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3400: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3410: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3420: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3430: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3440: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
3450: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
3460: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
3470: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
3480: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
3490: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
34a0: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
34b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
34c0: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
34d0: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
34e0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
34f0: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
3500: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
3510: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
3520: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
3530: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
3540: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
3550: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
3560: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
3570: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
3580: 3d 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f  = (pRight->fg.jo
3590: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
35a0: 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  R)!=0;..    /* W
35b0: 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20  hen the NATURAL 
35c0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
35d0: 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c  nt, add WHERE cl
35e0: 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20  ause terms for. 
35f0: 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75     ** every colu
3600: 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  mn that the two 
3610: 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63  tables have in c
3620: 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ommon..    */.  
3630: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67    if( pRight->fg
3640: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
3650: 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20  ATURAL ){.      
3660: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
3670: 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  || pRight->pUsin
3680: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
3690: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
36a0: 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20  rse, "a NATURAL 
36b0: 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76  join may not hav
36c0: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
36d0: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
36e0: 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20  lause", 0);.    
36f0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3700: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
3710: 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62  j=0; j<pRightTab
3720: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
3730: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
3740: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
3750: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69  column in the ri
3760: 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ght table */.   
3770: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
3780: 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20      /* Matching 
3790: 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  left table */.  
37a0: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
37b0: 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67  ol;  /* Matching
37c0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c   column in the l
37d0: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  eft table */..  
37e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52        zName = pR
37f0: 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  ightTab->aCol[j]
3800: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3810: 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  if( tableAndColu
3820: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3830: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3840: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a  , &iLeftCol) ){.
3850: 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65            addWhe
3860: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3870: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3880: 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20  tCol, i+1, j,.  
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70       isOuter, &p
38b0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
38c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
38d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
38e0: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
38f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
3900: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
3910: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3920: 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69  ight->pOn && pRi
3930: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3940: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3950: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
3960: 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f  nnot have both O
3970: 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20  N and USING ".  
3980: 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69        "clauses i
3990: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22  n the same join"
39a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
39b0: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
39c0: 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75   Add the ON clau
39d0: 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
39e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
39f0: 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  e, connected by.
3a00: 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70      ** an AND op
3a10: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  erator..    */. 
3a20: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3a30: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
3a40: 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69  isOuter ) setJoi
3a50: 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f  nExpr(pRight->pO
3a60: 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73  n, pRight->iCurs
3a70: 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57  or);.      p->pW
3a80: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
3a90: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3aa0: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69  , p->pWhere, pRi
3ab0: 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  ght->pOn);.     
3ac0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30   pRight->pOn = 0
3ad0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3ae0: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
3af0: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
3b00: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
3b10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
3b20: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
3b30: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
3b40: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
3b50: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
3b60: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
3b70: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
3b80: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
3b90: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
3ba0: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
3bb0: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
3bc0: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
3bd0: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
3be0: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
3bf0: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
3c00: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
3c10: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
3c20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
3c30: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
3c40: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
3c50: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
3c60: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
3c70: 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  ( pRight->pUsing
3c80: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
3c90: 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74   *pList = pRight
3ca0: 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20  ->pUsing;.      
3cb0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74  for(j=0; j<pList
3cc0: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
3cd0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
3ce0: 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
3cf0: 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65   the term in the
3d00: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f   USING clause */
3d10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3d20: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ft;       /* Tab
3d30: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77  le on the left w
3d40: 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  ith matching col
3d50: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
3d60: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
3d70: 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ;    /* Column n
3d80: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
3d90: 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  g column on the 
3da0: 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  left */.        
3db0: 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20  int iRightCol;  
3dc0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
3dd0: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
3de0: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68  lumn on the righ
3df0: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  t */..        zN
3e00: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a  ame = pList->a[j
3e10: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
3e20: 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c   iRightCol = col
3e30: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
3e40: 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab, zName);.    
3e50: 20 20 20 20 69 66 28 20 69 52 69 67 68 74 43 6f      if( iRightCo
3e60: 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  l<0.         || 
3e70: 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49  !tableAndColumnI
3e80: 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20  ndex(pSrc, i+1, 
3e90: 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26  zName, &iLeft, &
3ea0: 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20  iLeftCol).      
3eb0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
3ec0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3ed0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a  Parse, "cannot j
3ee0: 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  oin using column
3ef0: 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20   %s - column ". 
3f00: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20             "not 
3f10: 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20  present in both 
3f20: 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b  tables", zName);
3f30: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
3f40: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
3f50: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
3f60: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63  erm(pParse, pSrc
3f70: 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f  , iLeft, iLeftCo
3f80: 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f  l, i+1, iRightCo
3f90: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
3fa0: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
3fb0: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
3fc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3fd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
3fe0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
3ff0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65  nce */.static Ke
4000: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
4010: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
4020: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4030: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
4040: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
4050: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
4060: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
4070: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
4080: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
4090: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
40a0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
40b0: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
40c0: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
40d0: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
40e0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
40f0: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
4100: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
4110: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  /.);../*.** Gene
4120: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
4130: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
4140: 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73  ord in registers
4150: 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f   regData.** thro
4160: 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74  ugh regData+nDat
4170: 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72  a-1 onto the sor
4180: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
4190: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
41a0: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
41b0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
41c0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
41d0: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
41e0: 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt,        /* In
41f0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4200: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
4210: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
4220: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
4230: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
4240: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
4250: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20  .  int regData, 
4260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4270: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
4280: 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73  ing data to be s
4290: 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  orted */.  int r
42a0: 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20  egOrigData,     
42b0: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
42c0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
42d0: 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20   before packing 
42e0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4300: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
4310: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
4320: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
4330: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
4340: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
4350: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
4360: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
4370: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
4380: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
43b0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
43c0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
43d0: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
43e0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
43f0: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4400: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4410: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4420: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4430: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
4440: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
4450: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
4460: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
4470: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
4480: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
4490: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
44a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
44b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
44e0: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
44f0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4500: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4510: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4520: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4530: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
4540: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
4550: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
4560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4570: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
4580: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
4590: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
45c0: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
45d0: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
45e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69  r */.  int iLimi
45f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
4610: 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  IT counter */.. 
4620: 20 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30   assert( bSeq==0
4630: 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20   || bSeq==1 );. 
4640: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
4650: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
4660: 67 4f 72 69 67 44 61 74 61 20 29 3b 0a 20 20 69  gOrigData );.  i
4670: 66 28 20 6e 50 72 65 66 69 78 52 65 67 20 29 7b  f( nPrefixReg ){
4680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72  .    assert( nPr
4690: 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62  efixReg==nExpr+b
46a0: 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42 61  Seq );.    regBa
46b0: 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20 6e  se = regData - n
46c0: 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d  Expr - bSeq;.  }
46d0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73  else{.    regBas
46e0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
46f0: 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65   + 1;.    pParse
4700: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b  ->nMem += nBase;
4710: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4720: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d  Select->iOffset=
4730: 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69  =0 || pSelect->i
4740: 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c  Limit!=0 );.  iL
4750: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
4760: 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65 63  iOffset ? pSelec
4770: 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70  t->iOffset+1 : p
4780: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a  Select->iLimit;.
4790: 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f    pSort->labelDo
47a0: 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ne = sqlite3Vdbe
47b0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
47c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
47d0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
47e0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
47f0: 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72 69   regBase, regOri
4800: 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20  gData,.         
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
4830: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
4840: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
4850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4860: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
4870: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
4880: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
4890: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
48a0: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
48b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
48c0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
48d0: 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42  e, regData, regB
48e0: 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20  ase+nExpr+bSeq, 
48f0: 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71  nData);.  }.  sq
4900: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4910: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4920: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
4930: 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20  , nBase-nOBSat, 
4940: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
4950: 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ( nOBSat>0 ){.  
4960: 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79    int regPrevKey
4970: 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74  ;   /* The first
4980: 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20   nOBSat columns 
4990: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
49a0: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
49b0: 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ddrFirst;    /* 
49c0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
49d0: 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a  P_IfNot opcode *
49e0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d  /.    int addrJm
49f0: 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
4a00: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d  ss of the OP_Jum
4a10: 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  p opcode */.    
4a20: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
4a30: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74    /* Opcode that
4a40: 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65   opens the sorte
4a50: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  r */.    int nKe
4a60: 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
4a70: 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20  mber of sorting 
4a80: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63  key columns, inc
4a90: 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e  luding OP_Sequen
4aa0: 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  ce */.    KeyInf
4ab0: 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f  o *pKI;     /* O
4ac0: 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20  riginal KeyInfo 
4ad0: 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61  on the sorter ta
4ae0: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50  ble */..    regP
4af0: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
4b00: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
4b10: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
4b20: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
4b30: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
4b40: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62  Sort->nOBSat + b
4b50: 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65  Seq;.    if( bSe
4b60: 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46  q ){.      addrF
4b70: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
4b80: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
4b90: 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  fNot, regBase+nE
4ba0: 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65  xpr); .    }else
4bb0: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
4bc0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
4bd0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp1(v, OP_Sequ
4be0: 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d  enceTest, pSort-
4bf0: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
4c00: 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  }.    VdbeCovera
4c10: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4c20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
4c30: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50  OP_Compare, regP
4c40: 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c  revKey, regBase,
4c50: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
4c60: 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  .    pOp = sqlit
4c70: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
4c80: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
4c90: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dex);.    if( pP
4ca0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
4cb0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
4cc0: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e  .    pOp->p2 = n
4cd0: 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20  Key + nData;.   
4ce0: 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70   pKI = pOp->p4.p
4cf0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  KeyInfo;.    mem
4d00: 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72  set(pKI->aSortOr
4d10: 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69  der, 0, pKI->nFi
4d20: 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f  eld); /* Makes O
4d30: 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74 65 73  P_Jump below tes
4d40: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c  table */.    sql
4d50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4d60: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
4d70: 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  KI, P4_KEYINFO);
4d80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
4d90: 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b  KI->nXField>2 );
4da0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
4db0: 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
4dc0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
4dd0: 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  se, pSort->pOrde
4de0: 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20  rBy, nOBSat,.   
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46          pKI->nXF
4e20: 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64  ield-1);.    add
4e30: 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rJmp = sqlite3Vd
4e40: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4e50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4e60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
4e70: 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30  mp, addrJmp+1, 0
4e80: 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64  , addrJmp+1); Vd
4e90: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4ea0: 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42     pSort->labelB
4eb0: 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64  kOut = sqlite3Vd
4ec0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4ed0: 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65      pSort->regRe
4ee0: 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
4ef0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
4f00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4f10: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
4f20: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
4f30: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
4f40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
4f60: 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e  tSorter, pSort->
4f70: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  iECursor);.    i
4f80: 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  f( iLimit ){.   
4f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4fa0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
4fb0: 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d  , iLimit, pSort-
4fc0: 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20  >labelDone);.   
4fd0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4fe0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
4ff0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5000: 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b  e(v, addrFirst);
5010: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5020: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
5030: 20 72 65 67 42 61 73 65 2c 20 72 65 67 50 72 65   regBase, regPre
5040: 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  vKey, pSort->nOB
5050: 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Sat);.    sqlite
5060: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
5070: 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20   addrJmp);.  }. 
5080: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
5090: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
50a0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
50b0: 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72    op = OP_Sorter
50c0: 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b  Insert;.  }else{
50d0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78  .    op = OP_Idx
50e0: 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71  Insert;.  }.  sq
50f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5100: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
5110: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
5120: 64 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  d);.  if( iLimit
5130: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
5140: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
5150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5160: 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  , OP_IfNotZero, 
5170: 69 4c 69 6d 69 74 2c 20 30 2c 20 31 29 3b 20 56  iLimit, 0, 1); V
5180: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5190: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
51a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp1(v, OP_Last
51b0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
51c0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
51d0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
51e0: 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69  Delete, pSort->i
51f0: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
5200: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5210: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  e(v, addr);.  }.
5220: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
5230: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
5240: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
5250: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
5260: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
5270: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
5280: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
5290: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
52a0: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
52b0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
52c0: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
52d0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
52e0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
52f0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5300: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
5310: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
5320: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
5330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5340: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
5350: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
5360: 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65  ue, 1); VdbeCove
5370: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
5380: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
5390: 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  FSET"));.  }.}..
53a0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
53b0: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
53c0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
53d0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
53e0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
53f0: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
5400: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
5410: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
5420: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
5430: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
5440: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
5450: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
5460: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
5470: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
5480: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
5490: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
54a0: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
54b0: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
54c0: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
54d0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
54e0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
54f0: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
5500: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
5510: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
5520: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
5530: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
5540: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
5550: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
5560: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
5570: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
5580: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
5590: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
55a0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
55b0: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
55c0: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
55d0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
55e0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
55f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
5600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5610: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
5620: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
5630: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5640: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
5650: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
5660: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
5670: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
5680: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5690: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
56a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
56b0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
56c0: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
56d0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
56e0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
56f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5700: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5710: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
5720: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5730: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5740: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b  sert, iTab, r1);
5750: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
5760: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5770: 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   r1);.}..#ifndef
5780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5790: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
57a0: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
57b0: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
57c0: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
57d0: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
57e0: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
57f0: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
5800: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
5810: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
5820: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
5830: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
5840: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
5850: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
5860: 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63  error used to oc
5870: 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70  cur.** in multip
5880: 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65  le places.  (The
5890: 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75   error only occu
58a0: 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20  rs in one place 
58b0: 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72  now, but we.** r
58c0: 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75  etain the subrou
58d0: 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  tine to minimize
58e0: 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e   code disruption
58f0: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
5900: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
5910: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
5920: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5930: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  ,       /* Parse
5940: 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53   context. */.  S
5950: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
5960: 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69  ,   /* Destinati
5970: 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73  on of SELECT res
5980: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ults */.  int nE
5990: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
59a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
59b0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  lt columns retur
59c0: 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f  ned by SELECT */
59d0: 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  .){.  int eDest 
59e0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
59f0: 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26    if( nExpr>1 &&
5a00: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
5a10: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
5a20: 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  et) ){.    sqlit
5a30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5a40: 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
5a50: 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
5a60: 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
5a70: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
5a80: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
5a90: 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ssion");.    ret
5aa0: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
5ab0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5ac0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
5ad0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
5ae0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
5af0: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
5b00: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
5b10: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
5b20: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
5b30: 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ab is negative, 
5b40: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
5b50: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
5b60: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
5b70: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
5b80: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
5b90: 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20 69  ow.  If srcTab i
5ba0: 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  s.** zero or mor
5bb0: 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  e, then data is 
5bc0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
5bd0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
5be0: 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74   used only .** t
5bf0: 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c  o get number col
5c00: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74  umns and the dat
5c10: 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 63  atype for each c
5c20: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
5c30: 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65   void selectInne
5c40: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
5c50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
5c60: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
5c70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
5c80: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
5c90: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
5ca0: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
5cb0: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
5cc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5cd0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
5ce0: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
5cf0: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
5d00: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5d20: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
5d30: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  his table */.  S
5d40: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
5d50: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
5d60: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
5d70: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52  ow to process OR
5d80: 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74  DER BY */.  Dist
5d90: 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e  inctCtx *pDistin
5da0: 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55  ct, /* If not NU
5db0: 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20  LL, info on how 
5dc0: 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49  to process DISTI
5dd0: 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  NCT */.  SelectD
5de0: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
5df0: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
5e00: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
5e10: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  s */.  int iCont
5e20: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
5e30: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
5e40: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
5e50: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
5e60: 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
5e70: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
5e80: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
5e90: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
5ea0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
5eb0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5ec0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
5ed0: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
5ee0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5ef0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5f00: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
5f10: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
5f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5f30: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
5f40: 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  y holding result
5f50: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44   set */.  int eD
5f60: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
5f70: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
5f80: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
5f90: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
5fa0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
5fb0: 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67  rm; /* First arg
5fc0: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
5fd0: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
5fe0: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
5ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6000: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
6010: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
6020: 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20  PrefixReg = 0;  
6030: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6040: 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
6050: 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65  ers before regRe
6060: 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sult */..  asser
6070: 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74  t( v );.  assert
6080: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
6090: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70   hasDistinct = p
60a0: 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74  Distinct ? pDist
60b0: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
60c0: 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  : WHERE_DISTINCT
60d0: 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f  _NOOP;.  if( pSo
60e0: 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72  rt && pSort->pOr
60f0: 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74  derBy==0 ) pSort
6100: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72   = 0;.  if( pSor
6110: 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  t==0 && !hasDist
6120: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
6130: 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30  rt( iContinue!=0
6140: 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   );.    codeOffs
6150: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
6160: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
6170: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
6180: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
6190: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75  ns..  */.  nResu
61a0: 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  ltCol = pEList->
61b0: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
61c0: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
61d0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
61e0: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
61f0: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
6200: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
6210: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
6220: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6230: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6240: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6250: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6260: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
6270: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
6280: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
6290: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
62a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
62b0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
62c0: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
62d0: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
62e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
62f0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
6300: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
6310: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
6320: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6330: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6340: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6350: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6360: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
6370: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
6380: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
6390: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
63a0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
63b0: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
63c0: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
63d0: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
63e0: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
63f0: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
6400: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
6410: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
6420: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6430: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6440: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6450: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
6460: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
6470: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6480: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
6490: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
64a0: 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20  ol;.  regResult 
64b0: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
64c0: 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20    if( srcTab>=0 
64d0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
64e0: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
64f0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
6500: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6510: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
6520: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
6530: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
6540: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
6550: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
6560: 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  e));.    }.  }el
6570: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
6580: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
6590: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
65a0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
65b0: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
65c0: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
65d0: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
65e0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
65f0: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
6600: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
6610: 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20   u8 ecelFlags;. 
6620: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
6630: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
6640: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
6650: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
6660: 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63 65 6c  ne ){.      ecel
6670: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 45  Flags = SQLITE_E
6680: 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c  CEL_DUP;.    }el
6690: 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c  se{.      ecelFl
66a0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ags = 0;.    }. 
66b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
66c0: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
66d0: 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65  e, pEList, regRe
66e0: 73 75 6c 74 2c 20 30 2c 20 65 63 65 6c 46 6c 61  sult, 0, ecelFla
66f0: 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  gs);.  }..  /* I
6700: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
6710: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
6720: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
6730: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
6740: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
6750: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
6760: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
6770: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
6780: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
6790: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
67a0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
67b0: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
67c0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
67d0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
67e0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
67f0: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
6800: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
6810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
6820: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
6830: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
6840: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
6850: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
6860: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
6870: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
6880: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
6890: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
68a0: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
68b0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
68c0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
68d0: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
68e0: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
68f0: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
6900: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
6910: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6920: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
6930: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
6940: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
6950: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
6960: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
6970: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
6980: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
6990: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
69a0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
69b0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
69c0: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
69d0: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
69e0: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
69f0: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
6a00: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
6a10: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
6a20: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
6a30: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
6a40: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
6a50: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
6a60: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
6a70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6a80: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
6a90: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
6aa0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
6ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
6ac0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
6ad0: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
6ae0: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
6af0: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
6b00: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
6b10: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
6b20: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
6b30: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
6b40: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6b50: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
6b60: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
6b70: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
6b80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6b90: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6ba0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
6bb0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
6bc0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6bd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6be0: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
6bf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
6c00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6c10: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
6c20: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
6c30: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
6c40: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
6c50: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
6c60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6c70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6c80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
6c90: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
6ca0: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
6cb0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
6cc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6cd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
6ce0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6cf0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
6d00: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
6d10: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
6d20: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
6d30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6d40: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
6d50: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
6d60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6d70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6d80: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
6d90: 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  p || pParse->db-
6da0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6dc0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6dd0: 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74  _Copy, regResult
6de0: 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75  , regPrev, nResu
6df0: 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ltCol-1);.      
6e00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6e10: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  ..      case WHE
6e20: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
6e30: 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
6e40: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
6e50: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
6e60: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
6e70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6e80: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
6e90: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
6ea0: 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63  assert( pDistinc
6eb0: 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  t->eTnctType==WH
6ec0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
6ed0: 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20  RDERED );.      
6ee0: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
6ef0: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
6f00: 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74  ->tabTnct, iCont
6f10: 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  inue, nResultCol
6f20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6f30: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
6f40: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
6f50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6f60: 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30      if( pSort==0
6f70: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
6f80: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
6f90: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
6fa0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
6fb0: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
6fc0: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
6fd0: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
6fe0: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
6ff0: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
7000: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
7010: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
7020: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
7030: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7040: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
7050: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
7060: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
7070: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7080: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
7090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
70a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
70b0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
70c0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
70d0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
70e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
70f0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
7100: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
7110: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7120: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7130: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
7140: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
7150: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
7160: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
7170: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
7180: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
7190: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
71a0: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
71b0: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
71c0: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
71d0: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
71e0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
71f0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
7200: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
7210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7220: 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65  p3(v, OP_IdxDele
7230: 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65  te, iParm, regRe
7240: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7250: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7260: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
7270: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
7280: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
7290: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
72a0: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
72b0: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
72c0: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
72d0: 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20  ase SRT_Fifo:.  
72e0: 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 46    case SRT_DistF
72f0: 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ifo:.    case SR
7300: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
7310: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
7320: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
7330: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7340: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 72  ange(pParse, nPr
7350: 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20  efixReg+1);.    
7360: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7370: 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t==SRT_Table );.
7380: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7390: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
73a0: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Tab );.      tes
73b0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
73c0: 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20  T_Fifo );.      
73d0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
73e0: 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b  =SRT_DistFifo );
73f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7400: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7410: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7420: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7430: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29  , r1+nPrefixReg)
7440: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
7450: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20  _OMIT_CTE.      
7460: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
7470: 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20  istFifo ){.     
7480: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
7490: 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74  tination is Dist
74a0: 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f  Fifo, then curso
74b0: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
74c0: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
74d0: 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  n an ephemeral i
74e0: 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75 72  ndex. If the cur
74f0: 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65  rent row is alre
7500: 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20  ady present.    
7510: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
7520: 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  dex, do not writ
7530: 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70  e it to the outp
7540: 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20  ut. If not, add 
7550: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
7560: 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68  urrent row to th
7570: 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63  e index and proc
7580: 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e 67  eed with writing
7590: 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20   it to the.     
75a0: 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62     ** output tab
75b0: 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a  le as well.  */.
75c0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
75d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
75e0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34  rrentAddr(v) + 4
75f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7600: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
7610: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
7620: 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30  m+1, addr, r1, 0
7630: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
7640: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7660: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
7670: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
7680: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  r1);.        ass
7690: 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b  ert( pSort==0 );
76a0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
76b0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
76c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
76d0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
76e0: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e  , pSort, p, r1+n
76f0: 50 72 65 66 69 78 52 65 67 2c 72 65 67 52 65 73  PrefixReg,regRes
7700: 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52 65 67  ult,1,nPrefixReg
7710: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7720: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
7730: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7740: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
7750: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7760: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
7770: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
7780: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7790: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
77a0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
77b0: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
77c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
77d0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
77e0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
77f0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7800: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7810: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
7820: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7830: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7840: 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67  , r1, nPrefixReg
7850: 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +1);.      break
7860: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
7870: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
7880: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
7890: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
78a0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
78b0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
78c0: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
78d0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
78e0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
78f0: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
7900: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
7910: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
7920: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
7930: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
7940: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
7950: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
7960: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
7970: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
7980: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
7990: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
79a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
79b0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
79c0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
79d0: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
79e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
79f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
7a00: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
7a10: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
7a20: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
7a30: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
7a40: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
7a50: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
7a60: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
7a70: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
7a80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
7a90: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
7aa0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
7ab0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
7ac0: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
7ad0: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
7ae0: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
7af0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
7b00: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7b10: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7b20: 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74  esult, regResult
7b30: 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29  , 1, nPrefixReg)
7b40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7b50: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
7b60: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
7b70: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
7b80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7b90: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
7ba0: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
7bb0: 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61  ,1,r1, &pDest->a
7bc0: 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  ffSdst, 1);.    
7bd0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7be0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
7bf0: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
7c00: 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  sult, 1);.      
7c10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7c20: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
7c30: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
7c40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7c50: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
7c60: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
7c70: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7c80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
7c90: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
7ca0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7cb0: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
7cc0: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
7cd0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7ce0: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
7cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7d00: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7d10: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
7d20: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
7d30: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
7d40: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
7d50: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
7d60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7d70: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
7d80: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
7d90: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
7da0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
7db0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
7dc0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
7dd0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
7de0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
7df0: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
7e00: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
7e10: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
7e20: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
7e30: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
7e40: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
7e50: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
7e60: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
7e70: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
7e80: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
7e90: 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ult, regResult, 
7ea0: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  1, nPrefixReg);.
7eb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7ec0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
7ed0: 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b  Result==iParm );
7ee0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
7ef0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
7f00: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
7f10: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7f30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
7f40: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
7f50: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7f60: 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20  RY */..    case 
7f70: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20  SRT_Coroutine:  
7f80: 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74       /* Send dat
7f90: 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e  a to a co-routin
7fa0: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52  e */.    case SR
7fb0: 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20  T_Output: {     
7fc0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
7fd0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
7fe0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7ff0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
8000: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8010: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
8020: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69  utput );.      i
8030: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8040: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
8050: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
8060: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
8070: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8080: 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  ltCol,.         
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
80a0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
80b0: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
80c0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
80d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
80e0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
80f0: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
8100: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
8110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8130: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
8140: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  w, regResult, nR
8150: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
8160: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
8170: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
8180: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
8190: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
81a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
81b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
81c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
81d0: 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69  T_CTE.    /* Wri
81e0: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  te the results i
81f0: 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71  nto a priority q
8200: 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64  ueue that is ord
8210: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a  er according to.
8220: 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f      ** pDest->pO
8230: 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e  rderBy (in pSO).
8240: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
8250: 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74   (in iParm) is t
8260: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e  he cursor for an
8270: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  .    ** index wi
8280: 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20  th pSO->nExpr+2 
8290: 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20  columns.  Build 
82a0: 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20  a key using pSO 
82b0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20  for the first.  
82c0: 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20    ** pSO->nExpr 
82d0: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61  columns, then ma
82e0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73  ke sure all keys
82f0: 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61   are unique by a
8300: 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66  dding a.    ** f
8310: 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65  inal OP_Sequence
8320: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61   column.  The la
8330: 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  st column is the
8340: 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f   record as a blo
8350: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
8360: 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  se SRT_DistQueue
8370: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51  :.    case SRT_Q
8380: 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ueue: {.      in
8390: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  t nKey;.      in
83a0: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20  t r1, r2, r3;.  
83b0: 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74      int addrTest
83c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
83d0: 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20  List *pSO;.     
83e0: 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f   pSO = pDest->pO
83f0: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73  rderBy;.      as
8400: 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20  sert( pSO );.   
8410: 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e     nKey = pSO->n
8420: 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d  Expr;.      r1 =
8430: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
8440: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
8450: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
8460: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
8470: 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  e, nKey+2);.    
8480: 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31    r3 = r2+nKey+1
8490: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
84a0: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
84b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
84c0: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
84d0: 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c 20  n is DistQueue, 
84e0: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
84f0: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
8500: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65        ** on a se
8510: 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69  cond ephemeral i
8520: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
8530: 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79  all values every
8540: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20   previously.    
8550: 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
8560: 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20  the queue. */.  
8570: 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20 3d        addrTest =
8580: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8590: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
85a0: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a  d, iParm+1, 0, .
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85d0: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
85e0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
85f0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
8600: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
8610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8620: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
8630: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
8640: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8650: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28  , r3);.      if(
8660: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
8670: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
8680: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8690: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
86a0: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29  rt, iParm+1, r3)
86b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
86c0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
86d0: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
86e0: 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a  ESULT);.      }.
86f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8700: 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nKey; i++){.   
8710: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8720: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
8730: 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8750: 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61  gResult + pSO->a
8760: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
8770: 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20  Col - 1,.       
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20     r2+i);.      
87a0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
87b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
87c0: 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c  Sequence, iParm,
87d0: 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20   r2+nKey);.     
87e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
87f0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
8800: 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c  ord, r2, nKey+2,
8810: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
8820: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8830: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
8840: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
8850: 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20   if( addrTest ) 
8860: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
8870: 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29  ere(v, addrTest)
8880: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
8890: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
88a0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
88b0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
88c0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
88d0: 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20   r2, nKey+2);.  
88e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
88f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8900: 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a  E_OMIT_CTE */...
8910: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
8920: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
8930: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
8940: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
8950: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
8960: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8970: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
8980: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
8990: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
89a0: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
89b0: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
89c0: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
89d0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
89e0: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
89f0: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
8a00: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
8a10: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
8a20: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
8a30: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
8a40: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
8a50: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
8a60: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
8a70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a80: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
8a90: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
8aa0: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
8ab0: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
8ac0: 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c  eached.  Except,
8ad0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69   if.  ** there i
8ae0: 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77  s a sorter, in w
8af0: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f  hich case the so
8b00: 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  rter has already
8b10: 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68   limited.  ** th
8b20: 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e  e output for us.
8b30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72  .  */.  if( pSor
8b40: 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69  t==0 && p->iLimi
8b50: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
8b60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8b70: 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
8b80: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
8b90: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8ba0: 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  v);.  }.}../*.**
8bb0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49   Allocate a KeyI
8bc0: 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69  nfo object suffi
8bd0: 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64  cient for an ind
8be0: 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75  ex of N key colu
8bf0: 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74  mns and.** X ext
8c00: 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b  ra columns..*/.K
8c10: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
8c20: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69  eyInfoAlloc(sqli
8c30: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20  te3 *db, int N, 
8c40: 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45  int X){.  int nE
8c50: 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69  xtra = (N+X)*(si
8c60: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
8c70: 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20  );.  KeyInfo *p 
8c80: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
8c90: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
8ca0: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
8cb0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
8cc0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
8cd0: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
8ce0: 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28     p->nField = (
8cf0: 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58  u16)N;.    p->nX
8d00: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a  Field = (u16)X;.
8d10: 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43      p->enc = ENC
8d20: 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  (db);.    p->db 
8d30: 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = db;.    p->nRe
8d40: 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65  f = 1;.    memse
8d50: 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74  t(&p[1], 0, nExt
8d60: 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ra);.  }else{.  
8d70: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
8d80: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ed = 1;.  }.  re
8d90: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
8da0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65   Deallocate a Ke
8db0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
8dc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49  void sqlite3KeyI
8dd0: 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f  nfoUnref(KeyInfo
8de0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
8df0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8e00: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d  nRef>0 );.    p-
8e10: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
8e20: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71   p->nRef==0 ) sq
8e30: 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
8e40: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8e50: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
8e60: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
8e70: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
8e80: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
8e90: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
8ea0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
8eb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
8ec0: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
8ed0: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
8ee0: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
8ef0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
8f00: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
8f10: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
8f20: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
8f30: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
8f40: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
8f50: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
8f60: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
8f70: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
8f80: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
8f90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8fa0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
8fb0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
8fc0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
8fd0: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
8fe0: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
8ff0: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
9000: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
9010: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9020: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
9030: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
9040: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
9050: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
9060: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
9070: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
9080: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
9090: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
90a0: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
90b0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
90c0: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
90d0: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
90e0: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
90f0: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
9100: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
9110: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
9120: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
9130: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
9140: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
9150: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
9160: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
9170: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
9180: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
9190: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
91a0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
91b0: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
91c0: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
91d0: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
91e0: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
91f0: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
9200: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
9210: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
9220: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
9230: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
9240: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
9250: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
9260: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
9270: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
9280: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
9290: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
92a0: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
92b0: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
92c0: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
92d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
92e0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
92f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9300: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
9310: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
9320: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9330: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
9340: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
9350: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
9360: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
9370: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
9380: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
9390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
93a0: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
93b0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
93c0: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
93d0: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
93e0: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
93f0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9400: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
9410: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9420: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
9430: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
9440: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
9450: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
9460: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
9470: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
9480: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
9490: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
94a0: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
94b0: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
94c0: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
94d0: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
94e0: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
94f0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
9500: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
9510: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
9520: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
9530: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
9540: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
9550: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
9560: 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
9570: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  fltColl;.      p
9580: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53  Info->aColl[i-iS
9590: 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  tart] = pColl;. 
95a0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
95b0: 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d  tOrder[i-iStart]
95c0: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
95d0: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
95e0: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
95f0: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  ../*.** Name of 
9600: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
9610: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
9620: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
9630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9640: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
9650: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
9660: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
9670: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
9680: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
9690: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
96a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
96b0: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
96c0: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
96d0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
96e0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
96f0: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
9700: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9710: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
9720: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
9730: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
9740: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
9750: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9760: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
9770: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
9780: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
9790: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
97a0: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
97b0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
97c0: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
97d0: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
97e0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
97f0: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
9800: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
9810: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
9820: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
9830: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
9840: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
9850: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
9860: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
9870: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
9880: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
9890: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
98a0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
98b0: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
98c0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
98d0: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
98e0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
98f0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
9900: 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70  zUsage){.  if( p
9910: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
9920: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
9930: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9940: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
9950: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
9960: 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55  f(pParse->db, "U
9970: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
9980: 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b  OR %s", zUsage);
9990: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
99a0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
99b0: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
99c0: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
99d0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
99e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
99f0: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
9a00: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
9a10: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
9a20: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
9a30: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
9a40: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
9a50: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
9a60: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
9a70: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
9a80: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
9a90: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
9aa0: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
9ab0: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
9ac0: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
9ad0: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
9ae0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
9af0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
9b00: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
9b10: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
9b20: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
9b30: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
9b40: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
9b50: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
9b60: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
9b70: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
9b80: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
9b90: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
9ba0: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
9bb0: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
9bc0: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
9bd0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
9be0: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ,z).#endif..#if 
9bf0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9c00: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26  OMIT_EXPLAIN) &&
9c10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9c20: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
9c30: 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c  ELECT)./*.** Unl
9c40: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
9c50: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
9c60: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
9c70: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
9c80: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
9c90: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
9ca0: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
9cb0: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
9cc0: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
9cd0: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
9ce0: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65  aption is of one
9cf0: 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d   of the two form
9d00: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50  s:.**.**   "COMP
9d10: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
9d20: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
9d30: 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d   (op)".**   "COM
9d40: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
9d50: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
9d60: 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  2 USING TEMP B-T
9d70: 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20  REE (op)".**.** 
9d80: 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20  where iSub1 and 
9d90: 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e  iSub2 are the in
9da0: 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73  tegers passed as
9db0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
9dc0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  ng.** function p
9dd0: 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f  arameters, and o
9de0: 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65  p is the text re
9df0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
9e00: 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  the parameter.**
9e10: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
9e20: 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  e. The parameter
9e30: 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e   "op" must be on
9e40: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
9e50: 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f  K_EXCEPT,.** TK_
9e60: 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f  INTERSECT or TK_
9e70: 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66  ALL. The first f
9e80: 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61  orm is used if a
9e90: 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20  rgument bUseTmp 
9ea0: 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72  is .** false, or
9eb0: 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   the second form
9ec0: 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a   if it is true..
9ed0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
9ee0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
9ef0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9f00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9f10: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
9f20: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
9f50: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
9f60: 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20  EXCEPT etc. */. 
9f70: 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20   int iSub1,     
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
9fa0: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  1 */.  int iSub2
9fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9fc0: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
9fd0: 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74  ry id 2 */.  int
9fe0: 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20   bUseTmp        
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a000: 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74  True if a temp t
a010: 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f  able was used */
a020: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  .){.  assert( op
a030: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70  ==TK_UNION || op
a040: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
a050: 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
a060: 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b  || op==TK_ALL );
a070: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
a080: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
a090: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a0a0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
a0b0: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
a0c0: 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20  e3MPrintf(.     
a0d0: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22     pParse->db, "
a0e0: 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52  COMPOUND SUBQUER
a0f0: 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73  IES %d AND %d %s
a100: 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53  (%s)", iSub1, iS
a110: 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73  ub2,.        bUs
a120: 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50  eTmp?"USING TEMP
a130: 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65   B-TREE ":"", se
a140: 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20  lectOpName(op). 
a150: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
a160: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a170: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
a180: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
a190: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
a1a0: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
a1b0: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
a1c0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
a1d0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
a1e0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
a1f0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
a200: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c  inComposite(v,w,
a210: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
a220: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
a230: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
a240: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
a250: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
a260: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
a270: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
a280: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
a290: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
a2a0: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
a2b0: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
a2c0: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
a2d0: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
a2e0: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
a2f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
a300: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
a310: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
a320: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
a330: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
a340: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
a350: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
a360: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a370: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
a380: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
a390: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
a3a0: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
a3b0: 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ort,   /* Inform
a3c0: 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44  ation on the ORD
a3d0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
a3e0: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
a3f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a400: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
a410: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
a420: 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65   *pDest /* Write
a430: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
a440: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
a450: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a460: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a480: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
a490: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
a4a0: 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f   addrBreak = pSo
a4b0: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20  rt->labelDone;  
a4c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
a4d0: 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c  p here to exit l
a4e0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
a4f0: 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  rContinue = sqli
a500: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
a510: 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65  (v);  /* Jump he
a520: 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c  re for next cycl
a530: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  e */.  int addr;
a540: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
a550: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
a560: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
a570: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
a580: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
a590: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
a5a0: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
a5b0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
a5c0: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
a5d0: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
a5e0: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
a5f0: 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20  nt iSortTab;    
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a610: 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20  * Sorter cursor 
a620: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
a630: 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b    int nSortData;
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61    /* Trailing va
a660: 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f  lues to read fro
a670: 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  m sorter */.  in
a680: 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b  t i;.  int bSeq;
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
a6b0: 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  f sorter record 
a6c0: 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f  includes seq. no
a6d0: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
a6e0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
a6f0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72  N_COMMENTS.  str
a700: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a710: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
a720: 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66  EList->a;.#endif
a730: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ..  assert( addr
a740: 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28  Break<0 );.  if(
a750: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a760: 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
a770: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a780: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
a790: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
a7a0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
a7b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
a7c0: 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  to(v, addrBreak)
a7d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a7e0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
a7f0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a800: 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20  ut);.  }.  iTab 
a810: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
a820: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
a830: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
a840: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
a850: 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77  ne ){.    regRow
a860: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52  id = 0;.    regR
a870: 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  ow = pDest->iSds
a880: 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  t;.    nSortData
a890: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
a8a0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
a8b0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
a8c0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a8d0: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
a8e0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a8f0: 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74  arse);.    nSort
a900: 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Data = 1;.  }.  
a910: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
a920: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
a930: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
a940: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
a950: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
a960: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
a970: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
a980: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
a990: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
a9a0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
a9b0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
a9c0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
a9d0: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
a9e0: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
a9f0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
aa00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
aa10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
aa20: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
aa30: 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f   iSortTab, regSo
aa40: 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53  rtOut, nKey+1+nS
aa50: 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ortData);.    if
aa60: 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c  ( addrOnce ) sql
aa70: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
aa80: 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
aa90: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
aaa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aab0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
aac0: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
aad0: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
aae0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
aaf0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
ab00: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
ab10: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
ab20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ab30: 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54  P_SorterData, iT
ab40: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
ab50: 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62  iSortTab);.    b
ab60: 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Seq = 0;.  }else
ab70: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  {.    addr = 1 +
ab80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab90: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
aba0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
abb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
abc0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
abd0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
abe0: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
abf0: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54     iSortTab = iT
ac00: 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31  ab;.    bSeq = 1
ac10: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
ac20: 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b   i<nSortData; i+
ac30: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
ac40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ac50: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
ac60: 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72  , nKey+bSeq+i, r
ac70: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64  egRow+i);.    Vd
ac80: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
ac90: 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  s", aOutEx[i].zN
aca0: 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e  ame ? aOutEx[i].
acb0: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
acc0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20  ].zSpan));.  }. 
acd0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
ace0: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  {.    case SRT_E
acf0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
ad00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad10: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
ad20: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
ad30: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
ad40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ad50: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
ad60: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
ad70: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
ad80: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
ad90: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
ada0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
adb0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
adc0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
add0: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
ade0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
adf0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
ae00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ae10: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
ae20: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
ae30: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
ae40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ae50: 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74 2d           &pDest-
ae60: 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20  >affSdst, 1);.  
ae70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ae80: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ae90: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ge(pParse, regRo
aea0: 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  w, 1);.      sql
aeb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aec0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
aed0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
aee0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
aef0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
af00: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
af10: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
af20: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
af30: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
af40: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69  Parse, regRow, i
af50: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
af60: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
af70: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
af80: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
af90: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
afa0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
afb0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
afc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
afd0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
afe0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
aff0: 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20  outine ); .     
b000: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
b010: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
b020: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b030: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
b040: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66  tine );.      if
b050: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
b060: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  put ){.        s
b070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b080: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
b090: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
b0a0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
b0b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
b0c0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
b0d0: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e  (pParse, pDest->
b0e0: 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  iSdst, nColumn);
b0f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b110: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
b120: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
b130: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
b140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b150: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f  .  }.  if( regRo
b160: 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  wid ){.    sqlit
b170: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
b180: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29  (pParse, regRow)
b190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
b1a0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
b1b0: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  se, regRowid);. 
b1c0: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74   }.  /* The bott
b1d0: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
b1e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
b1f0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
b200: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
b210: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
b220: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
b230: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
b240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b250: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
b260: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
b270: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
b280: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
b290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b2a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
b2b0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
b2c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b2d0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72  }.  if( pSort->r
b2e0: 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74  egReturn ) sqlit
b2f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b300: 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  OP_Return, pSort
b310: 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
b320: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
b330: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
b340: 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reak);.}../*.** 
b350: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
b360: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
b370: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
b380: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
b390: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
b3a0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
b3b0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
b3c0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
b3d0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
b3e0: 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20  .** Also try to 
b3f0: 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a  estimate the siz
b400: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
b410: 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  d value and retu
b420: 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  rn that.** resul
b430: 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e  t in *pEstWidth.
b440: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
b450: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
b460: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
b470: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
b480: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
b490: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
b4a0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
b4b0: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
b4c0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
b4d0: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
b4e0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
b4f0: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
b500: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
b510: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
b520: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
b530: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
b540: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
b550: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
b560: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
b570: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
b580: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
b590: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
b5a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b5b0: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
b5c0: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
b5d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
b5e0: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
b5f0: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
b600: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
b610: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
b620: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
b630: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
b640: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
b650: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
b660: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
b670: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
b680: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
b690: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
b6a0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
b6b0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
b6c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b6d0: 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20  ne has either 3 
b6e0: 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20  or 6 parameters 
b6f0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
b700: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
b710: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
b720: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b730: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
b740: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f  tion is used..*/
b750: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b760: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b770: 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63  ADATA.# define c
b780: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
b790: 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70  D,E,F) columnTyp
b7a0: 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c  eImpl(A,B,C,D,E,
b7b0: 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  F).#else /* if !
b7c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
b7d0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b7e0: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
b7f0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
b800: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
b810: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29  nTypeImpl(A,B,F)
b820: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63  .#endif.static c
b830: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
b840: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
b850: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
b860: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 23    Expr *pExpr,.#
b870: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b880: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
b890: 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ATA.  const char
b8a0: 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63   **pzOrigDb,.  c
b8b0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
b8c0: 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  igTab,.  const c
b8d0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c  har **pzOrigCol,
b8e0: 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a 70 45  .#endif.  u8 *pE
b8f0: 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61  stWidth.){.  cha
b900: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
b910: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75   0;.  int j;.  u
b920: 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a  8 estWidth = 1;.
b930: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b940: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b950: 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e 73  DATA.  char cons
b960: 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  t *zOrigDb = 0;.
b970: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
b980: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  rigTab = 0;.  ch
b990: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43  ar const *zOrigC
b9a0: 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ol = 0;.#endif..
b9b0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21    assert( pExpr!
b9c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b9d0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
b9e0: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   );.  switch( pE
b9f0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
ba00: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
ba10: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
ba20: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  OLUMN: {.      /
ba30: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
ba40: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f   is a column. Lo
ba50: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74  cate the table t
ba60: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69  he column is bei
ba70: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72  ng.      ** extr
ba80: 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61  acted from in Na
ba90: 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69  meContext.pSrcLi
baa0: 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d  st. This table m
bab0: 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20  ay be real.     
bac0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62   ** database tab
bad0: 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  le or a subquery
bae0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
baf0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
bb00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
bb10: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
bb20: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
bb30: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
bb40: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30    Select *pS = 0
bb50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
bb60: 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75   Select the colu
bb70: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
bb80: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  from */.      in
bb90: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
bba0: 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64  iColumn;  /* Ind
bbb0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
bbc0: 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65  pTab */.      te
bbd0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
bbe0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
bbf0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
bc00: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
bc10: 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
bc20: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
bc30: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  !pTab ){.       
bc40: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
bc50: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
bc60: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
bc70: 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j=0;j<pTabList->
bc80: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
bc90: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
bca0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b  pExpr->iTable;j+
bcb0: 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +);.        if( 
bcc0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
bcd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
bce0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
bcf0: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
bd00: 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73      pS = pTabLis
bd10: 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b  t->a[j].pSelect;
bd20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
bd30: 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20            pNC = 
bd40: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
bd50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
bd60: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
bd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
bd80: 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65  t one time, code
bd90: 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54   such as "SELECT
bda0: 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61   new.x" within a
bdb0: 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20   trigger would. 
bdc0: 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
bdd0: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74  this condition t
bde0: 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68  o run.  Since th
bdf0: 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74  en, we have rest
be00: 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20  ructured how.   
be10: 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
be20: 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
be30: 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f  d and so this co
be40: 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f  ndition is no lo
be50: 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  nger .        **
be60: 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76   possible. Howev
be70: 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c  er, it can still
be80: 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61   be true for sta
be90: 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20  tements like.   
bea0: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
beb0: 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a  owing:.        *
bec0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43  *.        **   C
bed0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63  REATE TABLE t1(c
bee0: 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20  ol INTEGER);.   
bef0: 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
bf00: 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29   (SELECT t1.col)
bf10: 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20   FROM FROM t1;. 
bf20: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
bf30: 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e    ** when column
bf40: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
bf50: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
bf60: 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74  on "t1.col" in t
bf70: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  he .        ** s
bf80: 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68  ub-select. In th
bf90: 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65  is case, set the
bfa0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20   column type to 
bfb0: 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20  NULL, even.     
bfc0: 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20     ** though it 
bfd0: 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65  should really be
bfe0: 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20   "INTEGER"..    
bff0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
c000: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
c010: 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20  problem, as the 
c020: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22  column type of "
c030: 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72  t1.col" is never
c040: 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64  .        ** used
c050: 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  . When columnTyp
c060: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
c070: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
c080: 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45  .        ** "(SE
c090: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74  LECT t1.col)", t
c0a0: 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20  he correct type 
c0b0: 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65  is returned (see
c0c0: 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20   the TK_SELECT. 
c0d0: 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68         ** branch
c0e0: 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
c0f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c100: 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
c110: 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d  ( pTab && pExpr-
c120: 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20  >pTab==pTab );. 
c130: 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20       if( pS ){. 
c140: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74         /* The "t
c150: 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c  able" is actuall
c160: 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  y a sub-select o
c170: 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20  r a view in the 
c180: 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20  FROM clause.    
c190: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45      ** of the SE
c1a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
c1b0: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
c1c0: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20  ration type and 
c1d0: 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a  origin.        *
c1e0: 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  * data for the r
c1f0: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
c200: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
c210: 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ct..        */. 
c220: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
c230: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
c240: 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<pS->pEList->nE
c250: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
c260: 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20    /* If iCol is 
c270: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
c280: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
c290: 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65  ion requests the
c2a0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
c2b0: 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73  wid of the sub-s
c2c0: 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54  elect or view. T
c2d0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
c2e0: 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20  s legal (see .  
c2f0: 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20          ** test 
c300: 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20  case misc2.2.2) 
c310: 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c  - it always eval
c320: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20  uates to NULL.. 
c330: 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
c340: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 41 4c 57        ** The ALW
c350: 41 59 53 28 29 20 69 73 20 62 65 63 61 75 73 65  AYS() is because
c360: 20 69 43 6f 6c 3e 3d 70 53 2d 3e 70 45 4c 69 73   iCol>=pS->pELis
c370: 74 2d 3e 6e 45 78 70 72 20 77 69 6c 6c 20 68 61  t->nExpr will ha
c380: 76 65 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  ve been.        
c390: 20 20 2a 2a 20 63 61 75 67 68 74 20 61 6c 72 65    ** caught alre
c3a0: 61 64 79 20 62 79 20 6e 61 6d 65 20 72 65 73 6f  ady by name reso
c3b0: 6c 75 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  lution..        
c3c0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e    */.          N
c3d0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
c3e0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
c3f0: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
c400: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20  a[iCol].pExpr;. 
c410: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72           sNC.pSr
c420: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
c430: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
c440: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
c450: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
c460: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
c470: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
c480: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
c490: 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26  NC, p,&zOrigDb,&
c4a0: 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43  zOrigTab,&zOrigC
c4b0: 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20  ol, &estWidth); 
c4c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c4d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d   }else if( pTab-
c4e0: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
c4f0: 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61      /* A real ta
c500: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ble */.        a
c510: 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20  ssert( !pS );.  
c520: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
c530: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
c540: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61  iPKey;.        a
c550: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
c560: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
c570: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
c580: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
c590: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c5a0: 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20 20  ETADATA.        
c5b0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
c5c0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c5d0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
c5e0: 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20       zOrigCol = 
c5f0: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20  "rowid";.       
c600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c610: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
c620: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
c630: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
c640: 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  gCol = pTab->aCo
c650: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
c660: 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64 74           estWidt
c670: 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  h = pTab->aCol[i
c680: 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20  Col].szEst;.    
c690: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
c6a0: 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  rigTab = pTab->z
c6b0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
c6c0: 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b  ( pNC->pParse ){
c6d0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
c6e0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
c6f0: 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70  maToIndex(pNC->p
c700: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
c710: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
c720: 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70       zOrigDb = p
c730: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
c740: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
c750: 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a          }.#else.
c760: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
c770: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
c780: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
c790: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
c7a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
c7b0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
c7c0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
c7d0: 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d        estWidth =
c7e0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c7f0: 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20  ].szEst;.       
c800: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
c810: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
c820: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
c830: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
c840: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
c850: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
c860: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
c870: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
c880: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
c890: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
c8a0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
c8b0: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
c8c0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
c8d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
c8e0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
c8f0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
c900: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
c910: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
c920: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
c930: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
c940: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
c950: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
c960: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
c970: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
c980: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
c990: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
c9a0: 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  );.      sNC.pSr
c9b0: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
c9c0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
c9d0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
c9e0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
c9f0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
ca00: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
ca10: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
ca20: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
ca30: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
ca40: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 62 72  idth); .      br
ca50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
ca60: 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  f.  }..#ifdef SQ
ca70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
ca80: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20  MN_METADATA  .  
ca90: 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a  if( pzOrigDb ){.
caa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
cab0: 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43  igTab && pzOrigC
cac0: 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  ol );.    *pzOri
cad0: 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20  gDb = zOrigDb;. 
cae0: 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20     *pzOrigTab = 
caf0: 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70  zOrigTab;.    *p
cb00: 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67  zOrigCol = zOrig
cb10: 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Col;.  }.#endif.
cb20: 20 20 69 66 28 20 70 45 73 74 57 69 64 74 68 20    if( pEstWidth 
cb30: 29 20 2a 70 45 73 74 57 69 64 74 68 20 3d 20 65  ) *pEstWidth = e
cb40: 73 74 57 69 64 74 68 3b 0a 20 20 72 65 74 75 72  stWidth;.  retur
cb50: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
cb60: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
cb70: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
cb80: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
cb90: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
cba0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
cbb0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
cbc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
cbd0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
cbe0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
cbf0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
cc00: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
cc10: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
cc20: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
cc30: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
cc40: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
cc50: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
cc60: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
cc70: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e  t set */.){.#ifn
cc80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cc90: 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20  DECLTYPE.  Vdbe 
cca0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
ccb0: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  be;.  int i;.  N
ccc0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
ccd0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
cce0: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43   pTabList;.  sNC
ccf0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
cd00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
cd10: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
cd20: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
cd30: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
cd40: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
cd50: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66  char *zType;.#if
cd60: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cd70: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
cd80: 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  A.    const char
cd90: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
cda0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cdb0: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
cdc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
cdd0: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a  igCol = 0;.    z
cde0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
cdf0: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
ce00: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
ce10: 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a  &zOrigCol, 0);..
ce20: 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20      /* The vdbe 
ce30: 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77  must make its ow
ce40: 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  n copy of the co
ce50: 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74  lumn-type and ot
ce60: 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  her .    ** colu
ce70: 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69  mn specific stri
ce80: 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ngs, in case the
ce90: 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74   schema is reset
cea0: 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20   before this.   
ceb0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68   ** virtual mach
cec0: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
ced0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
cee0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
cef0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
cf00: 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62  ATABASE, zOrigDb
cf10: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
cf20: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
cf30: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
cf40: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42  , i, COLNAME_TAB
cf50: 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51  LE, zOrigTab, SQ
cf60: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
cf70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cf80: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
cf90: 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c   COLNAME_COLUMN,
cfa0: 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54   zOrigCol, SQLIT
cfb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65  E_TRANSIENT);.#e
cfc0: 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  lse.    zType = 
cfd0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
cfe0: 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   p, 0, 0, 0, 0);
cff0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
d000: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d010: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d020: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
d030: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d040: 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  T);.  }.#endif /
d050: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
d060: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29  E_OMIT_DECLTYPE)
d070: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   */.}../*.** Gen
d080: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
d090: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
d0a0: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
d0b0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
d0c0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
d0d0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
d0e0: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
d0f0: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
d100: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
d110: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
d120: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
d130: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
d140: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d150: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
d160: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
d170: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
d180: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
d190: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d1a0: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
d1b0: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
d1c0: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
d1d0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
d1e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d1f0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
d200: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
d210: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
d220: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
d230: 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  Names;..#ifndef 
d240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
d250: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
d260: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
d270: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
d280: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
d290: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
d2a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
d2b0: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
d2c0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
d2d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d2e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
d2f0: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
d300: 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 21  ssert( pTabList!
d310: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
d320: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
d330: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
d340: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d350: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
d360: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
d370: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
d380: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
d390: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
d3a0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
d3b0: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
d3c0: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
d3d0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
d3e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
d3f0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
d400: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
d410: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
d420: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
d430: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
d440: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
d450: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
d460: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
d470: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  zName;.      sql
d480: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d490: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d4a0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
d4b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
d4c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
d4d0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
d4e0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  || p->op==TK_AGG
d4f0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
d500: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
d510: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
d520: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
d530: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
d540: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41     for(j=0; ALWA
d550: 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  YS(j<pTabList->n
d560: 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Src); j++){.    
d570: 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
d580: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d  ->a[j].iCursor==
d590: 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61  p->iTable ) brea
d5a0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d5b0: 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c   assert( j<pTabL
d5c0: 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20  ist->nSrc );.   
d5d0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
d5e0: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
d5f0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d600: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
d610: 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
d620: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
d630: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
d640: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
d650: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
d660: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
d670: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
d680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d690: 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
d6a0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
d6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d6c0: 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26  ( !shortNames &&
d6d0: 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20   !fullNames ){. 
d6e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d6f0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d700: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d710: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71   .            sq
d720: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
d730: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  , pEList->a[i].z
d740: 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59  Span), SQLITE_DY
d750: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
d760: 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65  lse if( fullName
d770: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  s ){.        cha
d780: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
d790: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
d7a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
d7b0: 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
d7c0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  zName, zCol);.  
d7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d7e0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d7f0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d800: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59  zName, SQLITE_DY
d810: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
d820: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
d830: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d840: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d850: 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c  _NAME, zCol, SQL
d860: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d870: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d880: 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  e{.      const c
d890: 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d  har *z = pEList-
d8a0: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
d8b0: 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71     z = z==0 ? sq
d8c0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
d8d0: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
d8e0: 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72  ) : sqlite3DbStr
d8f0: 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  Dup(db, z);.    
d900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d910: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d920: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53  LNAME_NAME, z, S
d930: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
d940: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
d950: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
d960: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
d970: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
d980: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
d990: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68  ression list (wh
d9a0: 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68  ich is really th
d9b0: 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
d9c0: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f  sions.** that fo
d9d0: 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  rm the result se
d9e0: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  t of a SELECT st
d9f0: 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65  atement) compute
da00: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
da10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
da20: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f   a table that wo
da30: 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70  uld hold the exp
da40: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
da50: 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e  .** All column n
da60: 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69  ames will be uni
da70: 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  que..**.** Only 
da80: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
da90: 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20   are computed.  
daa0: 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f  Column.zType, Co
dab0: 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61  lumn.zColl,.** a
dac0: 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
dad0: 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65  of Column are ze
dae0: 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  roed..**.** Retu
daf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
db00: 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d  success.  If a m
db10: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
db20: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
db30: 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20  * store NULL in 
db40: 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20  *paCol and 0 in 
db50: 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72  *pnCol and retur
db60: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
db70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
db80: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
db90: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
dba0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
dbb0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
dbc0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
dbd0: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
dbe0: 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77  Expr list from w
dbf0: 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63  hich to derive c
dc00: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
dc10: 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   i16 *pnCol,    
dc20: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
dc30: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
dc40: 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a  columns here */.
dc50: 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c    Column **paCol
dc60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
dc70: 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  te the new colum
dc80: 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29  n list here */.)
dc90: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
dca0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
dcb0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
dcc0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
dcd0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
dce0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
dcf0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33  counters */.  u3
dd00: 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  2 cnt;          
dd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
dd20: 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65  ex added to make
dd30: 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65   the name unique
dd40: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
dd50: 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20  ol, *pCol;      
dd60: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
dd70: 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c   over result col
dd80: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  umns */.  int nC
dd90: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
dda0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ddb0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
ddc0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
ddd0: 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20    Expr *p;      
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ddf0: 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
de00: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
de10: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
de20: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
de30: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
de40: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  n name */.  int 
de50: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
de60: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
de70: 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65  of name in zName
de80: 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b  [] */.  Hash ht;
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
deb0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  e of column name
dec0: 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48  s */..  sqlite3H
ded0: 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20  ashInit(&ht);.  
dee0: 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20  if( pEList ){.  
def0: 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d    nCol = pEList-
df00: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c  >nExpr;.    aCol
df10: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
df20: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
df30: 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29  f(aCol[0])*nCol)
df40: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
df50: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  aCol==0 );.  }el
df60: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30  se{.    nCol = 0
df70: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a  ;.    aCol = 0;.
df80: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43    }.  assert( nC
df90: 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b  ol==(i16)nCol );
dfa0: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
dfb0: 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f  ;.  *paCol = aCo
dfc0: 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  l;..  for(i=0, p
dfd0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
dfe0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
dff0: 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c  ailed; i++, pCol
e000: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20  ++){.    /* Get 
e010: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
e020: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
e030: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
e040: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
e050: 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d  pCollate(pEList-
e060: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
e070: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
e080: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
e090: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
e0a0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
e0b0: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
e0c0: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
e0d0: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
e0e0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65  e name */.    }e
e0f0: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
e100: 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20  *pColExpr = p;  
e110: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
e120: 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65  n that is the re
e130: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
e140: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
e150: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f  *pTab;         /
e160: 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74  * Table associat
e170: 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70  ed with this exp
e180: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
e190: 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72   while( pColExpr
e1a0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
e1b0: 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72          pColExpr
e1c0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69   = pColExpr->pRi
e1d0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
e1e0: 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30  ert( pColExpr!=0
e1f0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
e200: 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e    if( pColExpr->
e210: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
e220: 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72   ALWAYS(pColExpr
e230: 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
e240: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
e250: 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c  umns use the col
e260: 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f  umn name name */
e270: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
e280: 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43  l = pColExpr->iC
e290: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
e2a0: 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Tab = pColExpr->
e2b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66  pTab;.        if
e2c0: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
e2d0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
e2e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69         zName = i
e2f0: 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61  Col>=0 ? pTab->a
e300: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20  Col[iCol].zName 
e310: 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  : "rowid";.     
e320: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45   }else if( pColE
e330: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
e340: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
e350: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
e360: 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f  ty(pColExpr, EP_
e370: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
e380: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f       zName = pCo
e390: 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  lExpr->u.zToken;
e3a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e3b0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
e3c0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
e3d0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
e3e0: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
e3f0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ame */.        z
e400: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
e410: 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
e420: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61   }.    }.    zNa
e430: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
e440: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 7a 4e  ntf(db, "%s", zN
e450: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  ame);..    /* Ma
e460: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
e470: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
e480: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
e490: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
e4a0: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20     ** append an 
e4b0: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
e4c0: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
e4d0: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
e4e0: 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20     */.    cnt = 
e4f0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4e  0;.    while( zN
e500: 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
e510: 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d  shFind(&ht, zNam
e520: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  e)!=0 ){.      n
e530: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
e540: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
e550: 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30       if( nName>0
e560: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e570: 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26  j=nName-1; j>0 &
e580: 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  & sqlite3Isdigit
e590: 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29  (zName[j]); j--)
e5a0: 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  {}.        if( z
e5b0: 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e  Name[j]==':' ) n
e5c0: 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20  Name = j;.      
e5d0: 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  }.      zName = 
e5e0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
e5f0: 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e  b, "%.*z:%u", nN
e600: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e  ame, zName, ++cn
e610: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e  t);.      if( cn
e620: 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72 61  t>3 ) sqlite3_ra
e630: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
e640: 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20  cnt), &cnt);.   
e650: 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
e660: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
e670: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f  sqlite3ColumnPro
e680: 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28  pertiesFromName(
e690: 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66  0, pCol);.    if
e6a0: 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74  ( zName && sqlit
e6b0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68 74  e3HashInsert(&ht
e6c0: 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d  , zName, pCol)==
e6d0: 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 64 62  pCol ){.      db
e6e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
e6f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
e700: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
e710: 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
e720: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e730: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
e740: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
e750: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e760: 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
e770: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e780: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
e790: 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
e7a0: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
e7b0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
e7c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
e7d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e7e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
e7f0: 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
e800: 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
e810: 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
e820: 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
e830: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e840: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
e850: 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
e860: 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
e870: 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
e880: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
e890: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
e8a0: 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
e8b0: 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
e8c0: 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
e8d0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
e8e0: 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
e8f0: 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
e900: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
e910: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
e920: 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
e930: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
e940: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
e950: 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
e960: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
e970: 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  oid selectAddCol
e980: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
e990: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
e9a0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
e9b0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
e9c0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
e9d0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
e9e0: 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  dd column type i
e9f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
ea00: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  is table */.  Se
ea10: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
ea20: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
ea30: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
ea40: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
ea50: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
ea60: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ea70: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
ea80: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
ea90: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
eaa0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
eab0: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
eac0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
ead0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34  t_item *a;.  u64
eae0: 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61   szAll = 0;..  a
eaf0: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d  ssert( pSelect!=
eb00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
eb10: 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
eb20: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29  s & SF_Resolved)
eb30: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
eb40: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65   pTab->nCol==pSe
eb50: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
eb60: 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
eb70: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
eb80: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
eb90: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  d ) return;.  me
eba0: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
ebb0: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
ebc0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
ebd0: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20  lect->pSrc;.  a 
ebe0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
ebf0: 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  t->a;.  for(i=0,
ec00: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
ec10: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
ec20: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
ec30: 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72    p = a[i].pExpr
ec40: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  ;.    if( pCol->
ec50: 7a 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zType==0 ){.    
ec60: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
ec70: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ec80: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  db, .           
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
eca0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
ecb0: 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a  0,0,0, &pCol->sz
ecc0: 45 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Est));.    }.   
ecd0: 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e   szAll += pCol->
ece0: 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d  szEst;.    pCol-
ecf0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
ed00: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
ed10: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
ed20: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
ed30: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
ed40: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
ed50: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
ed60: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
ed70: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
ed80: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
ed90: 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  ol->zColl==0 ){.
eda0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
edb0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
edc0: 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
edd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
ede0: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
edf0: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
ee00: 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f  t(szAll*4);.}../
ee10: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
ee20: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
ee30: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
ee40: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
ee50: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
ee60: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
ee70: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
ee80: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
ee90: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
eea0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
eeb0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
eec0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
eed0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
eee0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
eef0: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
ef00: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
ef10: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
ef20: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
ef30: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
ef40: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
ef50: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
ef60: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
ef70: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
ef80: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
ef90: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
efa0: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
efb0: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
efc0: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
efd0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
efe0: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
eff0: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
f000: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
f010: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
f020: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
f030: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
f040: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
f050: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
f060: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
f070: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
f080: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
f090: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
f0a0: 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
f0b0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
f0c0: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d  aside.bEnabled==
f0d0: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  0 );.  pTab->nRe
f0e0: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
f0f0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62  Name = 0;.  pTab
f100: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
f110: 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
f120: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
f130: 30 34 38 35 37 36 29 20 29 3b 0a 20 20 73 71 6c  048576) );.  sql
f140: 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
f150: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
f160: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
f170: 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
f180: 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65  Tab->aCol);.  se
f190: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
f1a0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
f1b0: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
f1c0: 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
f1d0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
f1e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f1f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
f200: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
f210: 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
f220: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
f230: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
f240: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
f250: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
f260: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
f270: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
f280: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
f290: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
f2a0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
f2b0: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
f2c0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
f2d0: 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
f2e0: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
f2f0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
f300: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f310: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
f320: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f330: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
f340: 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 20  reate(pParse);. 
f350: 20 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74     if( v ) sqlit
f360: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
f370: 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 20 20 69 66  OP_Init);.    if
f380: 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  ( pParse->pTople
f390: 76 65 6c 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f  vel==0.     && O
f3a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
f3b0: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
f3c0: 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
f3d0: 6e 73 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nst).    ){.    
f3e0: 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
f3f0: 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20  tFactor = 1;.   
f400: 20 7d 0a 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   }..  }.  return
f410: 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   v;.}.../*.** Co
f420: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
f430: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
f440: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
f450: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
f460: 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  * pLimit and pOf
f470: 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73  fset expressions
f480: 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  .  pLimit and pO
f490: 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65  ffset hold the e
f4a0: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
f4b0: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
f4c0: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
f4d0: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
f4e0: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
f4f0: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
f500: 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73   Or NULL if thos
f510: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
f520: 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61  mitted. iLimit a
f530: 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61  nd iOffset .** a
f540: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
f550: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
f560: 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
f570: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
f580: 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ute .** the limi
f590: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
f5a0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
f5b0: 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
f5c0: 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d  t, then .** iLim
f5d0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
f5e0: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
f5f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f600: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
f610: 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64  es of iLimit and
f620: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
f630: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
f640: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
f650: 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70   by pLimit and p
f660: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
f670: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
f680: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
f690: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
f6a0: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
f6b0: 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70  lues (zero).** p
f6c0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
f6d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
f6e0: 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74 20  .** The iOffset 
f6f0: 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74 20  register (if it 
f700: 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74 69  exists) is initi
f710: 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61  alized to the va
f720: 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46  lue.** of the OF
f730: 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d 69  FSET.  The iLimi
f740: 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  t register is in
f750: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d  itialized to LIM
f760: 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a 2a  IT.  Register.**
f770: 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69 6e   iOffset+1 is in
f780: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d  itialized to LIM
f790: 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  IT+OFFSET..**.**
f7a0: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
f7b0: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
f7c0: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
f7d0: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
f7e0: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
f7f0: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
f800: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
f810: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
f820: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
f830: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
f840: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
f850: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
f860: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
f870: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
f880: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
f890: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
f8a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
f8b0: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
f8c0: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
f8d0: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
f8e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
f8f0: 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  et;.  int n;.  i
f900: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72  f( p->iLimit ) r
f910: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20  eturn;..  /* .  
f920: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
f930: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
f940: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
f950: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76  ome.  ** controv
f960: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
f970: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
f980: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
f990: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
f9a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f9b0: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
f9c0: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
f9d0: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
f9e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
f9f0: 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
fa00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
fa10: 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  ffset==0 || p->p
fa20: 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66  Limit!=0 );.  if
fa30: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
fa40: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69     p->iLimit = i
fa50: 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65  Limit = ++pParse
fa60: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20  ->nMem;.    v = 
fa70: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
fa80: 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65  Parse);.    asse
fa90: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20  rt( v!=0 );.    
faa0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
fab0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d  sInteger(p->pLim
fac0: 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  it, &n) ){.     
fad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fae0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
faf0: 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  , n, iLimit);.  
fb00: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
fb10: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
fb20: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  er"));.      if(
fb30: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
fb40: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
fb50: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
fb60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d     }else if( n>=
fb70: 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
fb80: 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20  ow>(u64)n ){.   
fb90: 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
fba0: 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  ow = n;.      }.
fbb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fbc0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fbd0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
fbe0: 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  it, iLimit);.   
fbf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fc00: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
fc10: 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56  eInt, iLimit); V
fc20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fc30: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
fc40: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
fc50: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
fc60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fc70: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c  (v, OP_IfNot, iL
fc80: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
fc90: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fca0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
fcb0: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
fcc0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
fcd0: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
fce0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
fcf0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
fd00: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
fd10: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
fd20: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
fd30: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fd40: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fd50: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
fd60: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
fd70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fd80: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
fd90: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
fda0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
fdb0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fdc0: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
fdd0: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
fde0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fdf0: 4f 50 5f 53 65 74 49 66 4e 6f 74 50 6f 73 2c 20  OP_SetIfNotPos, 
fe00: 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  iOffset, iOffset
fe10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
fe20: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fe30: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
fe40: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
fe50: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
fe60: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
fe70: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
fe80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fe90: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 49  ddOp3(v, OP_SetI
fea0: 66 4e 6f 74 50 6f 73 2c 20 69 4c 69 6d 69 74 2c  fNotPos, iLimit,
feb0: 20 69 4f 66 66 73 65 74 2b 31 2c 20 2d 31 29 3b   iOffset+1, -1);
fec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
fed0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fee0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
fef0: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
ff00: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
ff10: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ff20: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
ff30: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
ff40: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
ff50: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
ff60: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
ff70: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
ff80: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
ff90: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
ffa0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
ffb0: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
ffc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
ffd0: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
ffe0: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
fff0: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
10000 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
10010 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
10020 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
10030 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
10040 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
10050 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
10060 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
10070 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
10080 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
10090 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
100a0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
100b0 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
100c0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
100d0 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
100e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
100f0 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
10100 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
10110 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73  );.  /* iCol mus
10120 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70  t be less than p
10130 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e  ->pEList->nExpr.
10140 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65    Otherwise an e
10150 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  rror would.  ** 
10160 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e  have been thrown
10170 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73   during name res
10180 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77  olution and we w
10190 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f  ould not have go
101a0 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66  tten.  ** this f
101b0 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74  ar */.  if( pRet
101c0 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  ==0 && ALWAYS(iC
101d0 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ol<p->pEList->nE
101e0 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74  xpr) ){.    pRet
101f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
10200 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
10210 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
10220 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
10230 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
10240 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
10250 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
10260 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
10270 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f  arameter is a co
10280 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a  mpound SELECT.**
10290 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
102a0 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66  Y clause. This f
102b0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
102c0 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
102d0 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  KeyInfo.** struc
102e0 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f  ture suitable fo
102f0 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  r implementing t
10300 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a  he ORDER BY..**.
10310 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
10320 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
10330 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
10340 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
10350 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
10360 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
10370 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72  nsible for ensur
10380 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
10390 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
103a0 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
103b0 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
103c0 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  o *multiSelectOr
103d0 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72  derByKeyInfo(Par
103e0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
103f0 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72  ct *p, int nExtr
10400 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  a){.  ExprList *
10410 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
10420 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f  rderBy;.  int nO
10430 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
10440 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73  erBy->nExpr;.  s
10450 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
10460 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e  rse->db;.  KeyIn
10470 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  fo *pRet = sqlit
10480 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
10490 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74  b, nOrderBy+nExt
104a0 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52  ra, 1);.  if( pR
104b0 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
104c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
104d0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
104e0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
104f0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
10500 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61  m = &pOrderBy->a
10510 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20  [i];.      Expr 
10520 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e  *pTerm = pItem->
10530 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c  pExpr;.      Col
10540 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
10550 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
10560 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
10570 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  e ){.        pCo
10580 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
10590 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
105a0 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  pTerm);.      }e
105b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
105c0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
105d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
105e0 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  p, pItem->u.x.iO
105f0 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20  rderByCol-1);.  
10600 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
10610 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  =0 ) pColl = db-
10620 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
10630 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
10640 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20  i].pExpr =.     
10650 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10660 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
10670 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
10680 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
10690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
106a0 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
106b0 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
106c0 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52  Ret) );.      pR
106d0 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  et->aColl[i] = p
106e0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74  Coll;.      pRet
106f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
10700 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
10710 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
10720 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
10730 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pRet;.}..#ifndef
10740 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
10750 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10760 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44  ine generates VD
10770 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  BE code to compu
10780 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  te the content o
10790 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49  f a WITH RECURSI
107a0 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74  VE.** query of t
107b0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
107c0 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c   <recursive-tabl
107d0 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75  e> AS (<setup-qu
107e0 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  ery> UNION [ALL]
107f0 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72   <recursive-quer
10800 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  y>).**          
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
10820 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
10830 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
10840 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10860 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
10870 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
10880 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a         p.**.**.*
10890 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  * There is exact
108a0 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  ly one reference
108b0 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76   to the recursiv
108c0 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e-table in the F
108d0 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66  ROM clause.** of
108e0 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
108f0 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68  , marked with th
10900 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66  e SrcList->a[].f
10910 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c  g.isRecursive fl
10920 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ag..**.** The se
10930 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f  tup-query runs o
10940 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  nce to generate 
10950 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f  an initial set o
10960 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a  f rows that go.*
10970 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74  * into a Queue t
10980 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20  able.  Rows are 
10990 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
109a0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f  he Queue table o
109b0 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45  ne by.** one.  E
109c0 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65  ach row extracte
109d0 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20  d from Queue is 
109e0 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
109f0 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c    Then the singl
10a00 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72  e.** extracted r
10a10 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69  ow (now in the i
10a20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62  Current table) b
10a30 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65  ecomes the conte
10a40 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63  nt of the.** rec
10a50 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72  ursive-table for
10a60 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65   a recursive-que
10a70 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74  ry run.  The out
10a80 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72  put of the recur
10a90 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73  sive-query.** is
10aa0 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f   added back into
10ab0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10ac0 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20  .  Then another 
10ad0 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64  row is extracted
10ae0 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61   from Queue.** a
10af0 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  nd the iteration
10b00 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c   continues until
10b10 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10b20 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
10b30 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   If the compound
10b40 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20   query operator 
10b50 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f  is UNION then no
10b60 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20   duplicate rows 
10b70 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65  are ever.** inse
10b80 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75  rted into the Qu
10b90 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  eue table.  The 
10ba0 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20  iDistinct table 
10bb0 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20  keeps a copy of 
10bc0 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74  all rows.** that
10bd0 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20   have ever been 
10be0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75  inserted into Qu
10bf0 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64  eue and causes d
10c00 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a  uplicates to be.
10c10 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49  ** discarded.  I
10c20 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69  f the operator i
10c30 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65  s UNION ALL, the
10c40 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65  n duplicates are
10c50 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a   allowed..** .**
10c60 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61   If the query ha
10c70 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  s an ORDER BY, t
10c80 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74  hen entries in t
10c90 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61  he Queue table a
10ca0 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52  re kept in.** OR
10cb0 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64  DER BY order and
10cc0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
10cd0 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f   is extracted fo
10ce0 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57  r each cycle.  W
10cf0 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44  ithout.** an ORD
10d00 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65  ER BY, the Queue
10d10 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61   table is just a
10d20 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FIFO..**.** If 
10d30 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69  a LIMIT clause i
10d40 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e  s provided, then
10d50 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73   the iteration s
10d60 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54  tops after LIMIT
10d70 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65   rows.** have be
10d80 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  en output to pDe
10d90 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20  st.  A LIMIT of 
10da0 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75  zero means to ou
10db0 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64  tput no rows and
10dc0 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c   a.** negative L
10dd0 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75  IMIT means to ou
10de0 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20  tput all rows.  
10df0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f  If there is also
10e00 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
10e10 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69  e.** with a posi
10e20 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e  tive value, then
10e30 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
10e40 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69  T outputs are di
10e50 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a  scarded rather.*
10e60 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e  * than being sen
10e70 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65  t to pDest.  The
10e80 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65   LIMIT count doe
10e90 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69  s not begin unti
10ea0 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a  l after OFFSET.*
10eb0 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  * rows have been
10ec0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
10ed0 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
10ee0 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
10ef0 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
10f00 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10f10 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10f20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10f40 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
10f50 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  CT to be coded *
10f60 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
10f70 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
10f80 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
10f90 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
10fa0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
10fb0 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20   = p->pSrc;     
10fc0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
10fd0 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72  use of the recur
10fe0 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
10ff0 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45  int nCol = p->pE
11000 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a  List->nExpr;  /*
11010 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
11020 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  ns in the recurs
11030 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56  ive table */.  V
11040 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
11050 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
11060 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
11070 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
11080 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  struction */.  S
11090 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20  elect *pSetup = 
110a0 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20  p->pPrior;   /* 
110b0 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20  The setup query 
110c0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
110d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110e0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
110f0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
11100 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
11110 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54  ak;      /* CONT
11120 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61  INUE and BREAK a
11130 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e  ddresses */.  in
11140 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20  t iCurrent = 0; 
11150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11160 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  he Current table
11170 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72   */.  int regCur
11180 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
11190 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
111a0 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20  holding Current 
111b0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
111c0 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20  Queue;          
111d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
111e0 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
111f0 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d   int iDistinct =
11200 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
11210 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71  * To ensure uniq
11220 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e  ue results if UN
11230 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ION */.  int eDe
11240 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20  st = SRT_Fifo;  
11250 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
11260 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20   write to Queue 
11270 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
11280 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20  destQueue;      
11290 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74     /* SelectDest
112a0 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20   targetting the 
112b0 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
112c0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
112e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
112f0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11310 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
11320 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11330 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
11340 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
11350 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
11360 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
11370 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  Offset;       /*
11380 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64   Saved LIMIT and
11390 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74   OFFSET */.  int
113a0 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66   regLimit, regOf
113b0 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65  fset;      /* Re
113c0 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20  gisters used by 
113d0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
113e0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
113f0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
11400 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65  o do a recursive
11410 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20   query */.  if( 
11420 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
11430 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
11440 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c  RECURSIVE, 0, 0,
11450 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
11460 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
11470 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
11480 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65   clauses, if the
11490 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64  y exist */.  add
114a0 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
114b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
114c0 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
114d0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
114e0 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
114f0 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
11500 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74  Limit;.  pOffset
11510 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
11520 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69   regLimit = p->i
11530 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73  Limit;.  regOffs
11540 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
11550 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
11560 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
11570 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e   p->iLimit = p->
11580 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
11590 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
115a0 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  derBy;..  /* Loc
115b0 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
115c0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72  umber of the Cur
115d0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
115e0 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28  for(i=0; ALWAYS(
115f0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69  i<pSrc->nSrc); i
11600 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72  ++){.    if( pSr
11610 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63  c->a[i].fg.isRec
11620 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
11630 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d  iCurrent = pSrc-
11640 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
11650 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11660 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
11670 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d  cate cursors num
11680 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61  bers for Queue a
11690 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68  nd Distinct.  Th
116a0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
116b0 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73  for.  ** the Dis
116c0 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74  tinct table must
116d0 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   be exactly one 
116e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65  greater than Que
116f0 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a  ue in order.  **
11700 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73   for the SRT_Dis
11710 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69  tFifo and SRT_Di
11720 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74  stQueue destinat
11730 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f  ions to work. */
11740 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72  .  iQueue = pPar
11750 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66  se->nTab++;.  if
11760 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
11770 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  N ){.    eDest =
11780 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
11790 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f  DistQueue : SRT_
117a0 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44  DistFifo;.    iD
117b0 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
117c0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73  ->nTab++;.  }els
117d0 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  e{.    eDest = p
117e0 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75  OrderBy ? SRT_Qu
117f0 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a  eue : SRT_Fifo;.
11800 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
11810 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
11820 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69  tQueue, eDest, i
11830 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c  Queue);..  /* Al
11840 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66  locate cursors f
11850 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75  or Current, Queu
11860 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  e, and Distinct.
11870 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74   */.  regCurrent
11880 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
11890 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
118a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
118b0 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e  nPseudo, iCurren
118c0 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e  t, regCurrent, n
118d0 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  Col);.  if( pOrd
118e0 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
118f0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
11900 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
11910 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
11920 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  , p, 1);.    sql
11930 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11940 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
11950 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  al, iQueue, pOrd
11960 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
11970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11980 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
11990 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
119a0 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75  NFO);.    destQu
119b0 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  eue.pOrderBy = p
119c0 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65  OrderBy;.  }else
119d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
119e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
119f0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
11a00 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a  eue, nCol);.  }.
11a10 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
11a20 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29  , "Queue table")
11a30 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e  );.  if( iDistin
11a40 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64  ct ){.    p->add
11a50 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73  rOpenEphm[0] = s
11a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11a70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11a80 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c  eral, iDistinct,
11a90 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46   0);.    p->selF
11aa0 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
11ab0 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20  phemeral;.  }.. 
11ac0 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f   /* Detach the O
11ad0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
11ae0 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  rom the compound
11af0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e   SELECT */.  p->
11b00 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
11b10 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
11b20 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74  sults of the set
11b30 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75  up-query in Queu
11b40 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e  e. */.  pSetup->
11b50 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20  pNext = 0;.  rc 
11b60 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
11b70 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20  pParse, pSetup, 
11b80 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70  &destQueue);.  p
11b90 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70  Setup->pNext = p
11ba0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
11bb0 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  o end_of_recursi
11bc0 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20  ve_query;..  /* 
11bd0 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f  Find the next ro
11be0 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61  w in the Queue a
11bf0 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72  nd output that r
11c00 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  ow */.  addrTop 
11c10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11c20 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
11c30 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72  , iQueue, addrBr
11c40 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
11c50 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61  ge(v);..  /* Tra
11c60 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72  nsfer the next r
11c70 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72  ow in Queue over
11c80 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   to Current */. 
11c90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11ca0 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
11cb0 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20  , iCurrent); /* 
11cc0 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20  To reset column 
11cd0 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70  cache */.  if( p
11ce0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
11cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11d00 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
11d10 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
11d20 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72  >nExpr+1, regCur
11d30 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rent);.  }else{.
11d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11d50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44  ddOp2(v, OP_RowD
11d60 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67  ata, iQueue, reg
11d70 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  Current);.  }.  
11d80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11d90 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
11da0 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f  iQueue);..  /* O
11db0 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65  utput the single
11dc0 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
11dd0 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  */.  addrCont = 
11de0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11df0 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f  abel(v);.  codeO
11e00 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73  ffset(v, regOffs
11e10 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  et, addrCont);. 
11e20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
11e30 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
11e40 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74 2c  EList, iCurrent,
11e50 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65  .      0, 0, pDe
11e60 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  st, addrCont, ad
11e70 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
11e80 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  regLimit ){.    
11e90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11ea0 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
11eb0 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
11ec0 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
11ed0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11ee0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
11ef0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11f00 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20  , addrCont);..  
11f10 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72  /* Execute the r
11f20 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
11f30 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c  taking the singl
11f40 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
11f50 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c   as.  ** the val
11f60 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72  ue for the recur
11f70 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72  sive-table. Stor
11f80 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
11f90 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f   the Queue..  */
11fa0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
11fb0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
11fc0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
11fd0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11fe0 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72   "recursive aggr
11ff0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f  egate queries no
12000 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  t supported");. 
12010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70   }else{.    p->p
12020 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73  Prior = 0;.    s
12030 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
12040 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
12050 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ue);.    assert(
12060 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
12070 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
12080 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20   pSetup;.  }..  
12090 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20  /* Keep running 
120a0 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74  the loop until t
120b0 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74  he Queue is empt
120c0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
120d0 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f  beGoto(v, addrTo
120e0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  p);.  sqlite3Vdb
120f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
12100 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e   addrBreak);..en
12110 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
12120 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45  uery:.  sqlite3E
12130 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
12140 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72  arse->db, p->pOr
12150 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72  derBy);.  p->pOr
12160 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
12170 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
12180 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66  pLimit;.  p->pOf
12190 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
121a0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
121b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
121c0 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  T_CTE */../* For
121d0 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
121e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
121f0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
12200 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12210 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
12220 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
12230 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
12240 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
12250 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
12260 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
12270 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
12280 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
12290 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
122a0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
122b0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  );../*.** Handle
122c0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
122d0 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  e of a compound-
122e0 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
122f0 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a  inates from a.**
12300 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20   VALUES clause. 
12310 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69   By handling thi
12320 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  s as a special c
12330 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65  ase, we avoid de
12340 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c  ep.** recursion,
12350 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74   and thus do not
12360 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65   need to enforce
12370 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
12380 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
12390 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53  T.** on a VALUES
123a0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42   clause..**.** B
123b0 65 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63  ecause the Selec
123c0 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61  t object origina
123d0 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45  tes from a VALUE
123e0 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28  S clause:.**   (
123f0 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d  1) It has no LIM
12400 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20  IT or OFFSET.** 
12410 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20    (2) All terms 
12420 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a  are UNION ALL.**
12430 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20     (3) There is 
12440 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
12450 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
12460 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
12470 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
12480 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12490 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
124a0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
124b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
124c0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
124d0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
124e0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
124f0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12500 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12510 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12520 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
12530 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 52 6f  Prior;.  int nRo
12540 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20  w = 1;.  int rc 
12550 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
12560 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
12570 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20  MultiValue );.  
12580 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
12590 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
125a0 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61  _Values );.    a
125b0 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
125c0 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d  _ALL || (p->op==
125d0 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e  TK_SELECT && p->
125e0 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20  pPrior==0) );.  
125f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
12600 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  mit==0 );.    as
12610 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
12620 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
12630 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c  t( p->pNext==0 |
12640 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
12650 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45  pr==p->pNext->pE
12660 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
12670 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72     if( p->pPrior
12680 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
12690 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
126a0 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a  or->pNext==p );.
126b0 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f      p = p->pPrio
126c0 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20  r;.    nRow++;. 
126d0 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77 68   }while(1);.  wh
126e0 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70 50  ile( p ){.    pP
126f0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
12700 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
12710 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
12720 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12730 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
12740 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
12750 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 72  Prior;.    if( r
12760 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  c ) break;.    p
12770 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
12780 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  Row;.    p = p->
12790 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pNext;.  }.  ret
127a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
127b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
127c0 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
127d0 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
127e0 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
127f0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
12800 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
12810 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
12820 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
12830 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
12840 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
12850 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
12860 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
12870 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
12880 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
12890 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
128a0 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
128b0 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
128c0 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
128d0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
128e0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
128f0 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
12900 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
12910 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
12920 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
12930 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
12940 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
12950 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
12960 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
12970 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
12980 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
12990 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
129a0 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
129b0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
129c0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
129d0 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
129e0 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
129f0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
12a00 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
12a10 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
12a20 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
12a30 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
12a40 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
12a50 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
12a60 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
12a70 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
12a80 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
12a90 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
12aa0 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
12ab0 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
12ac0 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
12ad0 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
12ae0 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
12af0 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
12b00 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
12b10 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12b20 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
12b30 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
12b40 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
12b50 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
12b60 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
12b70 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
12b80 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
12b90 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
12ba0 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
12bb0 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
12bc0 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
12bd0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
12be0 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
12bf0 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
12c00 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
12c10 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
12c20 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
12c30 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
12c40 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
12c50 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
12c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12c70 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
12c80 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
12c90 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
12ca0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
12cb0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
12cc0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
12cd0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
12ce0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
12cf0 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
12d00 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
12d10 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
12d20 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
12d30 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
12d40 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
12d50 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
12d60 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
12d70 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
12d80 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
12d90 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
12da0 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
12db0 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
12dc0 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
12dd0 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
12de0 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
12df0 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
12e00 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
12e10 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
12e20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12e30 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
12e40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12e50 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
12e60 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
12e70 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
12e80 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
12e90 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
12ea0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
12eb0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
12ec0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
12ed0 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
12ee0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
12ef0 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
12f00 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
12f10 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
12f20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
12f30 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
12f40 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
12f50 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
12f60 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
12f70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
12f80 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
12f90 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
12fa0 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
12fb0 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
12fc0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
12fd0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
12fe0 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
12ff0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
13000 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
13010 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
13020 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
13030 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a  rior;.  dest = *
13040 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
13050 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
13060 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13070 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
13080 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
13090 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
130a0 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
130b0 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
130c0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
130d0 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
130e0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
130f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
13100 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
13110 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13120 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
13130 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
13140 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
13150 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
13160 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
13170 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
13180 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
13190 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
131a0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
131b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
131c0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
131d0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
131e0 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
131f0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
13200 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
13210 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
13220 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
13230 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
13240 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
13250 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
13260 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
13270 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
13280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13290 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
132a0 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
132b0 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73  SDParm, p->pELis
132c0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73  t->nExpr);.    s
132d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
132e0 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
132f0 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74  DERED);.    dest
13300 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
13310 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
13320 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
13330 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
13340 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
13350 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
13360 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
13370 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
13380 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
13390 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
133a0 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
133b0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
133c0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
133d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
133e0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
133f0 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
13400 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
13410 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
13420 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
13430 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
13440 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
13450 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13460 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
13470 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
13480 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
13490 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
134a0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
134b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
134c0 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
134d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
134e0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
134f0 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
13500 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
13510 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
13520 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
13530 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
13540 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
13550 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
13560 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
13570 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
13580 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
13590 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
135a0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
135b0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
135c0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47  .  }else..  /* G
135d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
135e0 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
135f0 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
13600 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
13610 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
13620 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
13630 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
13640 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
13650 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
13660 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
13670 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
13680 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
13690 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->iLimit;.     
136a0 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
136b0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
136c0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
136d0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
136e0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
136f0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
13700 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  set;.      expla
13710 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
13720 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
13730 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
13740 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
13750 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
13760 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
13770 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
13780 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
13790 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
137a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
137b0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
137c0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
137d0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
137e0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69   0;.      p->iLi
137f0 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
13800 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  imit;.      p->i
13810 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
13820 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
13830 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
13840 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
13850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13860 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70  1(v, OP_IfNot, p
13870 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  ->iLimit); VdbeC
13880 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
13890 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
138a0 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
138b0 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
138c0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  "));.        if(
138d0 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20   p->iOffset ){. 
138e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
138f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13900 5f 53 65 74 49 66 4e 6f 74 50 6f 73 2c 20 70 2d  _SetIfNotPos, p-
13910 3e 69 4f 66 66 73 65 74 2c 20 70 2d 3e 69 4f 66  >iOffset, p->iOf
13920 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  fset, 0);.      
13930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13940 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c  ddOp3(v, OP_Add,
13950 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69   p->iLimit, p->i
13960 4f 66 66 73 65 74 2c 20 70 2d 3e 69 4f 66 66 73  Offset, p->iOffs
13970 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  et+1);.         
13980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13990 70 33 28 76 2c 20 4f 50 5f 53 65 74 49 66 4e 6f  p3(v, OP_SetIfNo
139a0 74 50 6f 73 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  tPos, p->iLimit,
139b0 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 2d   p->iOffset+1, -
139c0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
139d0 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c      }.      expl
139e0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
139f0 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
13a00 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
13a10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
13a20 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
13a30 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74   &dest);.      t
13a40 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
13a50 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
13a60 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
13a70 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
13a80 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
13a90 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
13aa0 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
13ab0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
13ac0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
13ad0 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  it.       && sql
13ae0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
13af0 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
13b00 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20  , &nLimit).     
13b10 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26    && nLimit>0 &&
13b20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
13b30 20 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20   (u64)nLimit .  
13b40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
13b50 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
13b60 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
13b70 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
13b80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13b90 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
13ba0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
13bb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13bc0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
13bd0 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
13be0 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
13bf0 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
13c00 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
13c10 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
13c20 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
13c30 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
13c40 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
13c50 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
13c60 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
13c70 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
13c80 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
13c90 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
13ca0 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
13cb0 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
13cc0 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
13cd0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
13ce0 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
13cf0 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
13d00 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
13d10 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
13d20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
13d30 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
13d40 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
13d50 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
13d60 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
13d70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
13d80 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
13d90 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
13da0 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
13db0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
13dc0 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
13dd0 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
13de0 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
13df0 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
13e00 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
13e10 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
13e20 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
13e30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13e40 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
13e50 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
13e60 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
13e70 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
13e80 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13e90 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
13ea0 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
13eb0 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
13ec0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
13ed0 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
13ee0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
13ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
13f00 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
13f10 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
13f20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13f30 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
13f40 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
13f50 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
13f60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13f70 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
13f80 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
13f90 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13fa0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
13fb0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
13fc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13fd0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
13fe0 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
13ff0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14000 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14010 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
14020 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
14030 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
14040 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
14050 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
14060 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
14070 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
14080 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
14090 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
140a0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
140b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
140c0 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
140d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
140e0 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
140f0 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
14100 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
14110 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
14120 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
14130 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  Tab);.      expl
14140 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14150 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
14160 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14170 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14180 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
14190 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
141a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
141b0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
141c0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
141d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
141e0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
141f0 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
14200 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
14210 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
14220 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
14230 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
14240 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
14250 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
14260 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
14270 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
14280 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
14290 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
142a0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
142b0 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
142c0 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
142d0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
142e0 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
142f0 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
14300 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
14310 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
14320 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78  t = op;.      ex
14330 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
14340 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
14350 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
14360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14370 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14380 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
14390 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
143a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
143b0 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
143c0 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
143d0 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
143e0 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
143f0 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
14400 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
14410 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
14420 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
14430 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
14440 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
14450 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
14460 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
14470 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
14480 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
14490 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
144a0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
144b0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
144c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
144d0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e  =TK_UNION ) p->n
144e0 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
144f0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
14500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14510 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
14520 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
14530 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
14540 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
14550 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
14560 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
14570 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
14580 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  fset = 0;..     
14590 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
145a0 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
145b0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
145c0 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
145d0 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
145e0 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
145f0 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
14600 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
14610 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50  onTab==dest.iSDP
14620 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73  arm || dest.eDes
14630 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20  t!=priorOp );.  
14640 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
14650 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st!=priorOp ){. 
14660 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
14670 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
14680 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14690 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
146a0 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
146b0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
146c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  t ){.          S
146d0 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
146e0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
146f0 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
14700 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
14710 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
14720 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
14730 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
14740 73 65 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63  se, pFirst->pSrc
14750 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
14760 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14770 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
14780 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
14790 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
147a0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
147b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
147c0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
147d0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
147e0 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
147f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14800 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14810 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
14820 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  ab, iBreak); Vdb
14830 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14840 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
14850 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
14860 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
14870 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
14880 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
14890 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
148a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
148b0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
148c0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
148d0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
148e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
148f0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
14900 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14910 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14920 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
14930 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
14940 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14950 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14960 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
14970 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
14980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14990 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
149a0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
149b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
149c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
149d0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  ult: assert( p->
149e0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
149f0 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
14a00 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
14a10 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
14a20 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
14a30 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
14a40 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
14a50 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
14a60 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
14a70 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
14a80 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
14a90 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
14aa0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
14ab0 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
14ac0 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
14ad0 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
14ae0 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
14af0 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
14b00 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
14b10 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
14b20 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
14b30 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
14b40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
14b50 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
14b60 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
14b70 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14b80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14b90 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
14ba0 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
14bb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14bc0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14bd0 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
14be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14bf0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
14c00 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
14c10 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14c20 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
14c30 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
14c40 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
14c50 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
14c60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14c70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
14c80 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
14c90 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
14ca0 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
14cb0 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
14cc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
14cd0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14ce0 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
14cf0 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
14d00 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
14d10 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14d20 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
14d30 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
14d40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14d50 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14d60 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
14d70 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
14d80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
14d90 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14da0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
14db0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
14dc0 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
14dd0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
14de0 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
14df0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
14e00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14e10 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14e20 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
14e30 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
14e40 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
14e50 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
14e60 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
14e70 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
14e80 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
14e90 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
14ea0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
14eb0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
14ec0 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
14ed0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
14ee0 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
14ef0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
14f00 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d  sectdest.iSDParm
14f10 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
14f20 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14f30 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
14f40 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14f50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14f60 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14f70 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
14f80 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
14f90 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14fa0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
14fb0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
14fc0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14fd0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
14fe0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
14ff0 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
15000 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
15010 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
15020 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
15030 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
15040 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
15050 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
15060 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
15070 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
15080 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
15090 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
150a0 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
150b0 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
150c0 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
150d0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
150e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
150f0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15100 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
15110 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
15120 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
15130 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
15140 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
15150 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
15160 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
15170 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
15180 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
15190 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
151a0 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20  , pFirst->pSrc, 
151b0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
151c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
151d0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
151e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
151f0 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
15200 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15210 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
15220 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
15230 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
15240 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
15250 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15260 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
15270 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  b1, iBreak); Vdb
15280 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15290 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
152a0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
152b0 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
152c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
152d0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  dOp2(v, OP_RowKe
152e0 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  y, tab1, r1);.  
152f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15300 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
15310 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
15320 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56 64  Cont, r1, 0); Vd
15330 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15340 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
15350 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
15360 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65  e, r1);.      se
15370 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
15380 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
15390 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20  st, tab1,.      
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
153c0 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
153d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
153e0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
153f0 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
15400 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15410 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
15420 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
15430 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
15440 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15450 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
15460 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
15470 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15480 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
15490 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
154a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
154b0 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
154c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
154d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c     }.  }..  expl
154e0 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
154f0 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
15500 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21  1, iSub2, p->op!
15510 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20  =TK_ALL);..  /* 
15520 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
15530 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
15540 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
15550 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
15560 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
15570 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
15580 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
15590 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
155a0 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
155b0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
155c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
155d0 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
155e0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
155f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
15600 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
15610 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
15620 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
15630 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
15640 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
15650 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
15660 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
15670 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
15680 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
15690 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
156a0 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
156b0 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
156c0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
156d0 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
156e0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15700 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
15710 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
15720 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
15730 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15740 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
15750 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
15760 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
15770 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
15780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
15790 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
157a0 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
157b0 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
157c0 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
157d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
157e0 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
157f0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
15800 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
15810 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
15820 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15830 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
15840 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
15850 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
15860 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f  xt==0 );.    nCo
15870 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
15880 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
15890 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
158a0 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f  nfoAlloc(db, nCo
158b0 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  l, 1);.    if( !
158c0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
158d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
158e0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
158f0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
15910 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
15920 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
15930 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
15940 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
15950 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
15960 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
15970 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
15980 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
15990 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
159a0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
159b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
159c0 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
159d0 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
159e0 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
159f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
15a00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
15a10 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
15a20 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
15a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
15a40 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
15a50 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
15a60 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
15a70 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
15a80 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
15a90 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
15aa0 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
15ab0 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
15ac0 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
15ad0 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
15ae0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
15af0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
15b00 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
15b10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
15b20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15b30 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
15b40 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
15b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15b60 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
15b70 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
15b80 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
15b90 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bb0 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
15bc0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
15bd0 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
15be0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
15bf0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79  }.    sqlite3Key
15c00 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
15c10 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
15c20 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
15c30 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
15c40 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
15c50 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
15c60 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
15c70 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
15c80 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
15c90 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
15ca0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
15cb0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
15cc0 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d  /../*.** Error m
15cd0 65 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20  essage for when 
15ce0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  two or more term
15cf0 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  s of a compound 
15d00 73 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66  select have diff
15d10 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65  erent.** size re
15d20 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f  sult sets..*/.vo
15d30 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
15d40 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72  WrongNumTermsErr
15d50 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
15d60 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
15d70 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
15d80 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
15d90 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15da0 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20  sg(pParse, "all 
15db0 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65  VALUES must have
15dc0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
15dd0 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d   of terms");.  }
15de0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
15df0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15e00 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
15e10 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
15e20 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
15e30 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
15e40 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
15e50 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
15e60 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
15e70 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  op));.  }.}../*.
15e80 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
15e90 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
15ea0 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
15eb0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
15ec0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
15ed0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
15ee0 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
15ef0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
15f00 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68   pIn->iSdst.  Th
15f10 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e  ere are.** pIn->
15f20 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f  nSdst columns to
15f30 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
15f40 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
15f50 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
15f60 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
15f70 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
15f80 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
15f90 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
15fa0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
15fb0 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
15fc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
15fd0 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
15fe0 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
15ff0 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
16000 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
16010 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
16020 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
16030 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
16040 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
16050 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
16060 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
16070 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
16080 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
16090 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
160a0 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
160b0 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
160c0 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
160d0 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
160e0 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
160f0 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
16100 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
16110 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
16120 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
16130 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
16140 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
16150 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
16160 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
16170 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
16180 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
16190 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
161a0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
161b0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
161c0 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
161d0 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
161e0 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
161f0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
16200 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
16210 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
16220 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
16230 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
16240 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
16250 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
16260 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
16270 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
16280 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
16290 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
162a0 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
162b0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
162c0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
162d0 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
162e0 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
162f0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ry */.  int iBre
16300 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
16310 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
16320 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
16330 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
16340 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
16350 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
16360 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
16370 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
16380 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16390 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
163a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
163b0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
163c0 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
163d0 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
163e0 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
163f0 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
16400 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
16410 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
16420 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  2;.    addr1 = s
16430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16440 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
16450 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65  gPrev); VdbeCove
16460 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64  rage(v);.    add
16470 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
16480 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
16490 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  pare, pIn->iSdst
164a0 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
164b0 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20  ->nSdst,.       
164c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164d0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
164e0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
164f0 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
16500 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
16510 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16520 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b   OP_Jump, addr2+
16530 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64  2, iContinue, ad
16540 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65  dr2+2); VdbeCove
16550 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
16560 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16570 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
16580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16590 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49  3(v, OP_Copy, pI
165a0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
165b0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d  v+1, pIn->nSdst-
165c0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
165d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
165e0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
165f0 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
16600 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
16610 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
16620 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
16630 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46  ess the first OF
16640 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
16650 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
16660 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
16670 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
16680 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
16690 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  inue);..  assert
166a0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  ( pDest->eDest!=
166b0 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20  SRT_Exists );.  
166c0 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
166d0 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
166e0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  );.  switch( pDe
166f0 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
16700 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
16710 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
16720 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
16730 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16740 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
16750 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
16760 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16770 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16780 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
16790 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
167a0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
167b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
167c0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
167d0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
167e0 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
167f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16800 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
16810 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
16820 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
16830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16840 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
16850 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
16860 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
16870 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16880 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
16890 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
168a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
168b0 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
168c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
168d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
168e0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
168f0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
16900 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16910 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
16920 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
16930 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
16940 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
16950 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
16960 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
16970 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
16980 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
16990 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
169a0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
169b0 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
169c0 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
169d0 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
169e0 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
169f0 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
16a00 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16a10 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
16a20 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
16a30 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
16a40 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20  dst = .         
16a50 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
16a60 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
16a70 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
16a80 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
16a90 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
16aa0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16ab0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
16ac0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16ad0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
16ae0 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31  In->iSdst, 1, r1
16af0 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73  , &pDest->affSds
16b00 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t,1);.      sqli
16b10 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
16b20 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
16b30 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  e, pIn->iSdst, 1
16b40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16b50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16b60 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73  _IdxInsert, pDes
16b70 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b  t->iSDParm, r1);
16b80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16b90 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16ba0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
16bb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
16bc0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16bd0 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
16be0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
16bf0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
16c00 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
16c10 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
16c20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
16c30 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
16c40 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
16c50 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
16c60 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
16c70 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
16c80 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16c90 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
16ca0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20  rse->nErr>0 );  
16cb0 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
16cc0 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst!=1 );.     
16cd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16ce0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
16cf0 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
16d00 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
16d10 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
16d20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
16d30 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
16d40 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
16d50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
16d60 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
16d70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16d80 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
16d90 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
16da0 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
16db0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16dc0 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
16dd0 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
16de0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
16df0 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
16e00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16e10 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
16e20 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
16e30 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
16e40 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
16e50 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
16e60 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
16e70 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16e80 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
16e90 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
16ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16eb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
16ec0 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
16ed0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
16ee0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16ef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16f00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16f10 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
16f20 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
16f30 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
16f40 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
16f50 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
16f60 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
16f70 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
16f80 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
16f90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16fa0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
16fb0 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
16fc0 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
16fd0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
16fe0 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
16ff0 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
17000 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
17010 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
17020 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
17030 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
17040 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
17050 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
17060 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
17070 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
17080 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
17090 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
170a0 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
170b0 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
170c0 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
170d0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
170e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
170f0 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
17100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17110 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
17120 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
17130 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17140 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17150 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
17160 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
17170 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17180 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
17190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
171a0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
171b0 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
171c0 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
171d0 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
171e0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
171f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17200 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
17210 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  umpZero, p->iLim
17220 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
17230 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17240 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
17250 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
17260 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
17270 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17280 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
17290 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
172a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
172b0 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
172c0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
172d0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
172e0 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
172f0 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
17300 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
17310 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
17320 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
17330 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
17340 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
17350 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
17360 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
17370 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
17380 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
17390 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
173a0 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
173b0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
173c0 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
173d0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
173e0 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
173f0 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
17400 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
17410 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
17420 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
17430 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
17440 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
17450 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
17460 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
17470 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
17480 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
17490 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
174a0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
174b0 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
174c0 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
174d0 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
174e0 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
174f0 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
17500 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
17510 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
17520 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
17530 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
17540 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
17550 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
17560 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
17570 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
17580 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
17590 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
175a0 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
175b0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
175c0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
175d0 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
175e0 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
175f0 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
17600 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
17610 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
17620 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
17630 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
17640 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
17650 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
17660 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
17670 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
17680 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
17690 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
176a0 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
176b0 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
176c0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
176d0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
176e0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
176f0 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
17700 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
17710 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
17720 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
17730 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
17740 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
17750 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
17760 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
17770 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
17780 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
17790 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
177a0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
177b0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
177c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
177d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
177e0 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
177f0 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
17800 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
17810 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
17820 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
17830 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
17840 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
17850 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
17860 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
17870 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
17880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
17890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
178a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
178b0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
178c0 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
178d0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
178e0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
178f0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17900 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
17910 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
17920 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
17930 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
17940 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
17950 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
17960 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
17970 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17980 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
17990 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
179a0 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
179b0 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
179c0 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
179d0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
179e0 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
179f0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
17a00 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
17a10 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
17a20 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
17a30 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
17a40 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
17a50 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
17a60 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
17a70 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
17a80 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
17a90 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
17aa0 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
17ab0 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
17ac0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
17ad0 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
17ae0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
17af0 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
17b00 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
17b10 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
17b20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
17b30 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
17b40 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
17b50 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
17b60 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
17b70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
17b80 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
17b90 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
17ba0 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
17bb0 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
17bc0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
17bd0 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
17be0 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
17bf0 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
17c00 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
17c10 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
17c20 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
17c30 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
17c40 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
17c50 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
17c60 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
17c70 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
17c80 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
17c90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
17ca0 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
17cb0 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
17cc0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
17cd0 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
17ce0 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
17cf0 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
17d00 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
17d10 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
17d20 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
17d30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
17d40 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
17d50 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
17d60 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
17d70 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
17d80 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
17d90 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
17da0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17db0 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
17dc0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17dd0 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
17de0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
17df0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
17e00 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
17e10 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
17e20 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
17e30 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
17e40 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
17e50 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
17e60 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
17e70 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
17e80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
17e90 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
17ea0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
17eb0 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
17ec0 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
17ed0 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
17ee0 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
17ef0 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
17f00 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
17f10 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
17f20 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
17f30 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
17f40 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
17f50 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
17f60 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
17f70 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
17f80 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
17f90 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
17fa0 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
17fb0 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
17fc0 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
17fd0 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
17fe0 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
17ff0 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
18000 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
18010 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
18020 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
18030 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
18040 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18050 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
18060 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
18070 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
18080 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
18090 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
180a0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
180b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
180c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
180d0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
180e0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
180f0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
18100 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
18110 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
18120 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
18130 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
18140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18150 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
18160 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
18170 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
18180 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
18190 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
181a0 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
181c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
181d0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
181e0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
181f0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
18200 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
18210 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
18220 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
18230 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
18240 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
18250 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
18260 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18270 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18280 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
18290 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
182a0 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
182b0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
182c0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
182d0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
182e0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
182f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18300 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
18310 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18320 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
18330 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18340 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
18350 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18360 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
18370 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18380 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
18390 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
183a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
183b0 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
183c0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
183d0 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
183e0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
183f0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
18400 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
18410 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
18420 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
18430 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
18440 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
18450 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
18460 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
18470 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18480 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
18490 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
184a0 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
184b0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
184c0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f  .  int addrEofA_
184d0 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65  noB;     /* Alte
184e0 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69  rnate addrEofA i
184f0 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  f B is uninitial
18500 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ized */.  int ad
18510 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
18520 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18530 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
18540 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
18550 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
18560 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18570 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
18580 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18590 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
185a0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
185b0 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
185c0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
185d0 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
185e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
185f0 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
18600 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
18610 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
18620 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
18630 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
18640 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
18650 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
18660 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
18670 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
18680 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
18690 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
186a0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
186b0 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
186c0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
186d0 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
186e0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
186f0 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
18700 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
18710 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
18720 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
18730 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
18740 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
18750 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
18760 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
18770 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
18780 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
18790 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
187a0 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
187b0 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
187c0 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
187d0 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
187e0 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
187f0 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
18800 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
18810 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
18820 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
18830 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
18840 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
18850 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
18860 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
18870 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
18880 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
18890 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
188a0 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
188b0 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
188c0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
188d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
188e0 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
188f0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
18900 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18910 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18920 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
18930 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
18940 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18950 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
18960 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
18970 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18980 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18990 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
189a0 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
189b0 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
189c0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
189d0 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
189e0 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
189f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
18a00 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
18a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
18a20 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
18a30 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
18a40 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
18a50 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
18a60 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
18a70 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
18a80 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
18a90 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
18aa0 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
18ab0 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
18ac0 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
18ad0 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
18ae0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
18af0 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
18b00 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
18b10 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
18b20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
18b30 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
18b40 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
18b50 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
18b60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18b70 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
18b80 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
18b90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18ba0 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
18bb0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
18bc0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
18bd0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
18be0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
18bf0 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
18c00 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
18c10 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
18c20 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
18c30 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
18c40 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
18c50 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
18c60 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
18c70 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
18c80 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
18c90 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
18ca0 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
18cb0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
18cc0 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
18cd0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
18ce0 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
18cf0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
18d00 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
18d10 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
18d20 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
18d30 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
18d40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
18d50 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
18d60 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
18d70 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18d80 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18d90 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
18da0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
18db0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
18dc0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
18dd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18de0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
18df0 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
18e00 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
18e10 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
18e20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
18e30 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
18e40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
18e50 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
18e60 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
18e70 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
18e80 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
18e90 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18ea0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18eb0 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
18ec0 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
18ed0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
18ee0 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
18ef0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
18f00 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
18f10 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
18f20 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
18f30 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
18f40 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
18f50 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
18f60 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
18f70 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
18f80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
18f90 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
18fa0 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
18fb0 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
18fc0 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
18fd0 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
18fe0 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
18ff0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
19000 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
19010 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
19020 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
19030 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
19040 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
19050 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
19060 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
19070 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
19080 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
19090 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
190a0 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
190b0 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
190c0 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
190d0 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
190e0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
190f0 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
19100 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
19110 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79  of(int)*nOrderBy
19120 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
19130 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
19140 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
19150 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Item;.    for(i=
19160 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
19170 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79  y->a; i<nOrderBy
19180 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
19190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
191a0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
191b0 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
191c0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
191d0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c  u.x.iOrderByCol<
191e0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
191f0 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d  r );.      aPerm
19200 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  ute[i] = pItem->
19210 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
19220 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  - 1;.    }.    p
19230 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69  KeyMerge = multi
19240 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
19250 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
19260 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
19270 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a   pKeyMerge = 0;.
19280 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61    }..  /* Reatta
19290 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
192a0 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75  clause to the qu
192b0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ery..  */.  p->p
192c0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
192d0 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f  By;.  pPrior->pO
192e0 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
192f0 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72  ExprListDup(pPar
19300 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79  se->db, pOrderBy
19310 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  , 0);..  /* Allo
19320 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20  cate a range of 
19330 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
19340 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49  ers and the KeyI
19350 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20  nfo needed.  ** 
19360 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68  for the logic th
19370 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69  at removes dupli
19380 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73  cate result rows
19390 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   when the.  ** o
193a0 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
193b0 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
193c0 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20  ERSECT (but not 
193d0 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f  UNION ALL)..  */
193e0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
193f0 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76  L ){.    regPrev
19400 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
19410 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
19420 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
19430 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72  .    assert( nOr
19440 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20  derBy>=nExpr || 
19450 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19460 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20   );.    regPrev 
19470 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
19480 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
19490 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20  em += nExpr+1;. 
194a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
194b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
194c0 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b  er, 0, regPrev);
194d0 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73  .    pKeyDup = s
194e0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
194f0 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29  oc(db, nExpr, 1)
19500 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75  ;.    if( pKeyDu
19510 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
19520 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
19530 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
19540 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66  yDup) );.      f
19550 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
19560 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
19570 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d  KeyDup->aColl[i]
19580 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
19590 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
195a0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
195b0 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
195c0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
195d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f  .    }.  }. .  /
195e0 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c  * Separate the l
195f0 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68  eft and the righ
19600 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65  t query from one
19610 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20   another.  */.  
19620 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
19630 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
19640 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73   0;.  sqlite3Res
19650 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
19660 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
19670 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
19680 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  );.  if( pPrior-
19690 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
196a0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
196b0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
196c0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72  rse, pPrior, pPr
196d0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  ior->pOrderBy, "
196e0 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20  ORDER");.  }..  
196f0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
19700 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a  imit registers *
19710 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
19720 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
19730 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  , p, labelEnd);.
19740 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
19750 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  && op==TK_ALL ){
19760 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
19770 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19780 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d  .    regLimitB =
19790 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
197a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
197b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
197c0 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20  y, p->iOffset ? 
197d0 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70  p->iOffset+1 : p
197e0 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20  ->iLimit,.      
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c              regL
19810 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  imitA);.    sqli
19820 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19830 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d   OP_Copy, regLim
19840 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b  itA, regLimitB);
19850 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
19860 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d  gLimitA = regLim
19870 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  itB = 0;.  }.  s
19880 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
19890 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
198a0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  .  p->pLimit = 0
198b0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
198c0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
198d0 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66  fset);.  p->pOff
198e0 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41  set = 0;..  regA
198f0 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrA = ++pParse-
19900 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
19910 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
19920 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20  em;.  regOutA = 
19930 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19940 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50    regOutB = ++pP
19950 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
19960 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
19970 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f  nit(&destA, SRT_
19980 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19990 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  drA);.  sqlite3S
199a0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
199b0 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estB, SRT_Corout
199c0 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
199d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
199e0 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
199f0 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
19a00 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
19a10 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
19a20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
19a30 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
19a40 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61  select..  */.  a
19a50 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
19a60 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19a70 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64  ddr(v) + 1;.  ad
19a80 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
19a90 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
19aa0 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
19ab0 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65  AddrA, 0, addrSe
19ac0 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f  lectA);.  VdbeCo
19ad0 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20  mment((v, "left 
19ae0 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72  SELECT"));.  pPr
19af0 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65  ior->iLimit = re
19b00 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61  gLimitA;.  expla
19b10 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
19b20 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
19b30 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
19b40 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
19b50 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
19b60 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
19b70 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
19b80 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  ndCoroutine, reg
19b90 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
19ba0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
19bb0 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47   addr1);..  /* G
19bc0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
19bd0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
19be0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
19bf0 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
19c00 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
19c10 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
19c20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
19c30 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19c40 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
19c50 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
19c60 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
19c70 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
19c80 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53  gAddrB, 0, addrS
19c90 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43  electB);.  VdbeC
19ca0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68  omment((v, "righ
19cb0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73  t SELECT"));.  s
19cc0 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
19cd0 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
19ce0 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
19cf0 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
19d00 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
19d10 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
19d20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
19d30 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
19d40 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
19d50 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
19d60 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
19d70 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d  estB);.  p->iLim
19d80 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b  it = savedLimit;
19d90 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
19da0 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73  savedOffset;.  s
19db0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
19dc0 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74  (v, OP_EndCorout
19dd0 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
19de0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
19df0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
19e00 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
19e10 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
19e20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
19e30 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
19e40 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
19e50 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
19e60 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
19e70 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
19e80 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
19e90 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
19ea0 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
19eb0 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ed0 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
19ee0 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
19f00 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
19f10 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
19f20 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
19f30 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
19f40 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
19f50 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
19f60 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
19f70 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
19f80 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
19f90 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
19fa0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
19fb0 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
19fc0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
19fd0 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
19fe0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
19ff0 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
1a000 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1a010 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1a020 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1a030 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
1a040 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a060 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1a070 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1a080 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  }.  sqlite3KeyIn
1a090 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29  foUnref(pKeyDup)
1a0a0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1a0b0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
1a0c0 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1a0d0 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1a0e0 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
1a0f0 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1a100 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
1a110 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1a120 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
1a130 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
1a140 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1a150 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64  drEofA_noB = add
1a160 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64  rEofA = labelEnd
1a170 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1a180 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1a190 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
1a1a0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1a1b0 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
1a1c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a1d0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
1a1e0 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
1a1f0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1a200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a210 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1a220 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e  egAddrB, labelEn
1a230 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a250 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
1a260 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1a270 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1a280 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
1a290 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
1a2a0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1a2b0 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  Row;.  }..  /* G
1a2c0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1a2d0 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
1a2e0 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
1a2f0 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20  m select B.  ** 
1a300 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
1a310 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
1a320 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e  elect A remains.
1a330 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1a340 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1a350 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61      addrEofB = a
1a360 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28  ddrEofA;.    if(
1a370 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
1a380 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1a390 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
1a3a0 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
1a3b0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73  electRow;.  }els
1a3c0 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1a3d0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1a3e0 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
1a3f0 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
1a400 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a410 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1a420 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1a430 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1a440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a450 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a460 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62  , labelEnd); Vdb
1a470 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a480 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1a490 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  o(v, addrEofB);.
1a4a0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1a4b0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1a4c0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
1a4d0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
1a4e0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1a4f0 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
1a500 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
1a510 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a520 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1a530 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1a540 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1a550 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a560 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1a570 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1a580 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1a590 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1a5a0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1a5b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a5c0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1a5d0 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
1a5e0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1a5f0 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1a600 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
1a610 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
1a620 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1a630 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1a640 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
1a650 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
1a660 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1a670 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
1a680 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1a690 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
1a6a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a6b0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a6c0 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1a6d0 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1a6e0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1a6f0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1a700 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
1a710 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1a720 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1a730 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
1a740 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1a750 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
1a760 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1a770 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
1a780 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1a790 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
1a7a0 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
1a7b0 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
1a7c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a7d0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1a7e0 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1a7f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1a800 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a810 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1a820 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1a830 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1a840 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1a850 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1a860 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
1a870 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
1a880 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
1a890 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1a8a0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1a8b0 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
1a8c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a8d0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1a8e0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20   addrEofA_noB); 
1a8f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a900 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a910 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a920 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1a930 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1a940 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d  age(v);..  /* Im
1a950 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
1a960 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
1a970 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1a980 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1a990 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
1a9a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a9b0 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
1a9c0 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
1a9d0 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
1a9e0 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
1a9f0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1aa00 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
1aa10 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69  A.iSdst, destB.i
1aa20 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  Sdst, nOrderBy,.
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa40 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1aa50 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
1aa60 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
1aa70 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1aa80 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
1aa90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1aaa0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
1aab0 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
1aac0 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
1aad0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1aae0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
1aaf0 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
1ab00 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
1ab10 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
1ab20 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1ab30 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1ab40 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
1ab50 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  /* Set the numbe
1ab60 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75  r of output colu
1ab70 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
1ab80 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1ab90 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53  _Output ){.    S
1aba0 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
1abb0 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c  pPrior;.    whil
1abc0 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
1abd0 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
1abe0 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
1abf0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
1ac00 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 46 69  ames(pParse, pFi
1ac10 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73  rst->pSrc, pFirs
1ac20 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t->pEList);.  }.
1ac30 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
1ac40 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
1ac50 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
1ac60 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
1ac70 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
1ac80 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1ac90 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
1aca0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
1acb0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1acc0 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  e(db, p->pPrior)
1acd0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f  ;.  }.  p->pPrio
1ace0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50  r = pPrior;.  pP
1acf0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
1ad00 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
1ad10 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
1ad20 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
1ad30 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
1ad40 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
1ad50 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
1ad60 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
1ad70 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20  (pParse, p->op, 
1ad80 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29  iSub1, iSub2, 0)
1ad90 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
1ada0 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65  e->nErr!=0;.}.#e
1adb0 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
1adc0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1add0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1ade0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1adf0 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72  _VIEW)./* Forwar
1ae00 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
1ae10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1ae20 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69  bstExprList(sqli
1ae30 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c  te3*, ExprList*,
1ae40 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29   int, ExprList*)
1ae50 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
1ae60 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65  bstSelect(sqlite
1ae70 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e  3*, Select *, in
1ae80 74 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  t, ExprList*, in
1ae90 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  t);../*.** Scan 
1aea0 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
1aeb0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
1aec0 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
1aed0 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
1aee0 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
1aef0 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
1af00 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
1af10 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
1af20 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
1af30 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
1af40 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
1af50 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
1af60 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
1af70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1af80 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
1af90 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
1afa0 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
1afb0 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
1afc0 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
1afd0 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
1afe0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
1aff0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1b000 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
1b010 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
1b020 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
1b030 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
1b040 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
1b050 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
1b060 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
1b070 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
1b080 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
1b090 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
1b0a0 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
1b0b0 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
1b0c0 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
1b0d0 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
1b0e0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
1b0f0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
1b100 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
1b110 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1b120 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
1b130 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
1b140 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1b150 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1b160 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
1b170 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
1b180 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
1b190 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1b1a0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1b1b0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
1b1c0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1b1d0 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
1b1e0 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
1b1f0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
1b200 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
1b210 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
1b220 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1b230 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1b240 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
1b250 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
1b260 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
1b270 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
1b280 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
1b290 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
1b2a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b2b0 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
1b2c0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
1b2d0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1b2e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1b2f0 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
1b300 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
1b310 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
1b320 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1b330 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
1b340 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
1b350 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1b360 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1b370 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1b380 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
1b390 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1b3a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
1b3b0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
1b3c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
1b3d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b3e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
1b3f0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b400 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
1b410 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b420 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1b430 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1b440 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1b450 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1b460 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  (db, pExpr->x.pS
1b470 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
1b480 45 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 7d  EList, 1);.    }
1b490 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
1b4a0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
1b4b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
1b4c0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b4d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b4e0 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
1b4f0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1b500 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
1b510 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
1b520 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1b530 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
1b540 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1b550 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1b560 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1b570 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1b580 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
1b590 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
1b5a0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
1b5b0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
1b5c0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1b5d0 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
1b5e0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
1b5f0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1b600 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1b610 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1b620 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1b630 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1b640 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1b650 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
1b660 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
1b670 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
1b680 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1b690 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
1b6a0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1b6b0 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
1b6c0 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
1b6d0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1b6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
1b6f0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1b700 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1b710 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
1b720 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1b730 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1b740 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
1b750 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1b760 69 73 74 2c 20 20 20 20 2f 2a 20 53 75 62 73 74  ist,    /* Subst
1b770 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
1b780 20 20 69 6e 74 20 64 6f 50 72 69 6f 72 20 20 20    int doPrior   
1b790 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62         /* Do sub
1b7a0 73 74 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70  stitutes on p->p
1b7b0 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a  Prior too */.){.
1b7c0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1b7d0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1b7e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1b7f0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70   int i;.  if( !p
1b800 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b   ) return;.  do{
1b810 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1b820 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  st(db, p->pEList
1b830 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b840 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
1b850 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f  List(db, p->pGro
1b860 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
1b870 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
1b880 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
1b890 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
1b8a0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
1b8b0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
1b8c0 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61  tExpr(db, p->pHa
1b8d0 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  ving, iTable, pE
1b8e0 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57  List);.    p->pW
1b8f0 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1b900 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
1b910 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b920 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  .    pSrc = p->p
1b930 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Src;.    assert(
1b940 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20   pSrc!=0 );.    
1b950 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1b960 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1b970 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1b980 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1b990 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d  Select(db, pItem
1b9a0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
1b9b0 65 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a 20  e, pEList, 1);. 
1b9c0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1b9d0 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
1b9e0 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70          substExp
1b9f0 72 4c 69 73 74 28 64 62 2c 20 70 49 74 65 6d 2d  rList(db, pItem-
1ba00 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 69 54  >u1.pFuncArg, iT
1ba10 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1ba20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ba30 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72 20 26  while( doPrior &
1ba40 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72  & (p = p->pPrior
1ba50 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  )!=0 );.}.#endif
1ba60 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
1ba70 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1ba80 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1ba90 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1baa0 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
1bab0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1bac0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1bad0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1bae0 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  VIEW)./*.** This
1baf0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
1bb00 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  s to flatten sub
1bb10 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72  queries as a per
1bb20 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a  formance optimiz
1bb30 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ation..** This r
1bb40 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
1bb50 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
1bb60 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
1bb70 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75   flattening occu
1bb80 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
1bb90 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
1bba0 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
1bbb0 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
1bbc0 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
1bbd0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
1bbe0 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
1bbf0 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
1bc00 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
1bc10 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
1bc20 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
1bc30 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
1bc40 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
1bc50 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
1bc60 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
1bc70 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
1bc80 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
1bc90 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
1bca0 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
1bcb0 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
1bcc0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1bcd0 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
1bce0 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
1bcf0 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
1bd00 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
1bd10 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
1bd20 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
1bd30 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
1bd40 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
1bd50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
1bd60 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
1bd70 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
1bd80 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
1bd90 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
1bda0 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
1bdb0 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
1bdc0 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
1bdd0 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
1bde0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
1bdf0 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
1be00 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
1be10 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
1be20 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
1be30 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66  for this simplif
1be40 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
1be50 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
1be60 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
1be70 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
1be80 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
1be90 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
1bea0 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
1beb0 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
1bec0 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
1bed0 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
1bee0 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
1bef0 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
1bf00 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
1bf10 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
1bf20 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1bf30 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
1bf40 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1bf50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1bf60 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
1bf70 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1bf80 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
1bf90 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
1bfa0 67 67 72 65 67 61 74 65 20 6f 72 20 28 32 61 29  ggregate or (2a)
1bfb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1bfc0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a   is not a join.*
1bfd0 2a 20 20 20 20 20 20 20 20 61 6e 64 20 28 32 62  *        and (2b
1bfe0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1bff0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  y does not use s
1c000 75 62 71 75 65 72 69 65 73 20 6f 74 68 65 72 20  ubqueries other 
1c010 74 68 61 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a 20  than the one.** 
1c020 20 20 20 20 20 20 20 46 52 4f 4d 2d 63 6c 61 75         FROM-clau
1c030 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74  se subquery that
1c040 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
1c050 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  for flattening. 
1c060 20 28 32 62 20 69 73 0a 2a 2a 20 20 20 20 20 20   (2b is.**      
1c070 20 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74 20    due to ticket 
1c080 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62 66  [2f7170d73bf9abf
1c090 38 30 5d 20 66 72 6f 6d 20 32 30 31 35 2d 30 32  80] from 2015-02
1c0a0 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33  -09.).**.**   (3
1c0b0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c0c0 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
1c0d0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
1c0e0 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a  ft outer join.**
1c0f0 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61          (Origina
1c100 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e  lly ticket #306.
1c110 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62    Strengthened b
1c120 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a  y ticket #3300).
1c130 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
1c140 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1c150 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1c160 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70    (**)  At one p
1c170 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e  oint restriction
1c180 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65  s (4) and (5) de
1c190 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f  fined a subset o
1c1a0 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20  f DISTINCT.**   
1c1b0 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73       sub-queries
1c1c0 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75   that were exclu
1c1d0 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70  ded from this op
1c1e0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74  timization. Rest
1c1f0 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  riction .**     
1c200 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65     (4) has since
1c210 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74   been expanded t
1c220 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49  o exclude all DI
1c230 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65  STINCT subquerie
1c240 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
1c250 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c260 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
1c270 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
1c280 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
1c290 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
1c2a0 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
1c2b0 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
1c2c0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
1c2d0 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
1c2e0 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
1c2f0 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
1c300 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
1c310 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
1c320 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70  lose with the sp
1c330 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
1c340 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
1c350 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
1c360 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
1c370 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1c380 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
1c390 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
1c3a0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1c3b0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1c3c0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1c3d0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
1c3e0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
1c3f0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c400 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1c410 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1c420 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
1c430 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
1c440 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ates..**.**  (**
1c450 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  )  Restriction (
1c460 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20  10) was removed 
1c470 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e  from the code on
1c480 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20   2005-02-05 but 
1c490 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63  we.**        acc
1c4a0 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20  idently carried 
1c4b0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77  the comment forw
1c4c0 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30  ard until 2014-0
1c4d0 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a  9-15.  Original.
1c4e0 2a 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a 20  **        text: 
1c4f0 22 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f  "The subquery do
1c500 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
1c510 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
1c520 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20  er query .**    
1c530 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65      does not use
1c540 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20   LIMIT.".**.**  
1c550 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
1c560 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1c570 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1c580 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
1c590 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1c5a0 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
1c5b0 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
1c5c0 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1c5d0 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
1c5e0 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
1c5f0 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
1c600 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
1c610 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
1c620 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
1c630 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1c640 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
1c650 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
1c660 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
1c670 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1c680 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
1c690 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
1c6a0 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1c6b0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
1c6c0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1c6d0 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
1c6e0 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
1c6f0 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
1c700 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
1c710 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
1c720 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
1c730 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
1c740 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
1c750 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1c760 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1c770 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
1c780 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
1c790 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
1c7a0 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
1c7b0 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
1c7c0 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
1c7d0 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
1c7e0 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
1c7f0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
1c800 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
1c810 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
1c820 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
1c830 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1c840 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
1c850 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
1c860 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
1c870 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
1c880 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
1c890 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
1c8a0 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
1c8b0 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
1c8c0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1c8d0 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
1c8e0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1c8f0 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
1c900 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
1c910 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
1c920 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
1c930 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1c940 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a   not a join.**.*
1c950 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
1c960 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
1c970 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
1c980 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
1c990 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
1c9a0 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
1c9b0 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
1c9c0 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
1c9d0 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
1c9e0 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
1c9f0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1ca00 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63    The subquery c
1ca10 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f  annot use any co
1ca20 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1ca30 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20   operator other 
1ca40 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62  than UNION ALL b
1ca50 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f  ecause all the o
1ca60 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  ther compound.**
1ca70 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1ca80 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65  s have an implie
1ca90 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68  d DISTINCT which
1caa0 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62   is disallowed b
1cab0 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74  y.**        rest
1cac0 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a  riction (4)..**.
1cad0 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20  **        Also, 
1cae0 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  each component o
1caf0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1cb00 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  must return the 
1cb10 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  same number.**  
1cb20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20        of result 
1cb30 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73  columns. This is
1cb40 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75   actually a requ
1cb50 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20  irement for any 
1cb60 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1cb70 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d     SELECT statem
1cb80 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  ent, but all the
1cb90 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20   code here does 
1cba0 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  is make sure tha
1cbb0 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  t no.**        s
1cbc0 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75  uch (illegal) su
1cbd0 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74  b-query is flatt
1cbe0 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  ened. The caller
1cbf0 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65   will detect the
1cc00 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61  .**        synta
1cc10 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  x error and retu
1cc20 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65  rn a detailed me
1cc30 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  ssage..**.**  (1
1cc40 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
1cc50 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1cc60 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1cc70 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1cc80 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
1cc90 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
1cca0 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
1ccb0 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
1ccc0 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
1ccd0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1cce0 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
1ccf0 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71    (19)  The subq
1cd00 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1cd10 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1cd20 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1cd30 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
1cd40 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
1cd50 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
1cd60 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1cd70 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
1cd80 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
1cd90 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
1cda0 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
1cdb0 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
1cdc0 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
1cdd0 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
1cde0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
1cdf0 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
1ce00 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
1ce10 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1ce20 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
1ce30 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
1ce40 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
1ce50 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
1ce60 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1ce70 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
1ce80 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
1ce90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
1cea0 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
1ceb0 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
1cec0 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73  .**  (21)  The s
1ced0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1cee0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1cef0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1cf00 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
1cf10 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
1cf20 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
1cf30 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29  c])..**.**  (22)
1cf40 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1cf50 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1cf60 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  e CTE..**.**  (2
1cf70 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69  3)  The parent i
1cf80 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1cf90 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75  e CTE, or the su
1cfa0 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1cfb0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1cfc0 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20  und query. This 
1cfd0 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62  restriction is b
1cfe0 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d  ecause transform
1cff0 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
1d000 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f    parent to a co
1d010 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e  mpound query con
1d020 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74  fuses the code t
1d030 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20  hat handles.**  
1d040 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20        recursive 
1d050 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69  queries in multi
1d060 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Select()..**.** 
1d070 20 28 32 34 29 20 20 54 68 65 20 73 75 62 71 75   (24)  The subqu
1d080 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1d090 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73 65  gregate that use
1d0a0 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d  s the built-in m
1d0b0 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20  in() or .**     
1d0c0 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63     or max() func
1d0d0 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74  tions.  (Without
1d0e0 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
1d0f0 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a  n, a query like:
1d100 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45  .**        "SELE
1d110 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT x FROM (SELEC
1d120 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d  T max(y), x FROM
1d130 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20   t1)" would not 
1d140 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20  necessarily.**  
1d150 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65        return the
1d160 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69   value X for whi
1d170 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c  ch Y was maximal
1d180 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  .).**.**.** In t
1d190 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1d1a0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1d1b0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1d1c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1d1d0 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
1d1e0 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
1d1f0 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
1d200 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
1d210 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
1d220 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
1d230 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
1d240 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
1d250 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1d260 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
1d270 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
1d280 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
1d290 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1d2a0 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
1d2b0 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
1d2c0 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
1d2d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1d2e0 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
1d2f0 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
1d300 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
1d310 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
1d320 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d330 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
1d340 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
1d350 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
1d360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
1d370 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
1d380 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1d390 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1d3a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1d3b0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1d3c0 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
1d3d0 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
1d3e0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
1d3f0 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
1d400 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1d410 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
1d420 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
1d430 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
1d440 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
1d450 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
1d460 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
1d470 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1d480 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
1d490 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
1d4a0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1d4b0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1d4c0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
1d4d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1d4e0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1d4f0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1d500 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
1d510 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20  *pParent;    /* 
1d520 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c  Current UNION AL
1d530 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74  L term of the ot
1d540 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  her query */.  S
1d550 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
1d560 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
1d570 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
1d580 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
1d590 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
1d5a0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
1d5b0 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
1d5c0 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
1d5d0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1d5e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
1d5f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1d600 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
1d610 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
1d620 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
1d630 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1d640 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
1d650 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
1d660 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
1d670 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
1d680 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
1d690 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
1d6a0 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
1d6b0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
1d6c0 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
1d6d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1d6e0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1d6f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1d700 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
1d710 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d720 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1d730 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
1d740 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d750 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
1d760 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
1d770 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1d780 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
1d790 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1d7a0 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
1d7b0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
1d7c0 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
1d7d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1d7e0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1d7f0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
1d800 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66    /* Unable to f
1d810 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20  latten compound 
1d820 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28  queries */.  if(
1d830 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
1d840 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
1d850 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
1d860 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1d870 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
1d880 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
1d890 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
1d8a0 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
1d8b0 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
1d8c0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
1d8d0 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
1d8e0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1d8f0 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
1d900 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
1d910 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
1d920 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
1d930 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  gg ){.    if( is
1d940 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d970 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1d980 29 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  )   */.    if( p
1d990 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
1d9a0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d9d0 32 61 29 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  2a)  */.    if( 
1d9e0 28 70 2d 3e 70 57 68 65 72 65 20 26 26 20 45 78  (p->pWhere && Ex
1d9f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d  prHasProperty(p-
1da00 3e 70 57 68 65 72 65 2c 45 50 5f 53 75 62 71 75  >pWhere,EP_Subqu
1da10 65 72 79 29 29 0a 20 20 20 20 20 7c 7c 20 28 73  ery)).     || (s
1da20 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
1da30 61 67 73 28 70 2d 3e 70 45 4c 69 73 74 29 20 26  ags(p->pEList) &
1da40 20 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30   EP_Subquery)!=0
1da50 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  .     || (sqlite
1da60 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
1da70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 20 45 50  ->pOrderBy) & EP
1da80 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20  _Subquery)!=0.  
1da90 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1daa0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dad0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 62   Restriction (2b
1dae0 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  )  */.    }.  }.
1daf0 20 20 20 20 0a 20 20 70 53 75 62 53 72 63 20 3d      .  pSubSrc =
1db00 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
1db10 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
1db20 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
1db30 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
1db40 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
1db50 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
1db60 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
1db70 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
1db80 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
1db90 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
1dba0 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
1dbb0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1dbc0 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
1dbd0 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
1dbe0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1dbf0 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
1dc00 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
1dc10 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
1dc20 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
1dc30 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
1dc40 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
1dc50 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
1dc60 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
1dc70 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1dc80 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
1dc90 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1dca0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dcb0 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
1dcc0 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20  ( pSub->pOffset 
1dcd0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dd00 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
1dd10 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1dd20 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30   SF_Compound)!=0
1dd30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
1dd40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1dd50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd80 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
1dd90 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
1dda0 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
1ddb0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1dde0 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (7)  */.  if( pS
1ddf0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1de00 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  F_Distinct ) ret
1de10 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1de20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1de30 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (5)  */.  if( pS
1de40 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1de50 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
1de60 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
1de70 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1de80 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
1de90 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20  (8)(9) */.  }.  
1dea0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1deb0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
1dec0 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73  =0 && subqueryIs
1ded0 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75  Agg ){.     retu
1dee0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1def0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
1df00 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70    */.  }.  if( p
1df10 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
1df20 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1df30 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1df70 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
1df80 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
1df90 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1dfa0 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dfc0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
1dfd0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1dfe0 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68  pLimit && p->pWh
1dff0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e010 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29  Restriction (19)
1e020 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1e030 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65  pLimit && (p->se
1e040 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1e050 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  inct)!=0 ){.    
1e060 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1e070 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e080 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (21) */.  }.  
1e090 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e  testcase( pSub->
1e0a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1e0b0 63 75 72 73 69 76 65 20 29 3b 0a 20 20 74 65 73  cursive );.  tes
1e0c0 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c  tcase( pSub->sel
1e0d0 46 6c 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d 61  Flags & SF_MinMa
1e0e0 78 41 67 67 20 29 3b 0a 20 20 69 66 28 20 70 53  xAgg );.  if( pS
1e0f0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  ub->selFlags & (
1e100 53 46 5f 52 65 63 75 72 73 69 76 65 7c 53 46 5f  SF_Recursive|SF_
1e110 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20 20  MinMaxAgg) ){.  
1e120 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1e130 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29  estrictions (22)
1e140 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20 7d   and (24) */.  }
1e150 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1e160 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
1e170 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72  ve) && pSub->pPr
1e180 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
1e190 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74  n 0; /* Restrict
1e1a0 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d 0a  ion (23) */.  }.
1e1b0 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  /* OBSOLETE C
1e1c0 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52  OMMENT 1:.  ** R
1e1d0 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
1e1e0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1e1f0 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
1e200 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
1e210 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
1e220 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
1e230 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
1e240 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
1e250 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
1e260 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
1e270 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
1e280 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
1e290 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
1e2a0 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
1e2b0 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
1e2c0 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
1e2d0 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
1e2e0 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
1e2f0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
1e300 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
1e310 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
1e320 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
1e330 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  thing..  **.  **
1e340 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1e350 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 2:.  ** Restri
1e360 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
1e370 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
1e380 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1e390 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
1e3a0 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
1e3b0 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
1e3c0 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
1e3d0 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
1e3e0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
1e3f0 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
1e400 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1e410 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1e420 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
1e430 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
1e440 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
1e450 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
1e460 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
1e470 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
1e480 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
1e490 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
1e4a0 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
1e4b0 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
1e4c0 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
1e4d0 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
1e4e0 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
1e4f0 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
1e500 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
1e510 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
1e520 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
1e530 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   JOIN..  **.  **
1e540 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20   THIS OVERRIDES 
1e550 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
1e560 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a  S 1 AND 2 ABOVE:
1e570 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33  .  ** Ticket #33
1e580 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c  00 shows that fl
1e590 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67  attening the rig
1e5a0 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
1e5b0 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66  T JOIN.  ** is f
1e5c0 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67  raught with dang
1e5d0 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f  er.  Best to avo
1e5e0 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  id the whole thi
1e5f0 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  ng.  If the.  **
1e600 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1e610 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
1e620 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
1e630 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
1e640 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75  .  */.  if( (pSu
1e650 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  bitem->fg.jointy
1e660 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1e670 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1e680 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
1e690 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20  triction 17: If 
1e6a0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1e6b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1e6c0 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
1e6d0 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
1e6e0 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
1e6f0 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
1e700 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
1e710 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
1e720 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
1e730 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
1e740 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
1e750 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
1e760 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
1e770 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
1e780 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
1e790 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
1e7a0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1e7b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1e7c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30  * Restriction 20
1e7d0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
1e7e0 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
1e7f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1e800 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
1e810 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
1e820 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e830 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
1e840 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
1e850 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
1e860 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
1e870 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1e880 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1e890 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1e8a0 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
1e8b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1e8c0 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
1e8d0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1e8e0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1e8f0 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
1e900 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e910 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
1e920 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e930 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSub->pEList->n
1e940 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c  Expr==pSub1->pEL
1e950 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1e960 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
1e970 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1e980 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1e990 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20  gate))!=0.      
1e9a0 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69   || (pSub1->pPri
1e9b0 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21  or && pSub1->op!
1e9c0 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20  =TK_ALL) .      
1e9d0 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
1e9e0 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 29 7b  >nSrc<1.      ){
1e9f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ea00 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1ea10 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
1ea20 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
1ea30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ea40 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20  Restriction 18. 
1ea50 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
1ea60 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1ea70 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
1ea80 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
1ea90 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
1eaa0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
1eab0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
1eac0 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  [ii].u.x.iOrderB
1ead0 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  yCol==0 ) return
1eae0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1eaf0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  }.  }..  /***** 
1eb00 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1eb10 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
1eb20 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
1eb30 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54   *****/.  SELECT
1eb40 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
1eb50 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70  ,("flatten %s.%p
1eb60 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22   from term %d\n"
1eb70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1eb80 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e       pSub->zSelN
1eb90 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d  ame, pSub, iFrom
1eba0 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  ));..  /* Author
1ebb0 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
1ebc0 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
1ebd0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
1ebe0 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
1ebf0 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
1ec00 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1ec10 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
1ec20 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
1ec30 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
1ec40 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
1ec50 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1ec60 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
1ec70 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
1ec80 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1ec90 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
1eca0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1ecb0 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
1ecc0 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
1ecd0 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
1ece0 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
1ecf0 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
1ed00 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
1ed10 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
1ed20 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
1ed30 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
1ed40 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
1ed50 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
1ed60 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
1ed70 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
1ed80 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
1ed90 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
1eda0 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
1edb0 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
1edc0 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
1edd0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1ede0 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
1edf0 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
1ee00 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
1ee10 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
1ee20 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
1ee30 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
1ee40 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
1ee50 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
1ee60 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
1ee70 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
1ee80 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
1ee90 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
1eea0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
1eeb0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
1eec0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
1eed0 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
1eee0 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
1eef0 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
1ef00 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
1ef10 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
1ef20 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1ef30 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
1ef40 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
1ef50 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1ef60 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1ef70 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
1ef80 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
1ef90 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
1efa0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
1efb0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
1efc0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1efd0 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
1efe0 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
1eff0 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
1f000 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
1f010 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
1f020 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
1f030 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1f040 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1f050 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
1f060 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
1f070 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
1f080 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1f090 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
1f0a0 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
1f0b0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1f0c0 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
1f0d0 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
1f0e0 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
1f0f0 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
1f100 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
1f110 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1f120 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1f130 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
1f140 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
1f150 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  mit;.    Expr *p
1f160 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
1f170 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  set;.    Select 
1f180 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
1f190 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
1f1a0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
1f1b0 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
1f1c0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
1f1d0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
1f1e0 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1f1f0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
1f200 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
1f210 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
1f220 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
1f230 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d  Name(pNew, pSub-
1f240 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  >zSelName);.    
1f250 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
1f260 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  fset;.    p->pLi
1f270 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1f280 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1f290 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
1f2a0 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
1f2b0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
1f2c0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
1f2d0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50  0 ){.      p->pP
1f2e0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1f2f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f300 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
1f310 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
1f320 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
1f330 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
1f340 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
1f350 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e  t = p;.      p->
1f360 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
1f370 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
1f380 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20  (2,pParse,p,.   
1f390 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64        ("compound
1f3a0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1f3b0 6e 65 72 20 63 72 65 61 74 65 73 20 25 73 2e 25  ner creates %s.%
1f3c0 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20  p as peer\n",.  
1f3d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65         pNew->zSe
1f3e0 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20  lName, pNew));. 
1f3f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
1f400 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1f410 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1f420 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65   /* Begin flatte
1f430 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74  ning the iFrom-t
1f440 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
1f450 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a  ROM clause .  **
1f460 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1f470 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
1f480 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
1f490 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  tem->pSelect;.. 
1f4a0 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74   /* Delete the t
1f4b0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
1f4c0 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61  tructure associa
1f4d0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
1f4e0 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a  * subquery.  */.
1f4f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f500 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
1f510 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69  atabase);.  sqli
1f520 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1f530 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
1f540 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f550 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  db, pSubitem->zA
1f560 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65  lias);.  pSubite
1f570 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
1f580 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ;.  pSubitem->zN
1f590 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ame = 0;.  pSubi
1f5a0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
1f5b0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65  .  pSubitem->pSe
1f5c0 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lect = 0;..  /* 
1f5d0 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74  Defer deleting t
1f5e0 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
1f5f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f600 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1f610 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e  y until code gen
1f620 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  eration is.  ** 
1f630 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20  complete, since 
1f640 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20  there may still 
1f650 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20  exist Expr.pTab 
1f660 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a  entries that.  *
1f670 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73  * refer to the s
1f680 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74  ubquery even aft
1f690 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  er flattening.  
1f6a0 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20  Ticket #3346..  
1f6b0 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d  **.  ** pSubitem
1f6c0 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73  ->pTab is always
1f6d0 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73   non-NULL by tes
1f6e0 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61  t restrictions a
1f6f0 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a  nd tests above..
1f700 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59    */.  if( ALWAY
1f710 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  S(pSubitem->pTab
1f720 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c  !=0) ){.    Tabl
1f730 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70  e *pTabToDel = p
1f740 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  Subitem->pTab;. 
1f750 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c     if( pTabToDel
1f760 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20  ->nRef==1 ){.   
1f770 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65     Parse *pTople
1f780 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1f790 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1f7a0 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  e);.      pTabTo
1f7b0 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65  Del->pNextZombie
1f7c0 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a   = pToplevel->pZ
1f7d0 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20  ombieTab;.      
1f7e0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1f7f0 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65  ieTab = pTabToDe
1f800 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
1f810 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e      pTabToDel->n
1f820 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref--;.    }.   
1f830 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1f840 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
1f850 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
1f860 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
1f870 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63  each term in a c
1f880 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1f890 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67  .  ** flattening
1f8a0 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61   (as described a
1f8b0 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72  bove).  If we ar
1f8c0 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72  e doing a differ
1f8d0 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66  ent kind.  ** of
1f8e0 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20   flattening - a 
1f8f0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72  flattening other
1f900 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64   than a compound
1f910 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1f920 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e  ning -.  ** then
1f930 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20   this loop only 
1f940 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a  runs once..  **.
1f950 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d    ** This loop m
1f960 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20  oves all of the 
1f970 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
1f980 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
1f990 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
1f9a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1f9b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1f9c0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
1f9d0 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
1f9e0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
1f9f0 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
1fa00 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
1fa10 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
1fa20 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
1fa30 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
1fa40 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
1fa50 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
1fa60 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
1fa70 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
1fa80 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
1fa90 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
1faa0 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
1fab0 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
1fac0 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
1fad0 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
1fae0 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
1faf0 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
1fb00 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
1fb10 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
1fb20 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70  .  for(pParent=p
1fb30 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65  ; pParent; pPare
1fb40 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69  nt=pParent->pPri
1fb50 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  or, pSub=pSub->p
1fb60 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20  Prior){.    int 
1fb70 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20  nSubSrc;.    u8 
1fb80 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1fb90 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
1fba0 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1fbb0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ROM clause of su
1fbc0 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53  bquery */.    nS
1fbd0 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
1fbe0 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65  >nSrc;  /* Numbe
1fbf0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75  r of terms in su
1fc00 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75  bquery FROM clau
1fc10 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  se */.    pSrc =
1fc20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20   pParent->pSrc; 
1fc30 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1fc40 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1fc50 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66  query */..    if
1fc60 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ( pSrc ){.      
1fc70 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
1fc80 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20  =p );  /* First 
1fc90 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65  time through the
1fca0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a   loop */.      j
1fcb0 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
1fcc0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  em->fg.jointype;
1fcd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fce0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1fcf0 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20  t!=p );  /* 2nd 
1fd00 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74  and subsequent t
1fd10 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  imes through the
1fd20 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70   loop */.      p
1fd30 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
1fd40 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
1fd50 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30  ListAppend(db, 0
1fd60 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
1fd70 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( pSrc==0 ){.  
1fd80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
1fd90 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1fda0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1fdb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1fdc0 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
1fdd0 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c  ery uses a singl
1fde0 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52  e slot of the FR
1fdf0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1fe00 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75   outer.    ** qu
1fe10 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62  ery.  If the sub
1fe20 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74  query has more t
1fe30 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20  han one element 
1fe40 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
1fe50 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  se,.    ** then 
1fe60 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
1fe70 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73   query to make s
1fe80 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68  pace for it to h
1fe90 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73  old all elements
1fea0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
1feb0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a  ubquery..    **.
1fec0 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
1fed0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1fee0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1fef0 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46  abA, (SELECT * F
1ff00 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c  ROM sub1, sub2),
1ff10 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20   tabB;.    **.  
1ff20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71    ** The outer q
1ff30 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73  uery has 3 slots
1ff40 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
1ff50 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f  use.  One slot o
1ff60 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  f the.    ** out
1ff70 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69  er query (the mi
1ff80 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73  ddle slot) is us
1ff90 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65  ed by the subque
1ffa0 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20  ry.  The next.  
1ffb0 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f    ** block of co
1ffc0 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74  de will expand t
1ffd0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  he outer query F
1ffe0 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34 20  ROM clause to 4 
1fff0 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
20000 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69 73  e middle slot is
20010 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f   expanded to two
20020 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20   slots in order 
20030 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20  to make space.  
20040 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77 6f    ** for the two
20050 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
20060 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
20070 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
20080 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75    */.    if( nSu
20090 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
200a0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
200b0 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
200c0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
200d0 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31   pSrc, nSubSrc-1
200e0 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20  ,iFrom+1);.     
200f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
20100 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
20110 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
20120 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72      }..    /* Tr
20130 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20  ansfer the FROM 
20140 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f  clause terms fro
20150 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  m the subquery i
20160 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nto the.    ** o
20170 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
20180 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
20190 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
201a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64  .      sqlite3Id
201b0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
201c0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
201d0 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61  pUsing);.      a
201e0 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
201f0 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62  +iFrom].fg.isTab
20200 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Func==0 );.     
20210 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
20220 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
20230 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
20240 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
20250 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
20260 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
20270 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
20280 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om].fg.jointype 
20290 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20  = jointype;.  . 
202a0 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20     /* Now begin 
202b0 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
202c0 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
202d0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
202e0 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e   .    ** referen
202f0 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
20300 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
20310 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20  query..    ** . 
20320 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
20330 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
20340 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
20350 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
20360 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
20370 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
20380 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20  a>b;.    **   \ 
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203a0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
203b0 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
203c0 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
203d0 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f   /.    **    \__
203e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
203f0 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
20400 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20410 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
20420 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65      **.    ** We
20430 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
20440 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
20450 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
20460 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
20470 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77  see.    ** "a" w
20480 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
20490 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
204a0 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
204b0 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
204c0 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  0"..    */.    p
204d0 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e  List = pParent->
204e0 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
204f0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
20500 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
20510 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
20520 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  .zName==0 ){.   
20530 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
20540 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
20550 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
20560 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  i].zSpan);.     
20570 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
20580 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
20590 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
205a0 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
205b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
205c0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
205d0 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74  y ){.      /* At
205e0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79   this point, any
205f0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72   non-zero iOrder
20600 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64  ByCol values ind
20610 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20  icate that the. 
20620 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
20630 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
20640 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20  on is identical 
20650 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43  to the iOrderByC
20660 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65  ol'th.      ** e
20670 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e  xpression return
20680 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61  ed by SELECT sta
20690 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e  tement pSub. Sin
206a0 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a  ce these values.
206b0 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20        ** do not 
206c0 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72  necessarily corr
206d0 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e  espond to column
206e0 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74  s in SELECT stat
206f0 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20  ement pParent,. 
20700 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65       ** zero the
20710 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65  m before transfe
20720 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ring the ORDER B
20730 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
20740 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20  **.      ** Not 
20750 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63  doing this may c
20760 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66  ause an error if
20770 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
20780 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
20790 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74   ** function att
207a0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
207b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d   a compound sub-
207c0 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65  query into pPare
207d0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65  nt.      ** (the
207e0 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63   only way this c
207f0 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20  an happen is if 
20800 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
20810 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20  -query is.      
20820 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72  ** currently par
20830 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29  t of pSub->pSrc)
20840 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31  . See ticket [d1
20850 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20  1a6e908f].  */. 
20860 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
20870 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
20880 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
20890 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
208a0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
208b0 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  {.        pOrder
208c0 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
208d0 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
208e0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
208f0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  rt( pParent->pOr
20900 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
20910 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
20920 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
20930 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
20940 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
20950 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
20960 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
20970 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
20980 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
20990 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30   pSub->pWhere, 0
209a0 29 3b 0a 20 20 20 20 69 66 28 20 73 75 62 71 75  );.    if( subqu
209b0 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
209c0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
209d0 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  t->pHaving==0 );
209e0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
209f0 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e  pHaving = pParen
20a00 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  t->pWhere;.     
20a10 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
20a20 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20   = pWhere;.     
20a30 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
20a40 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
20a50 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
20a60 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20  pHaving, .      
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20a90 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
20aa0 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29  Sub->pHaving, 0)
20ab0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20ac0 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
20ad0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
20ae0 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
20af0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
20b00 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  stDup(db, pSub->
20b10 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20  pGroupBy, 0);.  
20b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20b30 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
20b40 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
20b50 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
20b60 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  ere, pWhere);.  
20b70 20 20 7d 0a 20 20 20 20 73 75 62 73 74 53 65 6c    }.    substSel
20b80 65 63 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2c  ect(db, pParent,
20b90 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
20ba0 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 0a 20  pEList, 0);.  . 
20bb0 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
20bc0 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
20bd0 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
20be0 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
20bf0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
20c00 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
20c10 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
20c20 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
20c30 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
20c40 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
20c50 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
20c60 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
20c70 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
20c80 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
20c90 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
20ca0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
20cb0 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
20cc0 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
20cd0 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
20ce0 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
20cf0 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
20d00 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
20d10 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
20d20 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
20d30 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
20d40 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
20d50 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
20d60 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
20d70 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
20d80 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
20d90 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
20da0 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
20db0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
20dc0 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
20dd0 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
20de0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
20df0 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
20e00 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
20e10 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
20e20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
20e30 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
20e40 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
20e50 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
20e60 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  After flattening
20e70 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
20e80 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
20e90 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
20ea0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
20eb0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
20ec0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
20ed0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
20ee0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
20ef0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
20f00 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
20f10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
20f20 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
20f30 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
20f40 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63  EW)./*.** Make c
20f50 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e  opies of relevan
20f60 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  t WHERE clause t
20f70 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65  erms of the oute
20f80 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20  r query into.** 
20f90 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
20fa0 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45   of subquery.  E
20fb0 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
20fc0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
20fd0 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
20fe0 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29  -d AS y FROM t1)
20ff0 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
21000 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  =10;.**.** Trans
21010 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a  formed into:.**.
21020 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
21030 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
21040 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
21050 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41  M t1 WHERE a=5 A
21060 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20  ND c-d=10).**   
21070 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20    WHERE x=5 AND 
21080 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  y=10;.**.** The 
21090 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65  hope is that the
210a0 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20   terms added to 
210b0 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  the inner query 
210c0 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72  will make it mor
210d0 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a  e.** efficient..
210e0 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  **.** Do not att
210f0 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69  empt this optimi
21100 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  zation if:.**.**
21110 20 20 20 28 31 29 20 54 68 65 20 69 6e 6e 65 72     (1) The inner
21120 20 71 75 65 72 79 20 69 73 20 61 6e 20 61 67 67   query is an agg
21130 72 65 67 61 74 65 2e 20 20 28 49 6e 20 74 68 61  regate.  (In tha
21140 74 20 63 61 73 65 2c 20 77 65 27 64 20 72 65 61  t case, we'd rea
21150 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20  lly want.**     
21160 20 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 75    to copy the ou
21170 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ter WHERE-clause
21180 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
21190 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66  HAVING clause of
211a0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
211b0 6e 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ner query.  But 
211c0 74 68 65 79 20 70 72 6f 62 61 62 6c 79 20 77 6f  they probably wo
211d0 6e 27 74 20 68 65 6c 70 20 74 68 65 72 65 20 73  n't help there s
211e0 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e  o do not bother.
211f0 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68  ).**.**   (2) Th
21200 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
21210 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
21220 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20  art of a common 
21230 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
21240 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68  ..**.**   (3) Th
21250 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61  e inner query ha
21260 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
21270 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e   (since the chan
21280 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  ges to the WHERE
21290 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20  .**       close 
212a0 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  would change the
212b0 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
212c0 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  LIMIT)..**.**   
212d0 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (4) The inner qu
212e0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
212f0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
21300 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63  FT JOIN.  (The c
21310 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65  aller.**       e
21320 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72 65 73  nforces this res
21330 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74  triction since t
21340 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
21350 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68   not have enough
21360 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d  .**       inform
21370 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a  ation to know.).
21380 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20  **.**   (5) The 
21390 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
213a0 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
213b0 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  es in the ON or 
213c0 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
213d0 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
213e0 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  JOIN..**.** Retu
213f0 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67  rn 0 if no chang
21400 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20  es are made and 
21410 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20  non-zero if one 
21420 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c  or more WHERE cl
21430 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72  ause.** terms ar
21440 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74  e duplicated int
21450 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  o the subquery..
21460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75  */.static int pu
21470 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
21480 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
21490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
214a0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
214b0 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c 6f 63  tion (for malloc
214c0 28 29 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ()) */.  Select 
214d0 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f  *pSubq,        /
214e0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77  * The subquery w
214f0 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73  hose WHERE claus
21500 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65  e is to be augme
21510 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nted */.  Expr *
21520 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
21530 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
21540 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
21550 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
21560 69 43 75 72 73 6f 72 20 20 20 20 20 20 20 20 20  iCursor         
21570 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
21580 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  er of the subque
21590 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  ry */.){.  Expr 
215a0 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68  *pNew;.  int nCh
215b0 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57  ng = 0;.  if( pW
215c0 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  here==0 ) return
215d0 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62 71   0;.  if( (pSubq
215e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
215f0 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52 65  _Aggregate|SF_Re
21600 63 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b 0a  cursive))!=0 ){.
21610 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f       return 0; /
21620 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * restrictions (
21630 31 29 20 61 6e 64 20 28 32 29 20 2a 2f 0a 20 20  1) and (2) */.  
21640 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70  }.  if( pSubq->p
21650 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20  Limit!=0 ){.    
21660 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
21670 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f  striction (3) */
21680 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57  .  }.  while( pW
21690 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
216a0 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d   ){.    nChng +=
216b0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
216c0 72 6d 73 28 64 62 2c 20 70 53 75 62 71 2c 20 70  rms(db, pSubq, p
216d0 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20 69  Where->pRight, i
216e0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57 68  Cursor);.    pWh
216f0 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
21700 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45  eft;.  }.  if( E
21710 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
21720 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69  Where,EP_FromJoi
21730 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  n) ) return 0; /
21740 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 35 20  * restriction 5 
21750 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
21760 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
21770 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75 72  ant(pWhere, iCur
21780 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e  sor) ){.    nChn
21790 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g++;.    while( 
217a0 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20 70  pSubq ){.      p
217b0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
217c0 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c  rDup(db, pWhere,
217d0 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20   0);.      pNew 
217e0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
217f0 70 4e 65 77 2c 20 69 43 75 72 73 6f 72 2c 20 70  pNew, iCursor, p
21800 53 75 62 71 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  Subq->pEList);. 
21810 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65       pSubq->pWhe
21820 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
21830 41 6e 64 28 64 62 2c 20 70 53 75 62 71 2d 3e 70  And(db, pSubq->p
21840 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
21850 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75 62      pSubq = pSub
21860 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d  q->pPrior;.    }
21870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
21880 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  hng;.}.#endif /*
21890 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
218a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
218b0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
218c0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
218d0 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e  ../*.** Based on
218e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
218f0 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
21900 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
21910 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   by the first.**
21920 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20   argument, this 
21930 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
21940 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
21950 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
21960 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20      * the query 
21970 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20  contains just a 
21980 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65  single aggregate
21990 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20   function,.**   
219a0 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65   * the aggregate
219b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74   function is eit
219c0 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  her min() or max
219d0 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20  (), and.**    * 
219e0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
219f0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
21a00 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  nction is a colu
21a10 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  mn value..**.** 
21a20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
21a30 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68  ove are true, th
21a40 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  en WHERE_ORDERBY
21a50 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
21a60 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20  DERBY_MAX.** is 
21a70 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72  returned as appr
21a80 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a  opriate. Also, *
21a90 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
21aa0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
21ab0 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75  .** list of argu
21ac0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
21ad0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65  the aggregate be
21ae0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
21af0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
21b00 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
21b10 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a  e are not met, *
21b20 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
21b30 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52  to 0 and.** WHER
21b40 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
21b50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
21b60 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
21b70 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a  xQuery(AggInfo *
21b80 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69  pAggInfo, ExprLi
21b90 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
21ba0 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
21bb0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
21bc0 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  L;          /* R
21bd0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
21be0 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b    *ppMinMax = 0;
21bf0 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
21c00 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  >nFunc==1 ){.   
21c10 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
21c20 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
21c30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72  ].pExpr; /* Aggr
21c40 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
21c50 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
21c60 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
21c70 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  x.pList;      /*
21c80 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
21c90 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
21ca0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
21cb0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
21cc0 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  CTION );.    if(
21cd0 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
21ce0 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
21cf0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
21d00 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
21d10 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f  LUMN ){.      co
21d20 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20  nst char *zFunc 
21d30 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
21d40 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
21d50 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
21d60 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
21d70 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
21d80 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
21d90 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
21da0 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
21db0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
21dc0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
21dd0 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
21de0 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
21df0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
21e00 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  X;.        *ppMi
21e10 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
21e20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21e30 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
21e40 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70  inMax==0 || (*pp
21e50 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d  MinMax)->nExpr==
21e60 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  1 );.  return eR
21e70 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
21e80 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
21e90 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
21ea0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
21eb0 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
21ec0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
21ed0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
21ee0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
21ef0 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
21f00 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
21f10 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
21f20 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
21f30 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
21f40 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
21f50 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
21f60 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
21f70 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
21f80 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
21f90 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
21fa0 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
21fb0 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
21fc0 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
21fd0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
21fe0 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
21ff0 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
22000 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
22010 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
22020 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
22030 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
22040 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
22050 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
22060 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
22070 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
22080 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
22090 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
220a0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
220b0 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
220c0 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
220d0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
220e0 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
220f0 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
22100 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
22110 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
22120 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
22130 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
22140 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
22150 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
22160 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
22170 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
22180 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
22190 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
221a0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
221b0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
221c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
221d0 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
221e0 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
221f0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
22200 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
22210 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  .pFunc->funcFlag
22220 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  s&SQLITE_FUNC_CO
22230 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  UNT)==0 ) return
22240 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
22250 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e  >flags&EP_Distin
22260 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ct ) return 0;..
22270 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
22280 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ../*.** If the s
22290 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20  ource-list item 
222a0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
222b0 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e  ument was augmen
222c0 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49  ted with an.** I
222d0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
222e0 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f  , then try to lo
222f0 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69  cate the specifi
22300 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  ed index. If the
22310 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61  re.** was such a
22320 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
22330 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e  named index cann
22340 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  ot be found, ret
22350 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
22360 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61  RROR and leave a
22370 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
22380 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f  e. Otherwise, po
22390 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d  pulate .** pFrom
223a0 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74  ->pIndex and ret
223b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
223c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
223d0 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72  exedByLookup(Par
223e0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
223f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22400 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
22410 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46  From->pTab && pF
22420 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  rom->fg.isIndexe
22430 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  dBy ){.    Table
22440 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
22450 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a  pTab;.    char *
22460 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72  zIndexedBy = pFr
22470 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  om->u1.zIndexedB
22480 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  y;.    Index *pI
22490 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
224a0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a  =pTab->pIndex; .
224b0 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20          pIdx && 
224c0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
224d0 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64  Idx->zName, zInd
224e0 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20  exedBy); .      
224f0 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
22500 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
22510 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
22520 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
22530 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
22540 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
22550 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20  ndexedBy, 0);.  
22560 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
22570 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
22580 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22590 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
225a0 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65    pFrom->pIBInde
225b0 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20  x = pIdx;.  }.  
225c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
225d0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74  ;.}./*.** Detect
225e0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
225f0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
22600 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59   use an ORDER BY
22610 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a   clause with .**
22620 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
22630 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
22640 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ce..**.**    SEL
22650 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
22660 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
22670 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  . FROM t2 ORDER 
22680 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  BY .. COLLATE ..
22690 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ..**.** These ar
226a0 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
226b0 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a   subquery:.**.**
226c0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
226d0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  M (SELECT ... FR
226e0 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
226f0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29  ECT ... FROM t2)
22700 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59  .**     ORDER BY
22710 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e   ... COLLATE ...
22720 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
22730 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  sformation is ne
22740 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
22750 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  the multiSelectO
22760 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65  rderBy() routine
22770 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67  .** above that g
22780 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
22790 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  e for a compound
227a0 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20   SELECT with an 
227b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
227c0 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20  ** uses a merge 
227d0 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72  algorithm that r
227e0 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65  equires the same
227f0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
22800 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65  nce on the.** re
22810 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20  sult columns as 
22820 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  on the ORDER BY 
22830 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63  clause.  See tic
22840 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77  ket.** http://ww
22850 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
22860 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61  /info/6709574d2a
22870 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
22880 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e  sformation is on
22890 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58  ly needed for EX
228a0 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c  CEPT, INTERSECT,
228b0 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54   and UNION..** T
228c0 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
228d0 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65  rator works fine
228e0 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63   with multiSelec
228f0 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20  tOrderBy() even 
22900 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72  when.** there ar
22910 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20  e COLLATE terms 
22920 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  in the ORDER BY.
22930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
22940 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
22950 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57  lectToSubquery(W
22960 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
22970 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
22980 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  t i;.  Select *p
22990 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  New;.  Select *p
229a0 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  X;.  sqlite3 *db
229b0 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
229c0 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53  ist_item *a;.  S
229d0 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b  rcList *pNewSrc;
229e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
229f0 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b  ;.  Token dummy;
22a00 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ..  if( p->pPrio
22a10 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  r==0 ) return WR
22a20 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66  C_Continue;.  if
22a30 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
22a40 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
22a50 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58  ntinue;.  for(pX
22a60 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f  =p; pX && (pX->o
22a70 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d  p==TK_ALL || pX-
22a80 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b  >op==TK_SELECT);
22a90 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b   pX=pX->pPrior){
22aa0 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20  }.  if( pX==0 ) 
22ab0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
22ac0 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f  nue;.  a = p->pO
22ad0 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72  rderBy->a;.  for
22ae0 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  (i=p->pOrderBy->
22af0 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69  nExpr-1; i>=0; i
22b00 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69  --){.    if( a[i
22b10 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ].pExpr->flags &
22b20 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72   EP_Collate ) br
22b30 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eak;.  }.  if( i
22b40 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  <0 ) return WRC_
22b50 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20  Continue;..  /* 
22b60 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
22b70 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
22b80 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  ns the transform
22b90 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
22ba0 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  d. */..  pParse 
22bb0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
22bc0 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
22bd0 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
22be0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
22bf0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
22c00 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
22c10 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ew==0 ) return W
22c20 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73  RC_Abort;.  mems
22c30 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69  et(&dummy, 0, si
22c40 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20  zeof(dummy));.  
22c50 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65  pNewSrc = sqlite
22c60 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
22c70 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c  omTerm(pParse,0,
22c80 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c  0,0,&dummy,pNew,
22c90 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  0,0);.  if( pNew
22ca0 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
22cb0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e  WRC_Abort;.  *pN
22cc0 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53  ew = *p;.  p->pS
22cd0 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20  rc = pNewSrc;.  
22ce0 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  p->pEList = sqli
22cf0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
22d00 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c  d(pParse, 0, sql
22d10 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
22d20 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20  ASTERISK, 0));. 
22d30 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45   p->op = TK_SELE
22d40 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  CT;.  p->pWhere 
22d50 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  = 0;.  pNew->pGr
22d60 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65  oupBy = 0;.  pNe
22d70 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  w->pHaving = 0;.
22d80 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
22d90 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f   = 0;.  p->pPrio
22da0 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78  r = 0;.  p->pNex
22db0 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74  t = 0;.  p->pWit
22dc0 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46  h = 0;.  p->selF
22dd0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
22de0 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20  ound;.  assert( 
22df0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
22e00 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20  F_Converted)==0 
22e10 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  );.  p->selFlags
22e20 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64   |= SF_Converted
22e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
22e40 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20  ->pPrior!=0 );. 
22e50 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70   pNew->pPrior->p
22e60 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
22e70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  New->pLimit = 0;
22e80 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
22e90 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
22ea0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
22eb0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
22ec0 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63  ee if the FROM c
22ed0 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d  lause term pFrom
22ee0 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65   has table-value
22ef0 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  d function.** ar
22f00 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20  guments.  If it 
22f10 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  does, leave an e
22f20 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
22f30 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
22f40 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73  n.** non-zero, s
22f50 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f  ince pFrom is no
22f60 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  t allowed to be 
22f70 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  a table-valued f
22f80 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
22f90 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46  ic int cannotBeF
22fa0 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
22fb0 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
22fc0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
22fd0 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
22fe0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
22ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
23000 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25  rMsg(pParse, "'%
23010 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63  s' is not a func
23020 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e  tion", pFrom->zN
23030 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
23040 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
23050 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
23060 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
23070 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57  *.** Argument pW
23080 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62  ith (which may b
23090 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74  e NULL) points t
230a0 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  o a linked list 
230b0 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49  of nested .** WI
230c0 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f  TH contexts, fro
230d0 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72  m inner to outer
230e0 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62  most. If the tab
230f0 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
23100 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65   .** FROM clause
23110 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69   element pItem i
23120 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f  s really a commo
23130 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69  n-table-expressi
23140 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65  on (CTE) .** the
23150 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
23160 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65  er to the CTE de
23170 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61  finition for tha
23180 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69  t table. Otherwi
23190 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c  se.** return NUL
231a0 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  L..**.** If a no
231b0 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  n-NULL value is 
231c0 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70  returned, set *p
231d0 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e  pContext to poin
231e0 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a  t to the With.**
231f0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
23200 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65   returned CTE be
23210 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  longs to..*/.sta
23220 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
23230 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69  searchWith(.  Wi
23240 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23260 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f   Current innermo
23270 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a  st WITH clause *
23280 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
23290 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
232a0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
232b0 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65  se element to re
232c0 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20  solve */.  With 
232d0 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20  **ppContext     
232e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
232f0 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72  T: WITH clause r
23300 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f  eturn value belo
23310 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63  ngs to */.){.  c
23320 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
23330 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
23340 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28  Database==0 && (
23350 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  zName = pItem->z
23360 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
23370 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72  With *p;.    for
23380 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70  (p=pWith; p; p=p
23390 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20  ->pOuter){.     
233a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
233b0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
233c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
233d0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
233e0 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69  mp(zName, p->a[i
233f0 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
23400 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74           *ppCont
23410 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
23420 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b     return &p->a[
23430 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
23440 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23450 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
23460 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
23470 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61  ator maintains a
23480 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65   stack of active
23490 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a   WITH clauses.**
234a0 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d   with the inner-
234b0 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
234c0 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f   being at the to
234d0 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
234e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
234f0 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49  ne pushes the WI
23500 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64  TH clause passed
23510 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
23520 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20  rgument.** onto 
23530 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
23540 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e  tack. If argumen
23550 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c  t bFree is true,
23560 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49   then this.** WI
23570 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e  TH clause will n
23580 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66  ever be popped f
23590 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49  rom the stack. I
235a0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
235b0 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  * should be free
235c0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
235d0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49   Parse object. I
235e0 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77  n other cases, w
235f0 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c  hen.** bFree==0,
23600 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
23610 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
23620 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45  long with the SE
23630 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  LECT .** stateme
23640 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74  nt with which it
23650 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a   is associated..
23660 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
23670 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
23680 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
23690 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20  th, u8 bFree){. 
236a0 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d   assert( bFree==
236b0 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57  0 || (pParse->pW
236c0 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65  ith==0 && pParse
236d0 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30  ->pWithToFree==0
236e0 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68  ) );.  if( pWith
236f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23700 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70  pParse->pWith!=p
23710 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74  With );.    pWit
23720 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72  h->pOuter = pPar
23730 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
23740 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
23750 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46  With;.    if( bF
23760 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57  ree ) pParse->pW
23770 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74  ithToFree = pWit
23780 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h;.  }.}../*.** 
23790 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  This function ch
237a0 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74  ecks if argument
237b0 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f   pFrom refers to
237c0 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20   a CTE declared 
237d0 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c  by .** a WITH cl
237e0 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63  ause on the stac
237f0 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e  k currently main
23800 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61  tained by the pa
23810 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66  rser. And,.** if
23820 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
23830 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72  ssing a CTE expr
23840 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  ession, if it is
23850 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20   a recursive.** 
23860 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
23870 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a   current CTE..**
23880 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c  .** If pFrom fal
23890 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f  ls into either o
238a0 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f  f the two catego
238b0 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f  ries above, pFro
238c0 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f  m->pTab.** and o
238d0 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
238e0 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64  populated accord
238f0 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ingly. The calle
23900 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a  r should check.*
23910 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  * (pFrom->pTab!=
23920 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  0) to determine 
23930 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
23940 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63   successful matc
23950 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a  h.** was found..
23960 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
23970 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20   not a match is 
23980 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  found, SQLITE_OK
23990 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
239a0 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
239b0 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
239c0 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65  does occur, an e
239d0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
239e0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a  stored in the.**
239f0 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65   parser and some
23a00 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
23a10 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
23a20 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
23a30 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70  atic int withExp
23a40 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70  and(.  Walker *p
23a50 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63  Walker, .  struc
23a60 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
23a70 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65  pFrom.){.  Parse
23a80 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
23a90 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71  er->pParse;.  sq
23aa0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23ab0 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74  se->db;.  struct
23ac0 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20   Cte *pCte;     
23ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
23ae0 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c  ched CTE (or NUL
23af0 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a  L if no match) *
23b00 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b  /.  With *pWith;
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75      /* WITH clau
23b30 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c  se that pCte bel
23b40 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
23b50 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
23b60 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20  b==0 );..  pCte 
23b70 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61  = searchWith(pPa
23b80 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f  rse->pWith, pFro
23b90 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66  m, &pWith);.  if
23ba0 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61  ( pCte ){.    Ta
23bb0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45  ble *pTab;.    E
23bc0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
23bd0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65  .    Select *pSe
23be0 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  l;.    Select *p
23bf0 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
23c00 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73       /* Left-mos
23c10 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
23c20 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d  nt */.    int bM
23c30 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20  ayRecursive;    
23c40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
23c50 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e  if compound join
23c60 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c  ed by UNION [ALL
23c70 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70  ] */.    With *p
23c80 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20  SavedWith;      
23c90 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
23ca0 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73  l value of pPars
23cb0 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20  e->pWith */..   
23cc0 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74   /* If pCte->zCt
23cd0 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  eErr is non-NULL
23ce0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
23cf0 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20  then this is an 
23d00 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72  illegal.    ** r
23d10 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
23d20 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20  ce to CTE pCte. 
23d30 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  Leave an error i
23d40 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
23d50 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  urn.    ** early
23d60 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  . If pCte->zCteE
23d70 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  rr is NULL, then
23d80 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   this is not a r
23d90 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
23da0 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ce..    ** In th
23db0 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64  is case, proceed
23dc0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  .  */.    if( pC
23dd0 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20  te->zCteErr ){. 
23de0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23df0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74  rMsg(pParse, pCt
23e00 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65  e->zCteErr, pCte
23e10 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
23e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23e30 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
23e40 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  f( cannotBeFunct
23e50 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
23e60 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  m) ) return SQLI
23e70 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61  TE_ERROR;..    a
23e80 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
23e90 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
23ea0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
23eb0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
23ec0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
23ed0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
23ee0 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
23ef0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
23f00 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
23f10 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  ;.    pTab->zNam
23f20 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
23f30 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  Dup(db, pCte->zN
23f40 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ame);.    pTab->
23f50 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
23f60 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
23f70 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
23f80 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
23f90 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
23fa0 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
23fb0 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
23fc0 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  l | TF_NoVisible
23fd0 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d  Rowid;.    pFrom
23fe0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
23ff0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
24000 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20   pCte->pSelect, 
24010 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
24020 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
24030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
24040 45 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  EM;.    assert( 
24050 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
24060 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
24070 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
24080 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
24090 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
240a0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
240b0 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
240c0 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
240d0 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
240e0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
240f0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
24100 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
24110 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
24120 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
24130 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
24140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
24150 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
24160 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
24170 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
24180 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
24190 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
241a0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
241b0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
241c0 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
241d0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
241e0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
241f0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
24200 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
24210 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
24220 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
24230 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
24240 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  em->fg.isRecursi
24250 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ve = 1;.        
24260 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
24270 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
24280 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
24290 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
242a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
242b0 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
242c0 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
242d0 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
242e0 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
242f0 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b   pTab->nRef>2 ){
24300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
24310 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20  rorMsg(.        
24320 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69    pParse, "multi
24330 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
24340 6f 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  o recursive tabl
24350 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e  e: %s", pCte->zN
24360 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
24370 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24380 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
24390 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
243a0 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65  nRef==1 || ((pSe
243b0 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52  l->selFlags&SF_R
243c0 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61  ecursive) && pTa
243d0 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  b->nRef==2 ));..
243e0 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
243f0 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
24400 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
24410 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
24420 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
24430 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
24440 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c  = pWith;.    sql
24450 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
24460 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75  Walker, bMayRecu
24470 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50  rsive ? pSel->pP
24480 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 20 20  rior : pSel);.  
24490 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
244a0 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f  = pWith;..    fo
244b0 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c  r(pLeft=pSel; pL
244c0 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65  eft->pPrior; pLe
244d0 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  ft=pLeft->pPrior
244e0 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  );.    pEList = 
244f0 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  pLeft->pEList;. 
24500 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f     if( pCte->pCo
24510 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ls ){.      if( 
24520 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
24530 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70  ->nExpr!=pCte->p
24540 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  Cols->nExpr ){. 
24550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
24560 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24570 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20  table %s has %d 
24580 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
24590 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20  lumns",.        
245a0 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c      pCte->zName,
245b0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
245c0 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
245d0 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  pr.        );.  
245e0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
245f0 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
24600 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
24610 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
24620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c       }.      pEL
24630 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c  ist = pCte->pCol
24640 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  s;.    }..    sq
24650 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
24660 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
24670 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e   pEList, &pTab->
24680 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
24690 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  l);.    if( bMay
246a0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
246b0 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c     if( pSel->sel
246c0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
246d0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
246e0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
246f0 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
24700 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
24710 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
24720 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
24730 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72  zCteErr = "recur
24740 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
24750 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
24760 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
24770 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
24780 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
24790 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
247a0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e->zCteErr = 0;.
247b0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
247c0 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
247d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
247e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
247f0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
24800 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
24810 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
24820 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
24830 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
24840 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
24850 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
24860 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
24870 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
24880 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
24890 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
248a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
248b0 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
248c0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
248d0 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
248e0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
248f0 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
24900 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
24910 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
24920 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
24930 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
24940 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
24950 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
24960 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
24970 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
24980 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
24990 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
249a0 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a  pParse;.  With *
249b0 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
249c0 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
249d0 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20  .  if( pWith!=0 
249e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
249f0 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
24a00 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73  ith );.    pPars
24a10 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
24a20 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a  ->pOuter;.  }.}.
24a30 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65  #else.#define se
24a40 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65  lectPopWith 0.#e
24a50 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
24a60 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
24a70 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
24a80 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
24a90 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24aa0 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
24ab0 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
24ac0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
24ad0 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
24ae0 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
24af0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
24b00 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
24b10 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
24b20 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
24b30 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
24b40 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
24b50 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
24b60 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
24b70 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
24b80 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
24b90 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
24ba0 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
24bb0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
24bc0 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
24bd0 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
24be0 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
24bf0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
24c00 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
24c10 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
24c20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
24c30 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
24c40 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
24c50 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
24c60 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
24c70 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
24c80 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
24c90 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
24ca0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
24cb0 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
24cc0 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
24cd0 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69  ing up the persi
24ce0 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
24cf0 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
24d00 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
24d10 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
24d20 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
24d30 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
24d40 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  mmodate the NATU
24d50 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
24d60 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
24d70 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
24d80 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
24d90 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
24da0 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
24db0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
24dc0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
24dd0 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
24de0 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
24df0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
24e00 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
24e10 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
24e20 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
24e30 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
24e40 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
24e50 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
24e60 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
24e70 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
24e80 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
24e90 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
24ea0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
24eb0 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
24ec0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
24ed0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
24ee0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
24ef0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
24f00 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
24f10 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
24f20 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
24f30 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
24f40 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24f50 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
24f60 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
24f70 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
24f80 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
24f90 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
24fa0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20   p->selFlags;.. 
24fb0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
24fc0 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
24fd0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
24fe0 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
24ff0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25000 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  }.  if( NEVER(p-
25010 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65  >pSrc==0) || (se
25020 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
25030 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
25040 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
25050 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
25060 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
25070 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
25080 3b 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  ;.  if( pWalker-
25090 3e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  >xSelectCallback
250a0 32 3d 3d 73 65 6c 65 63 74 50 6f 70 57 69 74 68  2==selectPopWith
250b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   ){.    sqlite3W
250c0 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20  ithPush(pParse, 
250d0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
250e0 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d  ->pWith, 0);.  }
250f0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
25100 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
25110 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
25120 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
25130 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
25140 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
25150 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
25160 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
25170 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
25180 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
25190 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c  abList);..  /* L
251a0 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
251b0 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
251c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
251d0 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
251e0 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
251f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
25200 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
25210 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
25220 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
25230 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
25240 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
25250 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
25260 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
25270 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
25280 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
25290 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
252a0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
252b0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
252c0 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
252d0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65  ( pFrom->fg.isRe
252e0 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46  cursive==0 || pF
252f0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a  rom->pTab!=0 );.
25300 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66      if( pFrom->f
25310 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 20  g.isRecursive ) 
25320 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
25330 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
25340 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  b==0 );.#ifndef 
25350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
25360 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61      if( withExpa
25370 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  nd(pWalker, pFro
25380 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
25390 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70  Abort;.    if( p
253a0 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20  From->pTab ) {} 
253b0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
253c0 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
253d0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
253e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
253f0 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
25400 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
25410 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
25420 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
25430 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25440 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
25450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
25460 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
25470 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
25480 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ab==0 );.      i
25490 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  f( sqlite3WalkSe
254a0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
254b0 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  el) ) return WRC
254c0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46  _Abort;.      pF
254d0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
254e0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
254f0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
25500 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
25510 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
25520 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25530 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
25540 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61  f = 1;.      pTa
25550 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
25560 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
25570 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76  qlite_sq_%p", (v
25580 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20  oid*)pTab);.    
25590 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
255a0 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20  Prior ){ pSel = 
255b0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a  pSel->pPrior; }.
255c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
255d0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
255e0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
255f0 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f  EList,&pTab->nCo
25600 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  l,&pTab->aCol);.
25610 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
25620 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
25630 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
25640 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
25650 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
25660 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20  (1048576) );.   
25670 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
25680 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
25690 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  l;.#endif.    }e
256a0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
256b0 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
256c0 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
256d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
256e0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
256f0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
25700 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
25710 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
25720 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
25730 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
25740 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66  pFrom);.      if
25750 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
25760 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25770 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
25780 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef==0xffff ){.  
25790 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
257a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
257b0 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
257c0 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
257d0 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
257e0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
257f0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
25800 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
25810 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
25820 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
25830 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
25840 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56  ;.      if( !IsV
25850 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
25860 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
25870 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
25880 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
25890 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
258a0 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
258b0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
258c0 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
258d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
258e0 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
258f0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
25900 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53  Tab) || pTab->pS
25910 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
25920 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i16 nCol;.     
25930 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
25940 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
25950 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
25960 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25970 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
25980 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
25990 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
259a0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
259b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
259c0 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
259d0 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
259e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
259f0 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65  tName(pFrom->pSe
25a00 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lect, pTab->zNam
25a10 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  e);.        nCol
25a20 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
25a30 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
25a40 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  l = -1;.        
25a50 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
25a60 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
25a70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
25a80 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
25a90 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23   nCol;.      }.#
25aa0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
25ab0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
25ac0 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
25ad0 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
25ae0 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
25af0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
25b00 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
25b10 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
25b20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
25b30 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
25b40 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
25b50 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
25b60 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
25b70 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
25b80 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
25b90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
25ba0 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
25bb0 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
25bc0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
25bd0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
25be0 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
25bf0 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
25c00 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
25c10 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
25c20 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
25c30 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
25c40 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
25c50 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
25c60 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
25c70 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
25c80 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
25c90 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
25ca0 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
25cb0 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
25cc0 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
25cd0 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
25ce0 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
25cf0 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
25d00 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54  mn.  ** list.  T
25d10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
25d20 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
25d30 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45  cate the TK_ASTE
25d40 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73  RISK.  ** expres
25d50 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
25d60 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
25d70 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
25d80 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c  umns in.  ** all
25d90 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
25da0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
25db0 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
25dc0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
25dd0 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
25de0 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
25df0 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
25e00 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
25e10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
25e20 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45  ++){.    pE = pE
25e30 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
25e40 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
25e50 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
25e60 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
25e70 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
25e80 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
25e90 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
25ea0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
25eb0 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d   || (pE->pLeft!=
25ec0 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  0 && pE->pLeft->
25ed0 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20  op==TK_ID) );.  
25ee0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
25ef0 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
25f00 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52  ht->op==TK_ASTER
25f10 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ISK ) break;.  }
25f20 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
25f30 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
25f40 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
25f50 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
25f60 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
25f70 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
25f80 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
25f90 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
25fa0 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
25fb0 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
25fc0 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
25fd0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
25fe0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
25ff0 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
26000 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
26010 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
26020 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
26030 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
26040 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
26050 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
26060 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
26070 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
26080 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
26090 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
260a0 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
260b0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
260c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
260d0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
260e0 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
260f0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
26100 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20   k++){.      pE 
26110 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
26120 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d      pRight = pE-
26130 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  >pRight;.      a
26140 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
26150 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21  K_DOT || pRight!
26160 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
26170 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  pE->op!=TK_ASTER
26180 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28 70  ISK.       && (p
26190 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
261a0 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f   pRight->op!=TK_
261b0 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20 20  ASTERISK).      
261c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
261d0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
261e0 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
261f0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
26200 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
26210 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
26220 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
26230 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
26240 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
26250 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
26260 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
26270 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
26280 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
26290 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
262a0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
262b0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
262c0 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
262d0 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
262e0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
262f0 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
26300 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
26310 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
26320 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
26330 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
26340 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
26350 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
26360 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
26370 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
26380 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
26390 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
263a0 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
263b0 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
263c0 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
263d0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
263e0 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
263f0 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
26400 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
26410 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
26420 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
26430 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
26440 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
26450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
26460 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26470 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
26480 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
26490 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
264a0 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
264b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
264c0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
264d0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
264e0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
264f0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
26500 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
26510 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
26520 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
26530 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
26540 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
26550 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
26560 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
26570 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
26580 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
26590 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a  SchemaName = 0;.
265a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
265b0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
265c0 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
265d0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
265e0 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
265f0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
26600 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
26610 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
26620 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26630 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
26640 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
26650 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
26660 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
26670 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20      pSub = 0;.  
26680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
26690 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
266a0 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
266b0 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
266c0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
266d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
266e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
266f0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
26700 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
26710 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
26720 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
26730 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30  emaName = iDb>=0
26740 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
26750 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  zName : "*";.   
26760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26770 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
26780 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
26790 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
267a0 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
267b0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
267c0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
267d0 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
267e0 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
267f0 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
26800 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
26810 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
26820 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
26830 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
26840 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
26850 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
26860 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
26870 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
26880 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
26890 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
268a0 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
268b0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
268c0 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
268d0 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
268e0 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
268f0 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
26900 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
26910 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
26920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26930 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26940 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
26950 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
26960 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
26970 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69  as 'hidden', omi
26980 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78  t it from the ex
26990 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
269a0 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
269b0 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65   list unless the
269c0 20 53 45 4c 45 43 54 20 68 61 73 20 74 68 65 20   SELECT has the 
269d0 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
269e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
269f0 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20  bit set..       
26a00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26a10 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46      if( (p->selF
26a20 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64  lags & SF_Includ
26a30 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20  eHidden)==0.    
26a40 20 20 20 20 20 20 20 20 20 26 26 20 49 73 48 69           && IsHi
26a50 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
26a60 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20  ->aCol[j]) .    
26a70 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26a80 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
26a90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
26aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62  .            tab
26ab0 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20  leSeen = 1;..   
26ac0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
26ad0 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b   && zTName==0 ){
26ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26af0 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f  f( (pFrom->fg.jo
26b00 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
26b10 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RAL)!=0.        
26b20 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65          && table
26b30 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
26b40 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d  TabList, i, zNam
26b50 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20  e, 0, 0).       
26b60 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
26b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
26b80 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
26b90 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
26ba0 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bc0 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  ** table to the 
26bd0 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69  right of the joi
26be0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
26bf0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
26c20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
26c30 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e  dex(pFrom->pUsin
26c40 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c60 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
26c70 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
26c80 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
26c90 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
26ca0 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
26cb0 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
26cc0 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
26cd0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
26ce0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
26d00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26d10 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
26d20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
26d30 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
26d40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
26d50 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
26d60 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
26d70 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
26d80 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
26d90 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
26da0 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
26db0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
26dc0 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
26dd0 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
26de0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
26df0 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
26e00 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
26e10 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
26e20 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
26e30 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
26e40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26e50 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65   if( zSchemaName
26e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26e70 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
26e80 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
26e90 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b  D, zSchemaName);
26ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26eb0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
26ec0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
26ed0 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78  _DOT, pLeft, pEx
26ee0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
26ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26f00 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
26f10 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
26f20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
26f30 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
26f40 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
26f50 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  abName, zName);.
26f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f70 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61  zToFree = zColna
26f80 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
26f90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26fb0 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
26fc0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
26fd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
26fe0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
26ff0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
27000 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29  se, pNew, pExpr)
27010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43  ;.            sC
27020 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e  olname.z = zColn
27030 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
27040 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71   sColname.n = sq
27050 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
27060 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
27070 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27080 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
27090 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e  se, pNew, &sColn
270a0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
270b0 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
270c0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
270d0 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d  SF_NestedFrom)!=
270e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
270f0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
27100 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70  st_item *pX = &p
27110 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
27120 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  pr-1];.         
27130 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b       if( pSub ){
27140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27150 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
27160 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
27170 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61   pSub->pEList->a
27180 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [j].zSpan);.    
27190 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
271a0 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
271b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
271c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
271d0 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
271e0 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50  Span = sqlite3MP
271f0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
27200 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .%s",.          
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27230 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54   zSchemaName, zT
27240 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  abName, zColname
27250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
27260 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
27270 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
27280 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27290 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62             pX->b
272a0 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20  SpanIsTab = 1;. 
272b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
272c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
272d0 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72  DbFree(db, zToFr
272e0 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
272f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27300 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65     if( !tableSee
27310 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
27320 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20  f( zTName ){.   
27330 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27340 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
27350 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
27360 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20   %s", zTName);. 
27370 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27380 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27390 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
273a0 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73  se, "no tables s
273b0 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
273c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
273d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
273e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
273f0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45  istDelete(db, pE
27400 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
27410 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
27420 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
27430 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
27440 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c  pEList && p->pEL
27450 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  ist->nExpr>db->a
27460 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
27470 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
27480 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
27490 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
274a0 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
274b0 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20  esult set");.   
274c0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
274d0 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  t;.  }.#endif.  
274e0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
274f0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
27500 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
27510 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
27520 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
27530 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
27540 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
27550 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
27560 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
27570 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
27580 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
27590 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
275a0 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
275b0 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
275c0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
275d0 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
275e0 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
275f0 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
27600 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
27610 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
27620 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
27630 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
27640 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
27650 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
27660 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
27670 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
27680 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
27690 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
276a0 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
276b0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
276c0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
276d0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nue;.}../*.** Th
276e0 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61  is routine "expa
276f0 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74  nds" a SELECT st
27700 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20  atement and all 
27710 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65  of its subquerie
27720 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69  s..** For additi
27730 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
27740 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e   on what it mean
27750 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20  s to "expand" a 
27760 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
27770 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d  ent, see the com
27780 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65  ment on the sele
27790 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20  ctExpand worker 
277a0 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a  callback above..
277b0 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20  **.** Expanding 
277c0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
277d0 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
277e0 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69  step in processi
277f0 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  ng a.** SELECT s
27800 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53  tatement.  The S
27810 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
27820 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
27830 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20   before.** name 
27840 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65  resolution is pe
27850 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  rformed..**.** I
27860 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
27870 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  wrong, an error 
27880 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
27890 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a  en into pParse..
278a0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
278b0 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65  unction can dete
278c0 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62  ct the problem b
278d0 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61  y looking at pPa
278e0 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64  rse->nErr.** and
278f0 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  /or pParse->db->
27900 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f  mallocFailed..*/
27910 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
27920 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
27930 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
27940 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
27950 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
27960 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
27970 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
27980 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
27990 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
279a0 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
279b0 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50  pParse;.  if( pP
279c0 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e  arse->hasCompoun
279d0 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65  d ){.    w.xSele
279e0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e  ctCallback = con
279f0 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
27a00 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20  ctToSubquery;.  
27a10 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
27a20 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
27a30 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63  ;.  }.  w.xSelec
27a40 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
27a50 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 69 66  ctExpander;.  if
27a60 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  ( (pSelect->selF
27a70 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
27a80 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
27a90 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
27aa0 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69  k2 = selectPopWi
27ab0 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  th;.  }.  sqlite
27ac0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
27ad0 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
27ae0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27af0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
27b00 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
27b10 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
27b20 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
27b30 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
27b40 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
27b50 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
27b60 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
27b70 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
27b80 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
27b90 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
27ba0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
27bb0 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
27bc0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
27bd0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
27be0 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
27bf0 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
27c00 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
27c10 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
27c20 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
27c30 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
27c40 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
27c50 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
27c60 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
27c70 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
27c80 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
27c90 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
27ca0 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
27cb0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
27cc0 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
27cd0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
27ce0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
27cf0 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
27d00 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
27d10 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62  oid selectAddSub
27d20 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
27d30 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
27d40 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
27d50 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
27d60 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
27d70 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
27d80 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
27d90 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
27da0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
27db0 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
27dc0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
27dd0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
27de0 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20  ypeInfo)==0 );. 
27df0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
27e00 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
27e10 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
27e20 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 54  er->pParse;.  pT
27e30 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
27e40 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  ;.  for(i=0, pFr
27e50 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
27e60 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
27e70 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
27e80 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
27e90 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
27ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
27eb0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
27ec0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
27ed0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
27ee0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
27ef0 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
27f00 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
27f10 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
27f20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
27f30 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
27f40 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20  .      if( pSel 
27f50 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
27f60 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
27f70 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
27f80 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65  rior;.        se
27f90 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
27fa0 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
27fb0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
27fc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27fd0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
27fe0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
27ff0 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
28000 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
28010 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
28020 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
28030 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
28040 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
28050 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
28060 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
28070 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
28080 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
28090 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
280a0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
280b0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
280c0 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
280d0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
280e0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
280f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28100 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
28110 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
28120 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
28130 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  );.  w.xSelectCa
28140 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
28150 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
28160 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
28170 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
28180 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
28190 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
281a0 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
281b0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
281c0 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
281d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
281e0 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c  ne sets up a SEL
281f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
28200 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
28210 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
28220 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
28230 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
28240 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
28250 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
28260 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
28270 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
28280 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
28290 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
282a0 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
282b0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
282c0 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
282d0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
282e0 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
282f0 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
28300 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
28310 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
28320 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
28330 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
28340 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
28350 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
28360 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
28370 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
28380 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
28390 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
283a0 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
283b0 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
283c0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
283d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
283e0 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
283f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
28400 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
28410 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
28420 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
28430 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
28440 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
28450 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
28460 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
28470 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
28480 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
28490 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ner */.){.  sqli
284a0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e  te3 *db;.  if( N
284b0 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
284c0 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  urn;.  db = pPar
284d0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
284e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
284f0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
28500 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
28510 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
28520 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
28530 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72  electExpand(pPar
28540 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50  se, p);.  if( pP
28550 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
28560 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
28570 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
28580 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
28590 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ames(pParse, p, 
285a0 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28  pOuterNC);.  if(
285b0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
285c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
285d0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
285e0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
285f0 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  peInfo(pParse, p
28600 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  );.}../*.** Rese
28610 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
28620 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
28630 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
28640 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
28650 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
28660 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
28670 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
28680 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
28690 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
286a0 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
286b0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
286c0 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f  es code that sto
286d0 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c  res NULLs in all
286e0 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79   of those memory
286f0 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  .** cells..*/.st
28700 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
28710 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
28720 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
28730 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
28740 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
28750 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
28760 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
28770 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
28780 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67    int nReg = pAg
28790 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70  gInfo->nFunc + p
287a0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
287b0 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20  ;.  if( nReg==0 
287c0 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66  ) return;.#ifdef
287d0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
287e0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  /* Verify that a
287f0 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73  ll AggInfo regis
28800 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e 20  ters are within 
28810 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69 66  the range specif
28820 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49  ied by.  ** AggI
28830 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e  nfo.mnReg..AggIn
28840 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73  fo.mxReg */.  as
28850 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67  sert( nReg==pAgg
28860 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67  Info->mxReg-pAgg
28870 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b  Info->mnReg+1 );
28880 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
28890 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
288a0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
288b0 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  t( pAggInfo->aCo
288c0 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  l[i].iMem>=pAggI
288d0 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
288e0 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
288f0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70  >aCol[i].iMem<=p
28900 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29  AggInfo->mxReg )
28910 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
28920 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
28930 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  nc; i++){.    as
28940 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
28950 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  aFunc[i].iMem>=p
28960 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
28970 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
28980 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
28990 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
289a0 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Reg );.  }.#endi
289b0 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  f.  sqlite3VdbeA
289c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
289d0 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d  , 0, pAggInfo->m
289e0 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  nReg, pAggInfo->
289f0 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46  mxReg);.  for(pF
28a00 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
28a10 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
28a20 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
28a30 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
28a40 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
28a50 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
28a60 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
28a70 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
28a80 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
28a90 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
28aa0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
28ab0 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
28ac0 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
28ad0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
28ae0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28af0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
28b00 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
28b10 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
28b20 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
28b30 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
28b40 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
28b50 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
28b60 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
28b70 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
28b80 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
28b90 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
28ba0 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
28bb0 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a  x.pList, 0, 0);.
28bc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28bd0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
28be0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
28bf0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
28c00 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
28c30 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
28c40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
28c60 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
28c70 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
28c80 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
28c90 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
28ca0 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
28cb0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
28cc0 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
28cd0 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
28ce0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
28cf0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
28d00 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
28d10 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
28d20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
28d30 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
28d40 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
28d50 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
28d60 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
28d70 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
28d80 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
28d90 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
28da0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
28db0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
28dc0 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
28dd0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
28de0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28df0 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  4(v, OP_AggFinal
28e00 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73  , pF->iMem, pLis
28e10 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
28e20 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20   : 0, 0,.       
28e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
28e40 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
28e50 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
28e60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
28e70 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
28e80 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  r memory cells f
28e90 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  or an aggregate 
28ea0 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
28eb0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
28ec0 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
28ed0 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63  ic void updateAc
28ee0 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
28ef0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
28f00 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
28f10 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
28f20 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
28f30 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20  .  int regHit = 
28f40 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74  0;.  int addrHit
28f50 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  Test = 0;.  stru
28f60 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
28f70 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
28f80 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
28f90 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
28fa0 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
28fb0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
28fc0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
28fd0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
28fe0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
28ff0 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
29000 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
29010 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
29020 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
29030 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
29040 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
29050 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
29060 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
29070 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
29080 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
29090 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
290a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
290b0 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
290c0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
290d0 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
290e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
290f0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
29100 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
29110 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43  gg, 0, SQLITE_EC
29120 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c  EL_DUP);.    }el
29130 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  se{.      nArg =
29140 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67   0;.      regAgg
29150 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
29160 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  if( pF->iDistinc
29170 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  t>=0 ){.      ad
29180 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
29190 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
291a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
291b0 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a  ( nArg==0 );  /*
291c0 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   Error condition
291d0 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
291e0 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20  se( nArg>1 );   
291f0 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72  /* Also an error
29200 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69   */.      codeDi
29210 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
29220 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
29230 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67  drNext, 1, regAg
29240 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  g);.    }.    if
29250 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  ( pF->pFunc->fun
29260 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
29270 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
29280 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
29290 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
292a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
292b0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
292c0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
292d0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
292e0 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
292f0 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68  0 if pF->pFunc h
29300 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20  as NEEDCOLL */. 
29310 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
29320 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
29330 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
29340 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
29350 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
29360 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
29370 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
29380 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
29390 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
293a0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
293b0 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
293c0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
293d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
293e0 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49  gHit==0 && pAggI
293f0 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
29400 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70  r ) regHit = ++p
29410 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
29420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29430 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
29440 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30  eq, regHit, 0, 0
29450 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
29460 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
29470 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
29480 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
29490 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67  AggStep0, 0, reg
294a0 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20  Agg, pF->iMem,. 
294b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294c0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
294d0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
294e0 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
294f0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
29500 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
29510 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
29520 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
29530 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
29540 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
29550 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
29560 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
29570 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
29580 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
29590 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
295a0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
295b0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
295c0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
295d0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
295e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
295f0 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
29600 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
29610 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
29620 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
29630 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
29640 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
29650 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
29660 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
29670 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
29680 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
29690 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
296a0 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
296b0 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
296c0 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
296d0 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
296e0 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
296f0 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
29700 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
29710 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
29720 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
29730 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
29740 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
29750 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
29760 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
29770 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
29780 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
29790 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
297a0 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
297b0 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
297c0 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
297d0 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
297e0 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
297f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
29800 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
29810 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
29820 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
29830 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
29840 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
29850 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
29860 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
29870 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
29880 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
29890 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
298a0 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
298b0 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
298c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
298d0 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
298e0 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
298f0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
29900 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
29910 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
29920 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
29930 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
29940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
29950 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
29960 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
29970 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
29980 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
29990 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
299a0 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
299b0 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
299c0 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
299d0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
299e0 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
299f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29a00 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
29a10 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
29a20 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
29a30 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
29a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29a50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
29a60 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
29a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a80 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
29a90 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
29aa0 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ac0 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
29ad0 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
29ae0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
29af0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
29b00 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
29b10 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
29b20 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
29b30 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
29b40 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
29b50 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ));.    char *zE
29b60 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
29b70 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
29b80 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
29b90 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
29ba0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
29bb0 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
29bc0 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
29bd0 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
29be0 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
29bf0 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
29c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
29c10 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
29c20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
29c30 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
29c40 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
29c50 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
29c60 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
29c70 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
29c80 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
29c90 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
29ca0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
29cb0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
29cc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29cd0 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
29ce0 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
29cf0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
29d00 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f  re returned acco
29d10 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c  rding to the Sel
29d20 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
29d30 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
29d40 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ts in sqliteInt.
29d50 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e  h for further in
29d60 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
29d70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
29d80 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
29d90 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
29da0 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
29db0 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
29dc0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
29dd0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
29de0 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
29df0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
29e00 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
29e10 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
29e20 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
29e30 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
29e40 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
29e50 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
29e60 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
29e70 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
29e80 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
29e90 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
29ea0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
29eb0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29ed0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
29ee0 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
29ef0 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
29f00 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
29f10 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
29f20 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
29f30 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
29f40 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
29f50 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
29f60 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
29f70 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
29f80 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
29f90 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
29fa0 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29fc0 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
29fd0 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
29fe0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
29ff0 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
2a000 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2a010 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
2a020 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
2a030 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
2a040 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74  st = 0;  /* List
2a050 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
2a060 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
2a070 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
2a080 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2a090 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
2a0a0 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
2a0b0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
2a0c0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
2a0d0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
2a0e0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
2a0f0 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
2a100 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
2a110 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2a120 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
2a130 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
2a140 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
2a150 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
2a160 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LL */.  int rc =
2a170 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
2a180 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
2a190 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
2a1a0 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e  tion */.  Distin
2a1b0 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b  ctCtx sDistinct;
2a1c0 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
2a1d0 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54  to code the DIST
2a1e0 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  INCT keyword */.
2a1f0 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b    SortCtx sSort;
2a200 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
2a210 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
2a220 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2a230 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  use */.  AggInfo
2a240 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
2a250 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
2a260 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
2a270 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
2a280 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
2a290 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2a2a0 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
2a2b0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
2a2c0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
2a2d0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2a2e0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2a2f0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2a300 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
2a310 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c   int iRestoreSel
2a320 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
2a330 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61  iSelectId;.  pPa
2a340 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d  rse->iSelectId =
2a350 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
2a360 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  lectId++;.#endif
2a370 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
2a380 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
2a390 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2a3a0 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
2a3b0 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
2a3c0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
2a3d0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
2a3e0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
2a3f0 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
2a400 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
2a410 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
2a420 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
2a430 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  fo));.#if SELECT
2a440 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2a450 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
2a460 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43  ndent++;.  SELEC
2a470 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
2a480 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65  p, ("begin proce
2a490 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69  ssing:\n"));.  i
2a4a0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2a4b0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2a4c0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2a4d0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2a4e0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2a4f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2a500 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2a510 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2a520 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
2a530 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2a540 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2a550 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
2a560 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2a570 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2a580 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2a590 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
2a5a0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
2a5b0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
2a5c0 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
2a5d0 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
2a5e0 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
2a5f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
2a600 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a610 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
2a620 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
2a630 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
2a640 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2a650 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
2a660 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a670 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
2a680 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
2a690 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
2a6a0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2a6b0 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
2a6c0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2a6d0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2a6e0 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
2a6f0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
2a700 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
2a710 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
2a720 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
2a730 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
2a740 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
2a750 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
2a760 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
2a770 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
2a780 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2a790 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
2a7a0 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
2a7b0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
2a7c0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
2a7d0 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
2a7e0 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
2a7f0 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
2a800 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
2a810 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
2a820 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
2a830 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
2a840 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  By;.  pTabList =
2a850 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
2a860 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2a870 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2a880 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
2a890 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61  ect_end;.  }.  a
2a8a0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
2a8b0 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d  !=0 );.  isAgg =
2a8c0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2a8d0 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
2a8e0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2a8f0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2a900 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2a910 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2a920 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2a930 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  100,pParse,p, ("
2a940 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
2a950 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ution:\n"));.   
2a960 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2a970 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2a980 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20  .  }.#endif...  
2a990 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
2a9a0 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
2a9b0 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
2a9c0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
2a9d0 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
2a9e0 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  put..  */.#ifnde
2a9f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
2aa00 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65  BQUERY.  if( che
2aa10 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
2aa20 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  SelectError(pPar
2aa30 73 65 2c 20 70 44 65 73 74 2c 20 70 2d 3e 70 45  se, pDest, p->pE
2aa40 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
2aa50 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2aa60 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
2aa70 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c 61  .  /* Try to fla
2aa80 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
2aa90 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2aaa0 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d  se up into the m
2aab0 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23  ain query.  */.#
2aac0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2aad0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2aae0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
2aaf0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
2ab00 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
2ab10 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
2ab20 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
2ab30 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2ab40 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
2ab50 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
2ab60 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ];.    Select *p
2ab70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
2ab80 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  lect;.    int is
2ab90 41 67 67 53 75 62 3b 0a 20 20 20 20 54 61 62 6c  AggSub;.    Tabl
2aba0 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
2abb0 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
2abc0 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
2abd0 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68  e;..    /* Catch
2abe0 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65   mismatch in the
2abf0 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e   declared column
2ac00 73 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20  s of a view and 
2ac10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
2ac20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
2ac30 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68  the SELECT on th
2ac40 65 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28  e RHS */.    if(
2ac50 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75   pTab->nCol!=pSu
2ac60 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
2ac70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ac80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2ac90 2c 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63  , "expected %d c
2aca0 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20  olumns for '%s' 
2acb0 62 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20  but got %d",.   
2acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acd0 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70     pTab->nCol, p
2ace0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62  Tab->zName, pSub
2acf0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
2ad00 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  ;.      goto sel
2ad10 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
2ad20 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
2ad30 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2ad40 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
2ad50 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
2ad60 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
2ad70 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
2ad80 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
2ad90 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75     /* This subqu
2ada0 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72  ery can be absor
2adb0 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72  bed into its par
2adc0 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ent. */.      if
2add0 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
2ade0 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b        isAgg = 1;
2adf0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
2ae00 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
2ae10 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gate;.      }.  
2ae20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
2ae30 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
2ae40 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
2ae50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2ae60 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
2ae70 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49  _end;.    if( !I
2ae80 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
2ae90 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
2aea0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2aeb0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
2aec0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2aed0 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
2aee0 65 72 20 74 68 65 20 56 44 42 45 20 75 6e 64 65  er the VDBE unde
2aef0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20  r construction, 
2af00 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
2af10 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a   VDBE if one.  *
2af20 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  * does not alrea
2af30 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20  dy exist */.  v 
2af40 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
2af50 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
2af60 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
2af70 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e 64 65 66  ct_end;..#ifndef
2af80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
2af90 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
2afa0 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e  * Handle compoun
2afb0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
2afc0 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20 73 65  nts using the se
2afd0 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65  parate multiSele
2afe0 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64  ct().  ** proced
2aff0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ure..  */.  if( 
2b000 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
2b010 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
2b020 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
2b030 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  st);.    explain
2b040 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
2b050 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
2b060 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
2b070 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2b080 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c  _ENABLED.    SEL
2b090 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
2b0a0 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75  e,p,("end compou
2b0b0 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73  nd-select proces
2b0c0 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70  sing\n"));.    p
2b0d0 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
2b0e0 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20  dent--;.#endif. 
2b0f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b100 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
2b110 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2b120 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
2b130 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2b140 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  use.  */.#if !de
2b150 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2b160 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
2b170 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2b180 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28  MIT_VIEW).  for(
2b190 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
2b1a0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2b1b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2b1c0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
2b1d0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
2b1e0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
2b1f0 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
2b200 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
2b210 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70  elect;.    if( p
2b220 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
2b230 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74  e;..    /* Somet
2b240 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  imes the code fo
2b250 72 20 61 20 73 75 62 71 75 65 72 79 20 77 69 6c  r a subquery wil
2b260 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d  l be generated m
2b270 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ore than.    ** 
2b280 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75 62  once, if the sub
2b290 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66  query is part of
2b2a0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2b2b0 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e in a LEFT JOIN
2b2c0 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61  ,.    ** for exa
2b2d0 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63  mple.  In that c
2b2e0 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65  ase, do not rege
2b2f0 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
2b300 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20  to manifest.    
2b310 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68 65  ** a view or the
2b320 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69   co-routine to i
2b330 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e  mplement a view.
2b340 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 73 74    The first inst
2b350 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  ance.    ** is s
2b360 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67  ufficient, thoug
2b370 68 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  h the subroutine
2b380 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65   to manifest the
2b390 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a   view does need.
2b3a0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76      ** to be inv
2b3b0 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  oked again. */. 
2b3c0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64     if( pItem->ad
2b3d0 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20  drFillSub ){.   
2b3e0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2b3f0 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30  .viaCoroutine==0
2b400 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2b410 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2b420 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
2b430 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
2b440 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
2b450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b460 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2b470 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
2b480 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
2b490 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
2b4a0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
2b4b0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
2b4c0 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
2b4d0 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
2b4e0 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
2b4f0 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
2b500 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
2b510 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
2b520 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
2b530 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
2b540 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
2b550 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
2b560 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
2b570 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
2b580 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
2b590 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
2b5a0 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
2b5b0 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
2b5c0 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
2b5d0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
2b5e0 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
2b5f0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2b600 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
2b610 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63  Make copies of c
2b620 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c  onstant WHERE-cl
2b630 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68  ause terms in th
2b640 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
2b650 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65  wn.    ** inside
2b660 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
2b670 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68  This can help th
2b680 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75  e subquery to ru
2b690 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  n more efficient
2b6a0 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2b6b0 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  f( (pItem->fg.jo
2b6c0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
2b6d0 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 75  R)==0.     && pu
2b6e0 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
2b6f0 28 64 62 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57  (db, pSub, p->pW
2b700 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
2b710 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23 69 66  rsor).    ){.#if
2b720 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2b730 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20 73  BLED.      if( s
2b740 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2b750 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2b760 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
2b770 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2b780 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c  ("After WHERE-cl
2b790 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c  ause push-down:\
2b7a0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n"));.        sq
2b7b0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2b7c0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2b7d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2b7e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
2b7f0 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  ate code to impl
2b800 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65  ement the subque
2b810 72 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ry.    */.    if
2b820 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
2b830 3d 3d 31 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  ==1.     && (p->
2b840 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 6c  selFlags & SF_Al
2b850 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70  l)==0.     && Op
2b860 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2b870 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62  d(db, SQLITE_Sub
2b880 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20  qCoroutine).    
2b890 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c  ){.      /* Impl
2b8a0 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69  ement a co-routi
2b8b0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74  ne that will ret
2b8c0 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
2b8d0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
2b8e0 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
2b8f0 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
2b900 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2b910 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  nt addrTop = sql
2b920 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2b930 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 20  ddr(v)+1;.      
2b940 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2b950 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2b960 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
2b970 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2b980 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
2b990 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2b9a0 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
2b9b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2b9c0 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  ((v, "%s", pItem
2b9d0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2b9e0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
2b9f0 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72  drFillSub = addr
2ba00 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Top;.      sqlit
2ba10 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
2ba20 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
2ba30 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
2ba40 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2ba50 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2ba60 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
2ba70 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
2ba80 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
2ba90 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2baa0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
2bab0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
2bac0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
2bad0 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65  wLogEst = sqlite
2bae0 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e 53  3LogEst(pSub->nS
2baf0 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
2bb00 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
2bb10 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20  routine = 1;.   
2bb20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73     pItem->regRes
2bb30 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  ult = dest.iSdst
2bb40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2bb50 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2bb60 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  EndCoroutine, pI
2bb70 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2bb80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2bb90 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2bba0 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  drTop-1);.      
2bbb0 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2bbc0 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
2bbd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2bbe0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
2bbf0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2bc00 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70   will fill an ep
2bc10 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2bc20 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  th.      ** the 
2bc30 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
2bc40 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d  subquery.  pItem
2bc50 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69  ->addrFillSub wi
2bc60 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a  ll point.      *
2bc70 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73  * to the address
2bc80 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
2bc90 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70  d subroutine.  p
2bca0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a  Item->regReturn.
2bcb0 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65        ** is a re
2bcc0 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64  gister allocated
2bcd0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62   to hold the sub
2bce0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
2bcf0 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a  ddress.      */.
2bd00 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64        int topAdd
2bd10 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  r;.      int onc
2bd20 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  eAddr = 0;.     
2bd30 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20   int retAddr;.  
2bd40 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
2bd50 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
2bd60 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
2bd70 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
2bd80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2bd90 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
2bda0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2bdb0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2bdc0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2bdd0 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
2bde0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
2bdf0 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
2be00 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
2be10 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
2be20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2be30 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
2be40 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
2be50 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
2be60 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
2be70 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
2be80 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
2be90 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
2bea0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
2beb0 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
2bec0 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
2bed0 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
2bee0 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
2bef0 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
2bf00 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
2bf10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2bf20 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22   "materialize \"
2bf30 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54  %s\"", pItem->pT
2bf40 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
2bf50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bf60 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
2bf70 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
2bf80 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
2bf90 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2bfa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bfb0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
2bfc0 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
2bfd0 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
2bfe0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2bff0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2c000 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
2c010 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
2c020 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
2c030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2c040 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
2c050 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
2c060 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
2c070 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69  RowLogEst = sqli
2c080 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e  te3LogEst(pSub->
2c090 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
2c0a0 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20     if( onceAddr 
2c0b0 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
2c0c0 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64  pHere(v, onceAdd
2c0d0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64  r);.      retAdd
2c0e0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2c0f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2c100 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  rn, pItem->regRe
2c110 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  turn);.      Vdb
2c120 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
2c130 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54  d %s", pItem->pT
2c140 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
2c150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2c160 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64  angeP1(v, topAdd
2c170 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20  r, retAddr);.   
2c180 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
2c190 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
2c1a0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  se);.    }.    i
2c1b0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2c1c0 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
2c1d0 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73  t_end;.    pPars
2c1e0 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
2c1f0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2c200 65 69 67 68 74 28 70 29 3b 0a 20 20 7d 0a 23 65  eight(p);.  }.#e
2c210 6e 64 69 66 0a 0a 20 20 2f 2a 20 56 61 72 69 6f  ndif..  /* Vario
2c220 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  us elements of t
2c230 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64  he SELECT copied
2c240 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69   into local vari
2c250 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63  ables for.  ** c
2c260 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20  onvenience */.  
2c270 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
2c280 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  st;.  pWhere = p
2c290 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
2c2a0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
2c2b0 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
2c2c0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
2c2d0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
2c2e0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2c2f0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
2c300 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
2c310 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2c320 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2c330 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
2c340 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2c350 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
2c360 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  fter all FROM-cl
2c370 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  ause analysis:\n
2c380 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
2c390 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2c3a0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2c3b0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
2c3c0 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e   query is DISTIN
2c3d0 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
2c3e0 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61   BY but is not a
2c3f0 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64  n aggregate, and
2c400 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65   .  ** if the se
2c410 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65  lect-list is the
2c420 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44   same as the ORD
2c430 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e  ER BY list, then
2c440 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a   this query.  **
2c450 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
2c460 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e  n as a GROUP BY.
2c470 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2c480 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
2c490 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54       SELECT DIST
2c4a0 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  INCT xyz FROM ..
2c4b0 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  . ORDER BY xyz. 
2c4c0 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e   **.  ** is tran
2c4d0 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a  sformed to:.  **
2c4e0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
2c4f0 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52   xyz FROM ... GR
2c500 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52  OUP BY xyz ORDER
2c510 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
2c520 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
2c530 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61  m is preferred a
2c540 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  s a single index
2c550 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29   (or temp-table)
2c560 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73   may be .  ** us
2c570 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ed for both the 
2c580 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53  ORDER BY and DIS
2c590 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67  TINCT processing
2c5a0 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20  . As originally 
2c5b0 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68  .  ** written th
2c5c0 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65  e query must use
2c5d0 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f   a temp-table fo
2c5e0 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  r at least one o
2c5f0 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a  f the ORDER .  *
2c600 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  * BY and DISTINC
2c610 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  T, and an index 
2c620 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70  or separate temp
2c630 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f  -table for the o
2c640 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
2c650 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2c660 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
2c670 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
2c680 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20  Distinct .   && 
2c690 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2c6a0 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72  ompare(sSort.pOr
2c6b0 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d  derBy, pEList, -
2c6c0 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  1)==0.  ){.    p
2c6d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2c6e0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
2c6f0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
2c700 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
2c710 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
2c720 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  pEList, 0);.    
2c730 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
2c740 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
2c750 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
2c760 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
2c770 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
2c780 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
2c790 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
2c7a0 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
2c7b0 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
2c7c0 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
2c7d0 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
2c7e0 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
2c7f0 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
2c800 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
2c810 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
2c820 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20  inct.isTnct );. 
2c830 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2c840 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
2c850 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72   clause, then cr
2c860 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
2c870 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20  l index to.  ** 
2c880 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20  do the sorting. 
2c890 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e   But this sortin
2c8a0 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  g ephemeral inde
2c8b0 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20  x might end up. 
2c8c0 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64   ** being unused
2c8d0 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
2c8e0 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e   be extracted in
2c8f0 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
2c900 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20  r..  ** If that 
2c910 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
2c920 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  n the OP_OpenEph
2c930 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
2c940 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
2c950 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
2c960 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69  _Noop once we fi
2c970 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
2c980 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
2c990 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64  is.  ** not need
2c9a0 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61  ed.  The sSort.a
2c9b0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72  ddrSortIndex var
2c9c0 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2c9d0 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a   facilitate.  **
2c9e0 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
2c9f0 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
2ca00 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
2ca10 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2ca20 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
2ca30 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
2ca40 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f  List(pParse, sSo
2ca50 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
2ca60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
2ca70 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
2ca80 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
2ca90 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
2caa0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
2cab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cac0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2cad0 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
2cae0 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75        sSort.iECu
2caf0 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64  rsor, sSort.pOrd
2cb00 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45  erBy->nExpr+1+pE
2cb10 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a  List->nExpr, 0,.
2cb20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2cb30 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2cb40 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20  YINFO.      );. 
2cb50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72   }else{.    sSor
2cb60 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
2cb70 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
2cb80 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
2cb90 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
2cba0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
2cbb0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
2cbc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
2cbd0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
2cbe0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
2cbf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2cc00 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2cc10 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
2cc20 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
2cc30 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
2cc40 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
2cc50 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
2cc60 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2cc70 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
2cc80 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53  lectRow = LARGES
2cc90 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75  T_INT64;.  compu
2cca0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
2ccb0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
2ccc0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
2ccd0 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61  it==0 && sSort.a
2cce0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
2ccf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2cd00 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76  beChangeOpcode(v
2cd10 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
2cd20 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72  Index, OP_Sorter
2cd30 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74  Open);.    sSort
2cd40 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f  .sortFlags |= SO
2cd50 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
2cd60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2cd70 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2cd80 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
2cd90 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
2cda0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
2cdb0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
2cdc0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69  tinct ){.    sDi
2cdd0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d  stinct.tabTnct =
2cde0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2cdf0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61  .    sDistinct.a
2ce00 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65  ddrTnct = sqlite
2ce10 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2ce20 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2ce30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44                sD
2ce50 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c  istinct.tabTnct,
2ce60 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce80 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e      (char*)keyIn
2ce90 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2cea0 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
2ceb0 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20  ,0,0),.         
2cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ced0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
2cee0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2cef0 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
2cf00 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
2cf10 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
2cf20 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
2cf30 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
2cf40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2cf50 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2cf60 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
2cf70 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  NCT_NOOP;.  }.. 
2cf80 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
2cf90 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
2cfa0 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74    /* No aggregat
2cfb0 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
2cfc0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
2cfd0 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63  se */.    u16 wc
2cfe0 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73  trlFlags = (sDis
2cff0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57  tinct.isTnct ? W
2d000 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
2d010 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  CT : 0);..    /*
2d020 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
2d030 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ase scan. */.   
2d040 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
2d050 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
2d060 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
2d070 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  here, sSort.pOrd
2d080 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
2d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0a0 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20       p->pEList, 
2d0b0 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b 0a  wctrlFlags, 0);.
2d0c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
2d0d0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
2d0e0 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  end;.    if( sql
2d0f0 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
2d100 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20  owCount(pWInfo) 
2d110 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  < p->nSelectRow 
2d120 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  ){.      p->nSel
2d130 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
2d140 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
2d150 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  unt(pWInfo);.   
2d160 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74   }.    if( sDist
2d170 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73  inct.isTnct && s
2d180 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
2d190 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b  tinct(pWInfo) ){
2d1a0 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74  .      sDistinct
2d1b0 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c  .eTnctType = sql
2d1c0 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
2d1d0 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  nct(pWInfo);.   
2d1e0 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74   }.    if( sSort
2d1f0 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2d200 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20     sSort.nOBSat 
2d210 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2d220 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b  Ordered(pWInfo);
2d230 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72 74  .      if( sSort
2d240 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70  .nOBSat==sSort.p
2d250 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
2d260 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e  {.        sSort.
2d270 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2d280 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2d290 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
2d2a0 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
2d2b0 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
2d2c0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2d2d0 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  l .    ** instru
2d2e0 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e  ction ended up n
2d2f0 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c  ot being needed,
2d300 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
2d310 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2d320 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
2d330 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
2d340 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61  .    if( sSort.a
2d350 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
2d360 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  && sSort.pOrderB
2d370 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
2d380 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
2d390 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61  oNoop(v, sSort.a
2d3a0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
2d3b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
2d3c0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
2d3d0 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20  ner loop. */.   
2d3e0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2d3f0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
2d400 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20  st, -1, &sSort, 
2d410 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
2d420 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2d430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2d440 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c  ereContinueLabel
2d450 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  (pWInfo),.      
2d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2d470 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
2d480 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a  abel(pWInfo));..
2d490 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
2d4a0 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
2d4b0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
2d4c0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2d4d0 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
2d4e0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
2d4f0 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73   when there exis
2d500 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
2d510 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50  tions or a GROUP
2d520 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a   BY clause.    *
2d530 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20  * or both */.   
2d540 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
2d550 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
2d560 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
2d570 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
2d580 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
2d590 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
2d5a0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
2d5b0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
2d5c0 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
2d5d0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
2d5e0 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
2d5f0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
2d600 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
2d610 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
2d620 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
2d630 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
2d640 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
2d650 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
2d660 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
2d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d680 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
2d690 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
2d6a0 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
2d6b0 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
2d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6d0 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
2d6e0 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
2d6f0 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
2d700 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
2d710 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
2d720 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
2d730 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
2d740 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
2d750 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
2d760 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
2d770 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
2d780 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
2d790 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
2d7a0 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
2d7b0 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  T */.    int sor
2d7c0 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  tPTab = 0;   /* 
2d7d0 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64  Pseudotable used
2d7e0 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69   to decode sorti
2d7f0 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ng results */.  
2d800 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20    int sortOut = 
2d810 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  0;    /* Output 
2d820 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68  register from th
2d830 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20  e sorter */.    
2d840 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d  int orderByGrp =
2d850 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74   0; /* True if t
2d860 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  he GROUP BY and 
2d870 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68 65  ORDER BY are the
2d880 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   same */..    /*
2d890 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20   Remove any and 
2d8a0 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77  all aliases betw
2d8b0 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73  een the result s
2d8c0 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  et and the.    *
2d8d0 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  * GROUP BY claus
2d8e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2d8f0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
2d900 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
2d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d920 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2d930 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  r */.      struc
2d940 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2d950 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20  *pItem;  /* For 
2d960 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70  looping over exp
2d970 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73  ression in a lis
2d980 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  t */..      for(
2d990 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  k=p->pEList->nEx
2d9a0 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c  pr, pItem=p->pEL
2d9b0 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  ist->a; k>0; k--
2d9c0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2d9d0 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
2d9e0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
2d9f0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70   }.      for(k=p
2da00 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
2da10 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
2da20 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
2da30 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
2da40 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
2da50 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2da60 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
2da70 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e  ctRow>100 ) p->n
2da80 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30 30 3b  SelectRow = 100;
2da90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2daa0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2dab0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
2dac0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
2dad0 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61  oth a GROUP BY a
2dae0 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  nd an ORDER BY c
2daf0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61  lause and they a
2db00 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69  re.    ** identi
2db10 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  cal, then it may
2db20 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2db30 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45  disable the ORDE
2db40 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20  R BY clause .   
2db50 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e   ** on the groun
2db60 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55  ds that the GROU
2db70 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20  P BY will cause 
2db80 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
2db90 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20   out .    ** in 
2dba0 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
2dbb0 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e  r. It also may n
2dbc0 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42  ot - the GROUP B
2dbd0 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20  Y might use a.  
2dbe0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e    ** database in
2dbf0 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20  dex that causes 
2dc00 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70  rows to be group
2dc10 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72  ed together as r
2dc20 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62  equired.    ** b
2dc30 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ut not actually 
2dc40 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77  sorted. Either w
2dc50 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ay, record the f
2dc60 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20  act that the.   
2dc70 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64   ** ORDER BY and
2dc80 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2dc90 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62  s are the same b
2dca0 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72  y setting the or
2dcb0 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20  derByGrp.    ** 
2dcc0 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
2dcd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2dce0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72  rListCompare(pGr
2dcf0 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72  oupBy, sSort.pOr
2dd00 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b  derBy, -1)==0 ){
2dd10 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72  .      orderByGr
2dd20 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20  p = 1;.    }. . 
2dd30 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
2dd40 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
2dd50 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
2dd60 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
2dd70 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
2dd80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2dd90 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
2dda0 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
2ddb0 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
2ddc0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
2ddd0 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
2dde0 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
2ddf0 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
2de00 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
2de10 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
2de20 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
2de30 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
2de40 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
2de50 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
2de60 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
2de70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2de80 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
2de90 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
2dea0 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
2deb0 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
2dec0 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20  AggInfo.mnReg = 
2ded0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
2dee0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
2def0 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
2df00 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
2df10 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  y->nExpr : 0;.  
2df20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
2df30 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
2df40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2df50 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2df60 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
2df70 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2df80 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
2df90 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29   sSort.pOrderBy)
2dfa0 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
2dfb0 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
2dfc0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2dfd0 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
2dfe0 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
2dff0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
2e000 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
2e010 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
2e020 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
2e030 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
2e040 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2e050 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2e060 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
2e070 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
2e080 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2e090 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  sNC.ncFlags |= N
2e0a0 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
2e0b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2e0c0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
2e0d0 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
2e0e0 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
2e0f0 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  ist);.      sNC.
2e100 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49  ncFlags &= ~NC_I
2e110 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a  nAggFunc;.    }.
2e120 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52      sAggInfo.mxR
2e130 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2e140 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  m;.    if( db->m
2e150 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2e160 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
2e170 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
2e180 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
2e190 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
2e1a0 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
2e1b0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
2e1c0 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
2e1d0 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
2e1e0 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
2e1f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2e200 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
2e210 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2e220 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
2e230 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
2e240 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
2e250 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
2e260 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
2e270 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
2e280 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
2e290 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
2e2a0 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
2e2b0 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
2e2c0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
2e2d0 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
2e2e0 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
2e2f0 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
2e300 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
2e310 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
2e320 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
2e330 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
2e340 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
2e350 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
2e360 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
2e370 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
2e380 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
2e390 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
2e3a0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
2e3b0 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
2e3c0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2e3d0 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
2e3e0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
2e3f0 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
2e400 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
2e410 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
2e420 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2e430 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2e440 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
2e450 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2e460 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
2e470 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
2e480 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2e490 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
2e4a0 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
2e4b0 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
2e4c0 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
2e4d0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
2e4e0 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
2e4f0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
2e500 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
2e510 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
2e520 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
2e530 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
2e540 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
2e550 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
2e560 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
2e570 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
2e580 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
2e590 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2e5a0 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
2e5b0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2e5c0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
2e5d0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2e5e0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2e5f0 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  y, 0, sAggInfo.n
2e600 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
2e610 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
2e620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e630 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
2e640 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
2e650 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2e660 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
2e670 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
2e680 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
2e690 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2e6a0 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
2e6b0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
2e6c0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
2e6d0 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
2e6e0 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
2e6f0 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
2e700 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
2e710 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2e720 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
2e730 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2e740 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
2e750 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
2e760 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2e770 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2e780 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2e790 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
2e7a0 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
2e7b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2e7c0 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
2e7d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2e7e0 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
2e7f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2e800 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2e810 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2e820 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
2e830 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
2e840 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2e850 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2e860 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2e870 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e880 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2e890 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
2e8a0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2e8b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
2e8c0 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
2e8d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e8e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e8f0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
2e900 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2e910 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2e920 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
2e930 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
2e940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e950 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
2e960 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65  , 0, iAMem, iAMe
2e970 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  m+pGroupBy->nExp
2e980 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r-1);..      /* 
2e990 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
2e9a0 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
2e9b0 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
2e9c0 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
2e9d0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
2e9e0 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
2e9f0 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
2ea00 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
2ea10 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
2ea20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
2ea30 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
2ea40 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
2ea50 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
2ea60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
2ea70 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
2ea80 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
2ea90 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
2eaa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2eab0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2eac0 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2ead0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2eae0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2eaf0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2eb00 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2eb10 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c  Where, pGroupBy,
2eb20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48   0,.          WH
2eb30 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f  ERE_GROUPBY | (o
2eb40 72 64 65 72 42 79 47 72 70 20 3f 20 57 48 45 52  rderByGrp ? WHER
2eb50 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20  E_SORTBYGROUP : 
2eb60 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  0), 0.      );. 
2eb70 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
2eb80 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2eb90 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
2eba0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
2ebb0 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70  dered(pWInfo)==p
2ebc0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29  GroupBy->nExpr )
2ebd0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2ebe0 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
2ebf0 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
2ec00 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
2ec10 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
2ec20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
2ec30 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
2ec40 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2ec50 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
2ec60 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
2ec70 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
2ec80 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
2ec90 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
2eca0 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
2ecb0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
2ecc0 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
2ecd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2ece0 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
2ecf0 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
2ed00 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
2ed10 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
2ed20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
2ed30 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
2ed40 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
2ed50 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
2ed60 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2ed70 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
2ed80 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
2ed90 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
2eda0 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
2edb0 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
2edc0 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
2edd0 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
2ede0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
2edf0 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
2ee00 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
2ee10 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
2ee20 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ..        explai
2ee30 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
2ee40 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2ee50 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
2ee60 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
2ee70 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d  s&SF_Distinct)==
2ee80 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  0) ?.           
2ee90 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e           "DISTIN
2eea0 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22  CT" : "GROUP BY"
2eeb0 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
2eec0 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
2eed0 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
2eee0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2eef0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
2ef00 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2ef10 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2ef20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2ef30 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2ef40 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2ef50 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66       if( sAggInf
2ef60 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65  o.aCol[i].iSorte
2ef70 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2ef80 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
2ef90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
2efa0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2efb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2efc0 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
2efd0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
2efe0 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
2eff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f000 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2f010 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2f020 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
2f030 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
2f040 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
2f050 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  0, 0);.        j
2f060 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
2f070 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2f080 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2f090 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2f0a0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2f0b0 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
2f0c0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
2f0d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2f0e0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2f0f0 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
2f100 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
2f110 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
2f120 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f130 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f  rCodeGetColumnTo
2f140 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Reg(pParse, .   
2f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f160 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2f170 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
2f180 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
2f190 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ble, r1);.      
2f1a0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2f1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f1c0 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
2f1d0 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
2f1e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2f1f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f200 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2f210 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
2f220 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
2f230 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2f240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2f250 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
2f260 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
2f270 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
2f280 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2f290 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2f2a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
2f2b0 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
2f2c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2f2d0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2f2e0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
2f2f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2f300 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2f310 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2f320 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  o.sortingIdxPTab
2f330 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50   = sortPTab = pP
2f340 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2f350 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20        sortOut = 
2f360 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2f370 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
2f380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f390 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
2f3a0 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c  seudo, sortPTab,
2f3b0 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b   sortOut, nCol);
2f3c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f3d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2f3e0 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67  _SorterSort, sAg
2f3f0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2f400 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
2f410 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2f420 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
2f430 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72  rt")); VdbeCover
2f440 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2f450 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
2f460 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
2f470 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2f480 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2f490 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  );..      }..   
2f4a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
2f4b0 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  ex or temporary 
2f4c0 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68  table used by th
2f4d0 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a  e GROUP BY sort.
2f4e0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61        ** will na
2f4f0 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20  turally deliver 
2f500 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65  rows in the orde
2f510 72 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  r required by th
2f520 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20  e ORDER BY.     
2f530 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63   ** clause, canc
2f540 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  el the ephemeral
2f550 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65   table open code
2f560 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20  d earlier..     
2f570 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
2f580 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
2f590 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
2f5a0 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
2f5b0 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
2f5c0 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65  ss..      ** Use
2f5d0 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75   the SQLITE_Grou
2f5e0 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69  pByOrder flag wi
2f5f0 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
2f600 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20  RL_OPTIMIZER to 
2f610 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
2f620 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  e this optimizat
2f630 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ion for testing 
2f640 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20  purposes.  */.  
2f650 20 20 20 20 69 66 28 20 6f 72 64 65 72 42 79 47      if( orderByG
2f660 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  rp && Optimizati
2f670 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2f680 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
2f690 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 67  r) .       && (g
2f6a0 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71  roupBySort || sq
2f6b0 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
2f6c0 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20  ed(pWInfo)).    
2f6d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f    ){.        sSo
2f6e0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
2f6f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f700 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
2f710 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2f720 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
2f730 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
2f740 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
2f750 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
2f760 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
2f770 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
2f780 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
2f790 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
2f7a0 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
2f7b0 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
2f7c0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
2f7d0 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
2f7e0 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
2f7f0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
2f800 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
2f810 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
2f820 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
2f830 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
2f840 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
2f850 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
2f860 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
2f870 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2f880 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2f890 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2f8a0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2f8b0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2f8c0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2f8d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2f8e0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
2f8f0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2f900 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
2f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f920 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50 54   sortOut, sortPT
2f930 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
2f940 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
2f950 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
2f960 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2f970 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2f980 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2f990 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f9a0 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54  P_Column, sortPT
2f9b0 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  ab, j, iBMem+j);
2f9c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2f9d0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
2f9e0 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
2f9f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
2fa00 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
2fa10 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
2fa20 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
2fa30 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
2fa40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2fa50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2fa60 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
2fa70 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
2fa80 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
2fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2faa0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
2fab0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
2fac0 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
2fad0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64  YINFO);.      ad
2fae0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
2faf0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2fb00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fb10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
2fb20 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20 30 2c  ump, addr1+1, 0,
2fb30 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43   addr1+1); VdbeC
2fb40 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
2fb50 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
2fb60 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
2fb70 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50  enever the GROUP
2fb80 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20   BY changes..   
2fb90 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e     ** Changes in
2fba0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
2fbb0 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
2fbc0 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
2fbd0 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
2fbe0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
2fbf0 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
2fc00 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
2fc10 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2fc20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
2fc30 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
2fc40 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
2fc50 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
2fc60 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
2fc70 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
2fc80 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
2fc90 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
2fca0 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
2fcb0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
2fcc0 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
2fcd0 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
2fce0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
2fcf0 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
2fd00 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
2fd10 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
2fd20 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
2fd30 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d  se, iBMem, iAMem
2fd40 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
2fd50 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
2fd60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2fd70 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
2fd80 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
2fd90 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
2fda0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
2fdb0 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b  tput one row"));
2fdc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fdd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2fde0 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67  fPos, iAbortFlag
2fdf0 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65  , addrEnd); Vdbe
2fe00 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2fe10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2fe20 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20  v, "check abort 
2fe30 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2fe40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2fe50 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2fe60 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
2fe70 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
2fe80 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
2fe90 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
2fea0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
2feb0 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
2fec0 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
2fed0 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
2fee0 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
2fef0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
2ff00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2ff10 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2ff20 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
2ff30 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
2ff40 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2ff50 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
2ff60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ff70 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
2ff80 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
2ff90 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2ffa0 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
2ffb0 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
2ffc0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
2ffd0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
2ffe0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2fff0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
30000 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30010 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
30020 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67  _SorterNext, sAg
30030 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
30040 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
30050 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
30060 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
30070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30080 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
30090 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
300a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
300b0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
300c0 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
300d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
300e0 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
300f0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
30100 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
30110 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
30120 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
30130 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
30140 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
30150 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
30160 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
30170 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
30180 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
30190 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
301a0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
301b0 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
301c0 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
301d0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
301e0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
301f0 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
30200 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
30210 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
30220 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
30230 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
30240 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
30250 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
30260 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
30270 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
30280 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
30290 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
302a0 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
302b0 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
302c0 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
302d0 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
302e0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
302f0 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
30300 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
30310 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
30320 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
30330 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
30340 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
30350 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
30360 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
30370 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
30380 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
30390 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
303a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
303b0 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
303c0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
303d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
303e0 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
303f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30400 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
30410 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
30420 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
30430 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
30440 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
30450 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
30460 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
30470 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
30480 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
30490 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
304a0 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
304b0 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
304c0 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
304d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
304e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
304f0 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79  ent((v, "Groupby
30500 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
30510 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
30520 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30530 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30540 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
30550 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e  tRow);.      fin
30560 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
30570 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
30580 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
30590 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
305a0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
305b0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
305c0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
305d0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
305e0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
305f0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
30600 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20   -1, &sSort,.   
30610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30620 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70     &sDistinct, p
30630 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
30640 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
30650 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
30660 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
30670 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30680 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
30690 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
306a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
306b0 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
306c0 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
306d0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
306e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
306f0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
30700 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
30710 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
30720 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
30730 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30740 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
30750 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
30760 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
30770 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
30780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30790 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
307a0 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
307b0 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
307c0 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
307d0 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67  y.  Begin aggreg
307e0 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68  ate queries with
307f0 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f  out GROUP BY: */
30800 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
30810 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
30820 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
30830 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
30840 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65  OUNT.      Table
30850 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66   *pTab;.      if
30860 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70  ( (pTab = isSimp
30870 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67  leCount(p, &sAgg
30880 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  Info))!=0 ){.   
30890 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d       /* If isSim
308a0 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72  pleCount() retur
308b0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
308c0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
308d0 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  e, then.        
308e0 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
308f0 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
30900 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  orm:.        **.
30910 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
30920 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
30930 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20  M <tbl>.        
30940 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
30950 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ere the Table st
30960 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
30970 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c   represents tabl
30980 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20  e <tbl>..       
30990 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
309a0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
309b0 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20   so common that 
309c0 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  it is optimized 
309d0 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20  specially. The. 
309e0 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75         ** OP_Cou
309f0 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
30a00 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65  s executed eithe
30a10 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20  r on the intkey 
30a20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20  table that.     
30a30 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
30a40 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  he data for tabl
30a50 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e  e <tbl> or on on
30a60 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73  e of its indexes
30a70 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  . It.        ** 
30a80 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65  is better to exe
30a90 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61  cute the op on a
30aa0 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65  n index, as inde
30ab0 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20  xes are almost. 
30ac0 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
30ad0 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c   spread across l
30ae0 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74  ess pages than t
30af0 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
30b00 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ng tables..     
30b10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
30b20 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71  nst int iDb = sq
30b30 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
30b40 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
30b50 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
30b60 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
30b70 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e   iCsr = pParse->
30b80 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43  nTab++;     /* C
30b90 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d  ursor to scan b-
30ba0 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tree */.        
30bb0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
30bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bd0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
30be0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
30bf0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
30c00 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
30c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
30c20 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64  info for scanned
30c30 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
30c40 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
30c50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
30c60 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69         /* Best i
30c70 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61  ndex found so fa
30c80 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
30c90 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74   iRoot = pTab->t
30ca0 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
30cb0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
30cc0 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65  f scanned b-tree
30cd0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c   */..        sql
30ce0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
30cf0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
30d00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
30d10 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
30d20 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
30d30 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
30d40 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ame);..        /
30d50 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
30d60 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20   index that has 
30d70 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20  the lowest scan 
30d80 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  cost..        **
30d90 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
30da0 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20  1-04-15) Do not 
30db0 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f  do a full scan o
30dc0 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69  f an unordered i
30dd0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
30de0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
30df0 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20  3-10-03) Do not 
30e00 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65  count the entrie
30e10 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69  s in a partial i
30e20 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
30e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70  .        ** In p
30e40 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49  ractice the KeyI
30e50 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69  nfo structure wi
30e60 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
30e70 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20  It is only .    
30e80 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f      ** passed to
30e90 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61   keep OP_OpenRea
30ea0 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20  d happy..       
30eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
30ec0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
30ed0 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65  ) pBest = sqlite
30ee0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
30ef0 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
30f00 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
30f10 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
30f20 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
30f30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
30f40 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  dx->bUnordered==
30f50 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
30f60 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
30f70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20  Tab->szTabRow.  
30f80 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
30f90 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
30fa0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
30fb0 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78   (!pBest || pIdx
30fc0 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74  ->szIdxRow<pBest
30fd0 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20  ->szIdxRow).    
30fe0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30ff0 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
31000 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
31010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31020 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20   if( pBest ){.  
31030 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
31040 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
31050 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
31060 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
31070 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
31080 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pBest);.        
31090 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  }..        /* Op
310a0 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
310b0 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74  ursor, execute t
310c0 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f  he OP_Count, clo
310d0 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a  se the cursor. *
310e0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
310f0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
31100 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
31110 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c  Csr, iRoot, iDb,
31120 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
31130 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
31140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
31150 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
31160 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
31170 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
31180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
311a0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
311b0 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
311c0 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
311d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
311e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
311f0 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
31200 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69         explainSi
31210 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65  mpleCount(pParse
31220 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a  , pTab, pBest);.
31230 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
31240 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
31250 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
31260 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
31270 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
31280 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
31290 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
312a0 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20   forms:.        
312b0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
312c0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
312d0 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
312e0 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
312f0 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
31300 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31310 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
31320 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
31330 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
31340 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
31350 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ts.        ** as
31360 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
31370 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
31380 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
31390 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
313a0 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e      ** If where.
313b0 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f  c is able to pro
313c0 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72  duce results sor
313d0 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  ted in this orde
313e0 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  r, then.        
313f0 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
31400 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
31410 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
31420 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
31430 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
31440 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
31450 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
31460 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
31470 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  p is .        **
31480 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
31490 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
314a0 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
314b0 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
314c0 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
314d0 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
314e0 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
314f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31500 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
31510 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
31520 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
31530 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
31540 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  htly.        ** 
31550 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20  modify behavior 
31560 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
31570 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31580 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
31590 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
315a0 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
315b0 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
315c0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
315d0 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
315e0 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
315f0 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
31600 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
31610 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
31620 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
31630 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
31640 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
31650 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
31660 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
31670 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
31680 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
31690 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
316a0 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
316b0 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
316c0 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
316d0 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
316e0 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
316f0 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
31700 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
31710 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
31720 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
31730 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
31740 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
31750 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
31760 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
31770 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
31780 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
31790 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
317a0 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a  ORMAL;.        .
317b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
317c0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
317d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
317e0 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  ( flag==0 );.   
317f0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76       if( p->pHav
31800 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ing==0 ){.      
31810 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61      flag = minMa
31820 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f  xQuery(&sAggInfo
31830 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20  , &pMinMax);.   
31840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
31850 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c  ssert( flag==0 |
31860 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26  | (pMinMax!=0 &&
31870 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
31880 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  =1) );..        
31890 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
318a0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
318b0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
318c0 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20  up(db, pMinMax, 
318d0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  0);.          pD
318e0 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20  el = pMinMax;.  
318f0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e          if( pMin
31900 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Max && !db->mall
31910 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
31920 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
31930 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
31940 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52  = flag!=WHERE_OR
31950 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a  DERBY_MIN ?1:0;.
31960 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
31970 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
31980 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
31990 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
319a0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
319b0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
319c0 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
319d0 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
319e0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
319f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
31a00 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
31a10 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
31a20 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
31a30 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20  ngle row.       
31a40 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
31a50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31a60 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
31a70 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
31a80 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Info);.        p
31a90 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
31aa0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
31ab0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
31ac0 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c  re, pMinMax,0,fl
31ad0 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ag,0);.        i
31ae0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
31af0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31b00 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
31b10 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
31b20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
31b30 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
31b40 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
31b50 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
31b60 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
31b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
31b80 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e  inMax==0 || pMin
31b90 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  Max->nExpr==1 );
31ba0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
31bb0 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
31bc0 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a  ed(pWInfo)>0 ){.
31bd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31be0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c  3VdbeGoto(v, sql
31bf0 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
31c00 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20  bel(pWInfo));.  
31c10 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
31c20 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
31c30 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
31c40 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
31c50 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
31c60 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
31c70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31c80 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
31c90 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
31ca0 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
31cb0 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
31cc0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
31cd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f      }..      sSo
31ce0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
31cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
31d00 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
31d10 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
31d20 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
31d30 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
31d40 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
31d50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
31d60 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20  st, -1, 0, 0, . 
31d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d80 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
31d90 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
31da0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
31db0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
31dc0 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
31dd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
31de0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
31df0 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
31e00 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
31e10 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
31e20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
31e30 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
31e40 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
31e50 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
31e60 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
31e70 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
31e80 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
31e90 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
31ea0 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
31eb0 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
31ec0 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
31ed0 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
31ee0 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
31ef0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
31f00 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
31f10 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
31f20 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a  mpTable(pParse,.
31f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f40 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
31f50 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
31f60 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
31f70 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
31f80 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
31f90 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
31fa0 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
31fb0 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
31fc0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
31fd0 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
31fe0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
31ff0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
32000 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
32010 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
32020 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
32030 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
32040 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
32050 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
32060 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
32070 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
32080 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
32090 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
320a0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
320b0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
320c0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
320d0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
320e0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
320f0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
32100 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
32110 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
32120 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
32130 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
32140 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
32150 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
32160 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
32170 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
32180 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
32190 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
321a0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
321b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
321c0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
321d0 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
321e0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
321f0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
32200 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
32210 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
32220 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
32230 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
32240 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
32250 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45  aFunc);.#if SELE
32260 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
32270 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
32280 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70  pParse,p,("end p
32290 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
322a0 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
322b0 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
322c0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
322d0 0a                                               .