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

Artifact dbc73a63bee99bf7cfac6052477ffc21e899bb08:


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 33 32 20 73 65 6c 46 6c 61 67 73 2c 20 20   u32 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: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
0f20: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
0f30: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
0f40: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
0f50: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65  ailed );.    pNe
0f60: 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20  w = &standin;.  
0f70: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
0f80: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
0f90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
0fa0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0fb0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0fc0: 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29  b,TK_ASTERISK,0)
0fd0: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  );.  }.  pNew->p
0fe0: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
0ff0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
1000: 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e  SELECT;.  pNew->
1010: 73 65 6c 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c  selFlags = selFl
1020: 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  ags;.  pNew->iLi
1030: 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
1040: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 23 69  >iOffset = 0;.#i
1050: 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
1060: 41 42 4c 45 44 0a 20 20 70 4e 65 77 2d 3e 7a 53  ABLED.  pNew->zS
1070: 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 23  elName[0] = 0;.#
1080: 65 6e 64 69 66 0a 20 20 70 4e 65 77 2d 3e 61 64  endif.  pNew->ad
1090: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
10a0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
10b0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
10c0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63  ;.  pNew->nSelec
10d0: 74 52 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20  tRow = 0;.  if( 
10e0: 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d  pSrc==0 ) pSrc =
10f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1100: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1110: 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d  *pSrc));.  pNew-
1120: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
1130: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
1140: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
1150: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
1160: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
1170: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
1180: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1190: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
11a0: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
11b0: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
11c0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
11d0: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
11e0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
11f0: 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  ffset;.  pNew->p
1200: 57 69 74 68 20 3d 20 30 3b 0a 20 20 61 73 73 65  With = 0;.  asse
1210: 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c  rt( pOffset==0 |
1220: 7c 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70  | pLimit!=0 || p
1230: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c  Parse->nErr>0 ||
1240: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1250: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62  d!=0 );.  if( db
1260: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1270: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
1280: 63 74 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ct(db, pNew, pNe
1290: 77 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20  w!=&standin);.  
12a0: 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65    pNew = 0;.  }e
12b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
12c0: 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c   pNew->pSrc!=0 |
12d0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
12e0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
12f0: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
1300: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   );.  return pNe
1310: 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54  w;.}..#if SELECT
1320: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
1330: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
1340: 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a   of a Select obj
1350: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
1360: 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
1370: 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73  (Select *p, cons
1380: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1390: 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65    if( p && zName
13a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13b0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
13c0: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d  p->zSelName), p-
13d0: 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c  >zSelName, "%s",
13e0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23   zName);.  }.}.#
13f0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
1400: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
1410: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
1420: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
1430: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
1440: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
1450: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
1460: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
1470: 29 7b 0a 20 20 63 6c 65 61 72 53 65 6c 65 63 74  ){.  clearSelect
1480: 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f  (db, p, 1);.}../
1490: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
14a0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
14b0: 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
14c0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f  tatement in a co
14d0: 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  mpound..*/.stati
14e0: 63 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69  c Select *findRi
14f0: 67 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a  ghtmost(Select *
1500: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  p){.  while( p->
1510: 70 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70  pNext ) p = p->p
1520: 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70  Next;.  return p
1530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1540: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
1550: 65 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68  ers preceding th
1560: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
1570: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
1580: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
1590: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
15a0: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
15b0: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
15c0: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
15d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
15e0: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
15f0: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
1600: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
1610: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
1620: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
1630: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
1640: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
1650: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
1660: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
1670: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
1680: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
1690: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
16a0: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
16b0: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
16c0: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
16d0: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
16e0: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
16f0: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
1700: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
1710: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
1720: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
1730: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
1740: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
1750: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
1760: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
1770: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
1780: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
1790: 3b 0a 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 20 20 2f                 /
17b0: 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31  *   0123456789 1
17c0: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
17d0: 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74  89 123 */.  stat
17e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b  ic const char zK
17f0: 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75  eyText[] = "natu
1800: 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66  raleftouterightf
1810: 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a  ullinnercross";.
1820: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1830: 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69  truct {.    u8 i
1840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
1850: 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64  nning of keyword
1860: 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78   text in zKeyTex
1870: 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43  t[] */.    u8 nC
1880: 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74  har;    /* Lengt
1890: 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64  h of the keyword
18a0: 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a   in characters *
18b0: 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20  /.    u8 code;  
18c0: 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20     /* Join type 
18d0: 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79  mask */.  } aKey
18e0: 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  word[] = {.    /
18f0: 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30  * natural */ { 0
1900: 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c  ,  7, JT_NATURAL
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20  },.    /* left  
1930: 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54    */ { 6,  4, JT
1940: 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20  _LEFT|JT_OUTER  
1950: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1960: 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31  * outer   */ { 1
1970: 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20  0, 5, JT_OUTER  
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20  },.    /* right 
19a0: 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54    */ { 14, 5, JT
19b0: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
19c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
19d0: 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31  * full    */ { 1
19e0: 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54  9, 4, JT_LEFT|JT
19f0: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
1a00: 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20  },.    /* inner 
1a10: 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54    */ { 23, 5, JT
1a20: 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20  _INNER          
1a30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1a40: 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32  * cross   */ { 2
1a50: 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a  8, 5, JT_INNER|J
1a60: 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20  T_CROSS         
1a70: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
1a80: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
1a90: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
1aa0: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
1ab0: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
1ac0: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
1ad0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
1ae0: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
1af0: 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53  or(j=0; j<ArrayS
1b00: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a  ize(aKeyword); j
1b10: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1b20: 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d  ->n==aKeyword[j]
1b30: 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20  .nChar .        
1b40: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
1b50: 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a  ICmp((char*)p->z
1b60: 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79  , &zKeyText[aKey
1b70: 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e  word[j].i], p->n
1b80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1b90: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79  jointype |= aKey
1ba0: 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  word[j].code;.  
1bb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
1bd0: 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c  estcase( j==0 ||
1be0: 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c   j==1 || j==2 ||
1bf0: 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c   j==3 || j==4 ||
1c00: 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b   j==5 || j==6 );
1c10: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61  .    if( j>=Arra
1c20: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20  ySize(aKeyword) 
1c30: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
1c40: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
1c50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c60: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
1c70: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
1c80: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
1c90: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
1ca0: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
1cb0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
1cc0: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
1cd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
1ce0: 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65   = " ";.    asse
1cf0: 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20  rt( pB!=0 );.   
1d00: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53   if( pC==0 ){ zS
1d10: 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  p++; }.    sqlit
1d20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d30: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75  e, "unknown or u
1d40: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
1d50: 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22  type: ".       "
1d60: 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20  %T %T%s%T", pA, 
1d70: 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20  pB, zSp, pC);.  
1d80: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
1d90: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
1da0: 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a  f( (jointype & J
1db0: 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
1dc0: 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79        && (jointy
1dd0: 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
1de0: 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46  _RIGHT))!=JT_LEF
1df0: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
1e00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1e10: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
1e20: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
1e30: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
1e40: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
1e50: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
1e60: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
1e70: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
1e80: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
1e90: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
1ea0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
1eb0: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
1ec0: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
1ed0: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
1ee0: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
1ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1f00: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
1f10: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
1f20: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
1f30: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1f40: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
1f50: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1f60: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
1f70: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
1f80: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
1f90: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1fa0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  -1;.}../*.** Sea
1fb0: 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20  rch the first N 
1fc0: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20  tables in pSrc, 
1fd0: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1fe0: 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ht, looking for 
1ff0: 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20  a.** table that 
2000: 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  has a column nam
2010: 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a  ed zCol.  .**.**
2020: 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74   When found, set
2030: 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43   *piTab and *piC
2040: 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ol to the table 
2050: 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e  index and column
2060: 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65   index.** of the
2070: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
2080: 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45   and return TRUE
2090: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66  ..**.** If not f
20a0: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c  ound, return FAL
20b0: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
20c0: 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  t tableAndColumn
20d0: 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74  Index(.  SrcList
20e0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a   *pSrc,       /*
20f0: 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73   Array of tables
2100: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2110: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
2120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2130: 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  f tables in pSrc
2140: 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20  ->a[] to search 
2150: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2160: 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d  *zCol,    /* Nam
2170: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
2180: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  we are looking f
2190: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54  or */.  int *piT
21a0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
21b0: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
21c0: 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f  Src->a[] here */
21d0: 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20  .  int *piCol   
21e0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
21f0: 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e   index of pSrc->
2200: 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e  a[*piTab].pTab->
2210: 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29  aCol[] here */.)
2220: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2230: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
2240: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
2250: 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  les in pSrc */. 
2260: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
2270: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2280: 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e  f column matchin
2290: 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73  g zCol */..  ass
22a0: 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d  ert( (piTab==0)=
22b0: 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20  =(piCol==0) );  
22c0: 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68  /* Both or neith
22d0: 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20  er are NULL */. 
22e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69   for(i=0; i<N; i
22f0: 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ++){.    iCol = 
2300: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63  columnIndex(pSrc
2310: 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f  ->a[i].pTab, zCo
2320: 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  l);.    if( iCol
2330: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
2340: 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20   piTab ){.      
2350: 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20    *piTab = i;.  
2360: 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69        *piCol = i
2370: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
2380: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2390: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
23b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
23c0: 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69  d to add terms i
23d0: 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73  mplied by JOIN s
23e0: 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20  yntax to the.** 
23f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
2400: 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c  ression of a SEL
2410: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ECT statement. T
2420: 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69  he new term, whi
2430: 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77  ch.** is ANDed w
2440: 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67  ith the existing
2450: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
2460: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
2470: 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f  *.**    (tab1.co
2480: 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a  l1 = tab2.col2).
2490: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31  **.** where tab1
24a0: 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20   is the iSrc'th 
24b0: 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74  table in SrcList
24c0: 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69   pSrc and tab2 i
24d0: 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b  s the .** (iSrc+
24e0: 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f  1)'th. Column co
24f0: 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f  l1 is column iCo
2500: 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61  lLeft of tab1, a
2510: 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f  nd col2 is.** co
2520: 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f  lumn iColRight o
2530: 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69  f tab2..*/.stati
2540: 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54  c void addWhereT
2550: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
2560: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
2570: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
2580: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
2590: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
25c0: 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
25d0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20  */.  int iLeft, 
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2600: 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20   first table to 
2610: 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a  join in pSrc */.
2620: 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20    int iColLeft, 
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2650: 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61  lumn in first ta
2660: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69  ble */.  int iRi
2670: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2690: 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c  x of second tabl
26a0: 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  e in pSrc */.  i
26b0: 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20  nt iColRight,   
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
26e0: 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c  n in second tabl
26f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  e */.  int isOut
2700: 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20  erJoin,         
2710: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2720: 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54  f this is an OUT
2730: 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70  ER join */.  Exp
2740: 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20  r **ppWhere     
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2760: 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52  IN/OUT: The WHER
2770: 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20  E clause to add 
2780: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  to */.){.  sqlit
2790: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
27a0: 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31  >db;.  Expr *pE1
27b0: 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20  ;.  Expr *pE2;. 
27c0: 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61   Expr *pEq;..  a
27d0: 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69  ssert( iLeft<iRi
27e0: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
27f0: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67   pSrc->nSrc>iRig
2800: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
2810: 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70  pSrc->a[iLeft].p
2820: 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Tab );.  assert(
2830: 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d   pSrc->a[iRight]
2840: 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20  .pTab );..  pE1 
2850: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2860: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2870: 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c  rc, iLeft, iColL
2880: 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71  eft);.  pE2 = sq
2890: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
28a0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
28b0: 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68  iRight, iColRigh
28c0: 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c  t);..  pEq = sql
28d0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
28e0: 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45  , TK_EQ, pE1, pE
28f0: 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71  2, 0);.  if( pEq
2900: 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20   && isOuterJoin 
2910: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2920: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46  operty(pEq, EP_F
2930: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
2940: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2950: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54  operty(pEq, EP_T
2960: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2970: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
2980: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2990: 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  Eq, EP_NoReduce)
29a0: 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68  ;.    pEq->iRigh
29b0: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
29c0: 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20  6)pE2->iTable;. 
29d0: 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20   }.  *ppWhere = 
29e0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
29f0: 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71  b, *ppWhere, pEq
2a00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
2a10: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
2a20: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
2a30: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
2a40: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
2a50: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
2a60: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2a70: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
2a80: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
2a90: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2aa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
2ab0: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2ac0: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
2ad0: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
2ae0: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
2af0: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
2b00: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
2b10: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
2b20: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
2b30: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
2b40: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
2b50: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2b60: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
2b70: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
2b80: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
2b90: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
2ba0: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
2bb0: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
2bc0: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2bd0: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
2be0: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
2bf0: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
2c00: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
2c10: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
2c20: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2c30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
2c40: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2c50: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
2c60: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2c70: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
2c80: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
2c90: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
2ca0: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
2cb0: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
2cc0: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
2cd0: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
2ce0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
2cf0: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
2d00: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
2d10: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
2d20: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
2d30: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
2d40: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
2d50: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
2d60: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
2d70: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
2d80: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
2d90: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
2da0: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
2db0: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
2dc0: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
2dd0: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
2de0: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
2df0: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
2e00: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
2e10: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
2e20: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
2e30: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
2e40: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
2e50: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
2e60: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
2e70: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
2e80: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
2e90: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
2ea0: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
2eb0: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
2ec0: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
2ed0: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
2ee0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
2ef0: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
2f00: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
2f10: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
2f20: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
2f30: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2f40: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
2f50: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2f60: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
2f70: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20  tVVAProperty(p, 
2f80: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2f90: 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54    p->iRightJoinT
2fa0: 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62  able = (i16)iTab
2fb0: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  le;.    if( p->o
2fc0: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
2fd0: 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  & p->x.pList ){.
2fe0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2ff0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
3000: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
3010: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
3020: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e  etJoinExpr(p->x.
3030: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3040: 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r, iTable);.    
3050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65    }.    }.    se
3060: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
3070: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
3080: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
3090: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
30a0: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
30b0: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
30c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
30d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
30e0: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
30f0: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
3100: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
3110: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
3120: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
3130: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
3140: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
3150: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3160: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
3170: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
3180: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
3190: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
31a0: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
31b0: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
31c0: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
31d0: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
31e0: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
31f0: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
3200: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
3210: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
3220: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
3230: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
3240: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
3250: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
3260: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
3270: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
3280: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
3290: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
32a0: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
32b0: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
32c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
32d0: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
32e0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
32f0: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
3300: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3310: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
3320: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
3330: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
3340: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
3350: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
3360: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
3370: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
3380: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
3390: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
33a0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
33b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
33c0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
33e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
33f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3400: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
3410: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
3420: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
3430: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3440: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
3450: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
3460: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
3470: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
3480: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
3490: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
34a0: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
34b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
34c0: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
34d0: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
34e0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
34f0: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
3500: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
3510: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
3520: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
3530: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
3540: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65     if( NEVER(pLe
3550: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
3560: 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74  htTab==0) ) cont
3570: 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65  inue;.    isOute
3580: 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 66 67 2e  r = (pRight->fg.
3590: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
35a0: 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a  TER)!=0;..    /*
35b0: 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41   When the NATURA
35c0: 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  L keyword is pre
35d0: 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20  sent, add WHERE 
35e0: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
35f0: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f  .    ** every co
3600: 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77  lumn that the tw
3610: 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  o tables have in
3620: 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a   common..    */.
3630: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3640: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
3650: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
3660: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3670: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
3680: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
3690: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
36a0: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
36b0: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
36c0: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
36d0: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
36e0: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
36f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3700: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
3710: 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54  r(j=0; j<pRightT
3720: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
3730: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3740: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
3750: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  f column in the 
3760: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
3770: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3780: 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e  ;     /* Matchin
3790: 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  g left table */.
37a0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
37b0: 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69  tCol;  /* Matchi
37c0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ng column in the
37d0: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a   left table */..
37e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
37f0: 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b  pRightTab->aCol[
3800: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
3810: 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f    if( tableAndCo
3820: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3830: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3840: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29  ft, &iLeftCol) )
3850: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
3860: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3870: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
3880: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a  eftCol, 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 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
38b0: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
38c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
38d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
38e0: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
38f0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
3900: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
3910: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3920: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70  pRight->pOn && p
3930: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3950: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3960: 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  cannot have both
3970: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a   ON and USING ".
3980: 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73          "clauses
3990: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
39a0: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
39b0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
39c0: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
39d0: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
39e0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
39f0: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
3a00: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
3a10: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
3a20: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3a30: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
3a40: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
3a50: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
3a60: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
3a70: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
3a80: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3a90: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
3aa0: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
3ab0: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
3ac0: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
3ad0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3ae0: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
3af0: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
3b00: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
3b10: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
3b20: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
3b30: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
3b40: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
3b50: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3b60: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
3b70: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
3b80: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
3b90: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
3ba0: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
3bb0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
3bc0: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
3bd0: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
3be0: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
3bf0: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
3c00: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
3c10: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
3c20: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3c30: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
3c40: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
3c50: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3c60: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
3c70: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
3c80: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
3c90: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
3ca0: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
3cb0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
3cc0: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
3cd0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
3ce0: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
3cf0: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
3d00: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3d10: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3d20: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
3d30: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
3d40: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
3d50: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
3d60: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3d70: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
3d80: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3d90: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3da0: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
3db0: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
3dc0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3dd0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3de0: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
3df0: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
3e00: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
3e10: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3e20: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
3e30: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
3e40: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
3e50: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
3e60: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
3e70: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
3e80: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3e90: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3ea0: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
3eb0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3ec0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3ed0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3ee0: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
3ef0: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
3f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
3f10: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
3f20: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
3f30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
3f40: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
3f50: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
3f60: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3f70: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3f80: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
3f90: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
3fa0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3fb0: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3fd0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3fe0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
3ff0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
4000: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
4010: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
4020: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4030: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
4040: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
4050: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
4060: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
4070: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
4080: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
4090: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
40a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
40b0: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
40c0: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
40d0: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
40e0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
40f0: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
4100: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
4110: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65   */.);../*.** Ge
4120: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
4130: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
4140: 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65  ecord in registe
4150: 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68  rs regData.** th
4160: 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44  rough regData+nD
4170: 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73  ata-1 onto the s
4180: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
4190: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
41a0: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
41b0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
41c0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
41d0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
41e0: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  Sort,        /* 
41f0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
4200: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  t the ORDER BY c
4210: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
4220: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
4230: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
4240: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
4250: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
4260: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
4270: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
4280: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
4290: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74   sorted */.  int
42a0: 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20   regOrigData,   
42b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
42c0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
42d0: 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e  ta before packin
42e0: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  g */.  int nData
42f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4300: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
4310: 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 20  nts in the data 
4320: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4330: 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20  PrefixReg       
4340: 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20    /* No. of reg 
4350: 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61  prior to regData
4360: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
4370: 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  se */.){.  Vdbe 
4380: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4390: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
43b0: 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
43c0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
43d0: 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e  bSeq = ((pSort->
43e0: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
43f0: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d  FLAG_UseSorter)=
4400: 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  =0);.  int nExpr
4410: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
4420: 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20  By->nExpr;      
4430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4440: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
4450: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20   */.  int nBase 
4460: 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b  = nExpr + bSeq +
4470: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
4480: 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73         /* Fields
4490: 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72   in sorter recor
44a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
44b0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20          /* Regs 
44e0: 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72  for sorter recor
44f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  d */.  int regRe
4500: 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  cord = ++pParse-
4510: 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  >nMem;          
4520: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d          /* Assem
4530: 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f  bled sorter reco
4540: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53  rd */.  int nOBS
4550: 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  at = pSort->nOBS
4560: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
4570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
4580: 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b  R BY terms to sk
4590: 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ip */.  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 20 20 2f 2a 20 4f 70             /* Op
45c0: 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74  code to add sort
45d0: 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72  er record to sor
45e0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ter */.  int iLi
45f0: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
4600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4610: 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  IMIT counter */.
4620: 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71 3d  .  assert( bSeq=
4630: 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b  =0 || bSeq==1 );
4640: 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61  .  assert( nData
4650: 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d  ==1 || regData==
4660: 72 65 67 4f 72 69 67 44 61 74 61 20 29 3b 0a 20  regOrigData );. 
4670: 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20   if( nPrefixReg 
4680: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
4690: 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72  PrefixReg==nExpr
46a0: 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67  +bSeq );.    reg
46b0: 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d  Base = regData -
46c0: 20 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20   nExpr - bSeq;. 
46d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42   }else{.    regB
46e0: 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
46f0: 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72  em + 1;.    pPar
4700: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73  se->nMem += nBas
4710: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
4720: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
4730: 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d  t==0 || pSelect-
4740: 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >iLimit!=0 );.  
4750: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
4760: 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c  ->iOffset ? pSel
4770: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ect->iOffset+1 :
4780: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4790: 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  ;.  pSort->label
47a0: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
47b0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
47c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
47d0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
47e0: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
47f0: 79 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f  y, regBase, regO
4800: 72 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20  rigData,.       
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
4830: 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  UP|SQLITE_ECEL_R
4840: 45 46 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20  EF);.  if( bSeq 
4850: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4860: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
4870: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
4880: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4890: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  e+nExpr);.  }.  
48a0: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  if( nPrefixReg==
48b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
48c0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
48d0: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
48e0: 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71  gBase+nExpr+bSeq
48f0: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  , nData);.  }.  
4900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4910: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4920: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4930: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4940: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
4950: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
4960: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4970: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4980: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4990: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
49a0: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
49b0: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
49c0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
49d0: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
49e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
49f0: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
4a00: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
4a10: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
4a20: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
4a30: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
4a40: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
4a50: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
4a60: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
4a70: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
4a80: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
4a90: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
4aa0: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
4ab0: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
4ac0: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
4ad0: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
4ae0: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
4af0: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
4b00: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
4b10: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
4b20: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
4b30: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
4b40: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
4b50: 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62   bSeq;.    if( b
4b60: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Seq ){.      add
4b70: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4b80: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4b90: 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b  _IfNot, regBase+
4ba0: 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c  nExpr); .    }el
4bb0: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69  se{.      addrFi
4bc0: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
4bd0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
4be0: 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72  quenceTest, pSor
4bf0: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
4c00: 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65    }.    VdbeCove
4c10: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
4c20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4c30: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
4c40: 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73  gPrevKey, regBas
4c50: 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  e, pSort->nOBSat
4c60: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
4c70: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
4c80: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
4c90: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
4ca0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
4cb0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
4cc0: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  n;.    pOp->p2 =
4cd0: 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20   nKey + nData;. 
4ce0: 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34     pKI = pOp->p4
4cf0: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d  .pKeyInfo;.    m
4d00: 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74  emset(pKI->aSort
4d10: 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e  Order, 0, pKI->n
4d20: 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73  Field); /* Makes
4d30: 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74   OP_Jump below t
4d40: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4d50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4d60: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4d70: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4d80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4d90: 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20   pKI->nXField>2 
4da0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
4db0: 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
4dc0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
4dd0: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4de0: 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20  derBy, 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 20 20 70 4b 49 2d 3e 6e            pKI->n
4e20: 58 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61  XField-1);.    a
4e30: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
4e40: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4e50: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4e60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4e70: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
4e80: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
4e90: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4ea0: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
4eb0: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
4ec0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4ed0: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
4ee0: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
4ef0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
4f00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4f10: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
4f20: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
4f30: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
4f40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4f50: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
4f60: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
4f70: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4f80: 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20   if( iLimit ){. 
4f90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4fa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
4fb0: 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72  ot, iLimit, pSor
4fc0: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20  t->labelDone);. 
4fd0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
4fe0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
4ff0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5000: 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74  ere(v, addrFirst
5010: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
5020: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
5030: 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50  e, regBase, regP
5040: 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e  revKey, pSort->n
5050: 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  OBSat);.    sqli
5060: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5070: 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d  v, addrJmp);.  }
5080: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
5090: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
50a0: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
50b0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74      op = OP_Sort
50c0: 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73  erInsert;.  }els
50d0: 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49  e{.    op = OP_I
50e0: 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20  dxInsert;.  }.  
50f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5100: 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e  2(v, op, pSort->
5110: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
5120: 6f 72 64 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d  ord);.  if( iLim
5130: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
5140: 64 72 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  dr;.    addr = s
5150: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5160: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f  (v, OP_IfNotZero
5170: 2c 20 69 4c 69 6d 69 74 2c 20 30 2c 20 31 29 3b  , iLimit, 0, 1);
5180: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
51a0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
51b0: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
51c0: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
51d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
51e0: 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d  P_Delete, pSort-
51f0: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5200: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5210: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
5220: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
5230: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
5240: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
5250: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
5260: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
5270: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
5280: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
5290: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
52a0: 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20  t iOffset,      
52b0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
52c0: 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20 63  ing the offset c
52d0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
52e0: 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a  iContinue     /*
52f0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
5300: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
5310: 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ecord */.){.  if
5320: 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ( iOffset>0 ){. 
5330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5340: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
5350: 2c 20 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  , iOffset, iCont
5360: 69 6e 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f  inue, 1); VdbeCo
5370: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56  verage(v);.    V
5380: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5390: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d  OFFSET"));.  }.}
53a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
53b0: 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b   that will check
53c0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
53d0: 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74  e N registers st
53e0: 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a  arting at iMem.*
53f0: 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63  * form a distinc
5400: 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69  t entry.  iTab i
5410: 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  s a sorting inde
5420: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65  x that holds pre
5430: 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20  viously.** seen 
5440: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
5450: 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41  the N values.  A
5460: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61   new entry is ma
5470: 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66  de in iTab.** if
5480: 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76   the current N v
5490: 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a  alues are new..*
54a0: 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61  *.** A jump to a
54b0: 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64  ddrRepeat is mad
54c0: 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61  e and the N+1 va
54d0: 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20  lues are popped 
54e0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63  from the.** stac
54f0: 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65  k if the top N e
5500: 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20  lements are not 
5510: 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61  distinct..*/.sta
5520: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73  tic void codeDis
5530: 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a  tinct(.  Parse *
5540: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
5550: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5560: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5570: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
5580: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
5590: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73  sorting index us
55a0: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64  ed to test for d
55b0: 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20  istinctness */. 
55c0: 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c   int addrRepeat,
55d0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68      /* Jump to h
55e0: 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69  ere if not disti
55f0: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  nct */.  int N, 
5600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5610: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
5620: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20  s */.  int iMem 
5630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
5640: 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b  st element */.){
5650: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
5660: 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61  t r1;..  v = pPa
5670: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31  rse->pVdbe;.  r1
5680: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5690: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
56a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56b0: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
56c0: 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65  , iTab, addrRepe
56d0: 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64  at, iMem, N); Vd
56e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
56f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5700: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5710: 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31  ord, iMem, N, r1
5720: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5730: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
5740: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31  Insert, iTab, r1
5750: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
5760: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5770: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64  e, r1);.}..#ifnd
5780: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5790: 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
57a0: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
57b0: 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53  message when a S
57c0: 45 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69  ELECT is used wi
57d0: 74 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73  thin a subexpres
57e0: 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65  sion.** (example
57f0: 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54  :  "a IN (SELECT
5800: 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29   * FROM table)")
5810: 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65   but it has more
5820: 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a   than 1 result.*
5830: 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f  * column.  We do
5840: 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f   this in a subro
5850: 75 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68  utine because th
5860: 65 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20  e error used to 
5870: 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74  occur.** in mult
5880: 69 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54  iple places.  (T
5890: 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63  he error only oc
58a0: 63 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63  curs in one plac
58b0: 65 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a  e now, but we.**
58c0: 20 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72   retain the subr
58d0: 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69  outine to minimi
58e0: 7a 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69  ze code disrupti
58f0: 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  on.).*/.static i
5900: 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  nt checkForMulti
5910: 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
5920: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
5930: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
5940: 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20  se context. */. 
5950: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
5960: 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  st,   /* Destina
5970: 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72  tion of SELECT r
5980: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
5990: 6e 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  nExpr           
59a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
59b0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74  sult columns ret
59c0: 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
59d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73  */.){.  int eDes
59e0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
59f0: 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20  ;.  if( nExpr>1 
5a00: 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  && (eDest==SRT_M
5a10: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
5a20: 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  _Set) ){.    sql
5a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5a40: 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
5a50: 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
5a60: 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
5a70: 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
5a80: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
5a90: 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72  ression");.    r
5aa0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65  eturn 1;.  }else
5ab0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5ac0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
5ad0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5ae0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
5af0: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
5b00: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
5b10: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
5b20: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
5b30: 63 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65  cTab is negative
5b40: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
5b50: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
5b60: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
5b70: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
5b80: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5b90: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
5ba0: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
5bb0: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
5bc0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
5bd0: 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20  cTab and pEList 
5be0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a  is used only .**
5bf0: 20 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63   to get number c
5c00: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64  olumns and the d
5c10: 61 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68  atatype for each
5c20: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
5c30: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
5c40: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
5c50: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5c60: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
5c70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
5c80: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
5c90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
5ca0: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
5cb0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
5cc0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
5cd0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
5ce0: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
5cf0: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
5d00: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
5d10: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
5d20: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
5d30: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
5d40: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
5d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
5d60: 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e  ot NULL, info on
5d70: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
5d80: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69  ORDER BY */.  Di
5d90: 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74  stinctCtx *pDist
5da0: 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20  inct, /* If not 
5db0: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
5dc0: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53  w to process DIS
5dd0: 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63  TINCT */.  Selec
5de0: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
5df0: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
5e00: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
5e10: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  lts */.  int iCo
5e20: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
5e30: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5e40: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
5e50: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
5e60: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
5e70: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
5e80: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
5e90: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5ea0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
5eb0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
5ec0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5ed0: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
5ee0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5ef0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
5f00: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
5f10: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75  */.  int regResu
5f20: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
5f30: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
5f40: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ory holding resu
5f50: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  lt set */.  int 
5f60: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
5f70: 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74  Dest;   /* How t
5f80: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73  o dispose of res
5f90: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
5fa0: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
5fb0: 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61  Parm; /* First a
5fc0: 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f  rgument to dispo
5fd0: 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
5fe0: 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  int nResultCol; 
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6000: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
6010: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
6020: 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b   nPrefixReg = 0;
6030: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6040: 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
6050: 73 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67  sters before reg
6060: 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73  Result */..  ass
6070: 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65  ert( v );.  asse
6080: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
6090: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
60a0: 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69   pDistinct ? pDi
60b0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
60c0: 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e : WHERE_DISTIN
60d0: 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70  CT_NOOP;.  if( p
60e0: 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70  Sort && pSort->p
60f0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f  OrderBy==0 ) pSo
6100: 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  rt = 0;.  if( pS
6110: 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69  ort==0 && !hasDi
6120: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73  stinct ){.    as
6130: 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21  sert( iContinue!
6140: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  =0 );.    codeOf
6150: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
6160: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
6170: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
6180: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
6190: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65  umns..  */.  nRe
61a0: 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74  sultCol = pEList
61b0: 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20  ->nExpr;..  if( 
61c0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
61d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  ){.    if( pSort
61e0: 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69   ){.      nPrefi
61f0: 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  xReg = pSort->pO
6200: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
6210: 20 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74       if( !(pSort
6220: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
6230: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
6240: 29 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b  ) ) nPrefixReg++
6250: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6260: 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52  nMem += nPrefixR
6270: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  eg;.    }.    pD
6280: 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61  est->iSdst = pPa
6290: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
62a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
62b0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
62c0: 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e  else if( pDest->
62d0: 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c  iSdst+nResultCol
62e0: 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   > pParse->nMem 
62f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
6300: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  s an error condi
6310: 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65  tion that can re
6320: 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  sult, for exampl
6330: 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  e, when a SELECT
6340: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72  .    ** on the r
6350: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
6360: 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74  f an INSERT cont
6370: 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74  ains more result
6380: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20   columns than.  
6390: 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63    ** there are c
63a0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
63b0: 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e  ble on the left.
63c0: 20 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c    The error will
63d0: 20 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a   be caught.    *
63e0: 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  * and reported l
63f0: 61 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65  ater.  But we ne
6400: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
6410: 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73  enough memory is
6420: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a   allocated.    *
6430: 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72  * to avoid other
6440: 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73   spurious errors
6450: 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65   in the meantime
6460: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d  . */.    pParse-
6470: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
6480: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74  Col;.  }.  pDest
6490: 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c  ->nSdst = nResul
64a0: 74 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c  tCol;.  regResul
64b0: 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  t = pDest->iSdst
64c0: 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d  ;.  if( srcTab>=
64d0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
64e0: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
64f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
6500: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6510: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
6520: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
6530: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
6540: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
6550: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
6560: 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
6570: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
6580: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20  SRT_Exists ){.  
6590: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
65a0: 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58  ination is an EX
65b0: 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73  ISTS(...) expres
65c0: 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c  sion, the actual
65d0: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72  .    ** values r
65e0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
65f0: 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65  ELECT are not re
6600: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
6610: 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b     u8 ecelFlags;
6620: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
6630: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
6640: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
6650: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6660: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63  tine ){.      ec
6670: 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  elFlags = SQLITE
6680: 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d  _ECEL_DUP;.    }
6690: 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c  else{.      ecel
66a0: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Flags = 0;.    }
66b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
66c0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
66d0: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67  rse, pEList, reg
66e0: 52 65 73 75 6c 74 2c 20 30 2c 20 65 63 65 6c 46  Result, 0, ecelF
66f0: 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
6700: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
6710: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
6720: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
6730: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
6740: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
6750: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
6760: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
6770: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
6780: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
6790: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
67a0: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
67b0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44  {.    switch( pD
67c0: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
67d0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
67e0: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
67f0: 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
6800: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20     VdbeOp *pOp; 
6810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
6820: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
6830: 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
6840: 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nstr. */.       
6850: 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20   int iJump;     
6860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
6870: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
6880: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50          int regP
6890: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
68a0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20  /* Previous row 
68b0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  content */..    
68c0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
68d0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72  space for the pr
68e0: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
68f0: 20 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20        regPrev = 
6900: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
6910: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
6920: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
6930: 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ol;..        /* 
6940: 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  Change the OP_Op
6950: 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65  enEphemeral code
6960: 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20  d earlier to an 
6970: 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20  OP_Null.        
6980: 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f  ** sets the MEM_
6990: 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74  Cleared bit on t
69a0: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
69b0: 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  r of the.       
69c0: 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c   ** previous val
69d0: 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  ue.  This will c
69e0: 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62  ause the OP_Ne b
69f0: 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20  elow to always. 
6a00: 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f         ** fail o
6a10: 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  n the first iter
6a20: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
6a30: 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  p even if the fi
6a40: 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  rst.        ** r
6a50: 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e  ow is all NULLs.
6a60: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6a70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6a80: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70  hangeToNoop(v, p
6a90: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
6aa0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ct);.        pOp
6ab0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
6ac0: 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  tOp(v, pDistinct
6ad0: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
6ae0: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
6af0: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
6b00: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b      pOp->p1 = 1;
6b10: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
6b20: 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20   = regPrev;..   
6b30: 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c       iJump = sql
6b40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
6b50: 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74  ddr(v) + nResult
6b60: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Col;.        for
6b70: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
6b80: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6b90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6ba0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
6bb0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
6bc0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
6bd0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
6be0: 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d  f( i<nResultCol-
6bf0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
6c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c10: 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67  p3(v, OP_Ne, reg
6c20: 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c  Result+i, iJump,
6c30: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
6c40: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
6c50: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
6c60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6c70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6c80: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
6c90: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
6ca0: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
6cb0: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
6cc0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6cd0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d  v);.           }
6ce0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6cf0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
6d00: 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  , -1, (const cha
6d10: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
6d20: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
6d30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6d40: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
6d50: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20  NULLEQ);.       
6d60: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
6d70: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t( sqlite3VdbeCu
6d80: 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a  rrentAddr(v)==iJ
6d90: 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ump || pParse->d
6da0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6db0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6dc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6dd0: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75  OP_Copy, regResu
6de0: 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65  lt, regPrev, nRe
6df0: 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  sultCol-1);.    
6e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6e10: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
6e20: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
6e30: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
6e40: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6e50: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
6e60: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
6e70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6e80: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
6e90: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6ea0: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
6eb0: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
6ec0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
6ed0: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
6ee0: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
6ef0: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
6f00: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
6f10: 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43  ntinue, nResultC
6f20: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
6f30: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
6f40: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  lt);.        bre
6f50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6f60: 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d  }.    if( pSort=
6f70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
6f80: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
6f90: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
6fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
6fb0: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
6fc0: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
6fd0: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
6fe0: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
6ff0: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
7000: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
7010: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
7020: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
7030: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
7040: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
7050: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
7060: 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
7070: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
7080: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7090: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
70a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
70b0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
70c0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
70d0: 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  l, r1);.      sq
70e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
70f0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
7100: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
7110: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7120: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7130: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
7140: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7150: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
7160: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
7170: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
7180: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
7190: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
71a0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
71b0: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
71c0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
71d0: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
71e0: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
71f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7200: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
7210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7220: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7230: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
7240: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7250: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
7260: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
7270: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
7280: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
7290: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
72a0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
72b0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
72c0: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
72d0: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
72e0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
72f0: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7300: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7310: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7320: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
7330: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7340: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7350: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7370: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7380: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7390: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
73a0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
73b0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
73c0: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
73d0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
73e0: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
73f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7400: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7410: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7420: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7430: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7440: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7450: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7460: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7470: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7480: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7490: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
74a0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
74b0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
74c0: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
74d0: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
74e0: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
74f0: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7500: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7510: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7520: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
7530: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7540: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7550: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7560: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7570: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7580: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7590: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
75a0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
75b0: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
75c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
75d0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
75e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
75f0: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7600: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7610: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7620: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
7630: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7640: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7660: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
7670: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
7680: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61  , r1);.        a
7690: 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20  ssert( pSort==0 
76a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
76b0: 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  f.      if( pSor
76c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
76d0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
76e0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31  se, pSort, p, r1
76f0: 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67 52  +nPrefixReg,regR
7700: 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52  esult,1,nPrefixR
7710: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
7720: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
7730: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7740: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7760: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7770: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
7780: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7790: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
77a0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
77b0: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
77c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
77d0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
77e0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
77f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7800: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7810: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
7820: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
7830: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
7840: 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52  se, r1, nPrefixR
7850: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65  eg+1);.      bre
7860: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
7870: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7880: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
7890: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
78a0: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
78b0: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
78c0: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
78d0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
78e0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
78f0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
7900: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
7910: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
7920: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
7930: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
7940: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
7950: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
7960: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
7970: 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20  esultCol==1 );. 
7980: 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
7990: 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  dst =.          
79a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
79b0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
79c0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
79d0: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  r, pDest->affSds
79e0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t);.      if( pS
79f0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ort ){.        /
7a00: 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63  * At first glanc
7a10: 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e  e you would thin
7a20: 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d  k we could optim
7a30: 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ize out the.    
7a40: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
7a50: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e  in this case sin
7a60: 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  ce the order of 
7a70: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73  entries in the s
7a80: 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  et.        ** do
7a90: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  es not matter.  
7aa0: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
7ab0: 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  be a LIMIT claus
7ac0: 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20  e, in which.    
7ad0: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20      ** case the 
7ae0: 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65  order does matte
7af0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73  r */.        pus
7b00: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
7b10: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
7b20: 67 52 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75  gResult, regResu
7b30: 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  lt, 1, nPrefixRe
7b40: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
7b50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
7b60: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7b70: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7b80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7b90: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
7ba0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
7bb0: 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d  lt,1,r1, &pDest-
7bc0: 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20  >affSdst, 1);.  
7bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7be0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
7bf0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
7c00: 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20  Result, 1);.    
7c10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7c20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
7c30: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
7c40: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7c50: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7c60: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
7c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7c80: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7c90: 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
7ca0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
7cb0: 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
7cc0: 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
7cd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
7ce0: 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
7cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7d00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7d10: 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b  eger, 1, iParm);
7d20: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
7d30: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
7d40: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
7d50: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
7d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7d70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
7d80: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
7d90: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
7da0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
7db0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
7dc0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
7dd0: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
7de0: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
7df0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
7e00: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
7e10: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
7e20: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
7e30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
7e40: 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a  ResultCol==1 );.
7e50: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
7e60: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
7e70: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7e80: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7e90: 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74  esult, regResult
7ea0: 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29  , 1, nPrefixReg)
7eb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7ec0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
7ed0: 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20  egResult==iParm 
7ee0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
7ef0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
7f00: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
7f10: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
7f20: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
7f30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7f40: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
7f50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
7f60: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73  UERY */..    cas
7f70: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
7f80: 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64         /* Send d
7f90: 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74  ata to a co-rout
7fa0: 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ine */.    case 
7fb0: 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20  SRT_Output: {   
7fc0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
7fd0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7fe0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ff0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
8000: 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ne );.      test
8010: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
8020: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
8030: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
8040: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
8050: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
8060: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
8070: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
8080: 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20  sultCol,.       
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
80b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
80c0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
80d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
80e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
80f0: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
8100: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
8110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8130: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
8140: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
8150: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
8160: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8170: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
8180: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
8190: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
81a0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
81b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
81c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
81d0: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
81e0: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
81f0: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
8200: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
8210: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
8220: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
8230: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
8240: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
8250: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
8260: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
8270: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
8280: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
8290: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
82a0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
82b0: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
82c0: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
82d0: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
82e0: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
82f0: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
8300: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
8310: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
8320: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
8330: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
8340: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
8350: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
8360: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
8370: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
8380: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
8390: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
83a0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
83b0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
83c0: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
83d0: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
83e0: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
83f0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
8400: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
8410: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
8420: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
8430: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8440: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
8450: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
8460: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
8470: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
8480: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
8490: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
84a0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
84b0: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
84c0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
84d0: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
84e0: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
84f0: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
8500: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
8510: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
8520: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
8530: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
8540: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
8550: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
8560: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
8570: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
8580: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
8590: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
85a0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
85b0: 20 0a 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 20 20 72 65 67 52 65 73            regRes
85e0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
85f0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
8600: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
8610: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8620: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8630: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
8640: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8650: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
8660: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
8670: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
8680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8690: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
86a0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
86b0: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
86c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
86d0: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
86e0: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
86f0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
8700: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
8710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8720: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
8730: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
8760: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
8770: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
87a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
87b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
87c0: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
87d0: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
87e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
87f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
8800: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
8810: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
8820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8830: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
8840: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
8850: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
8860: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
8870: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
8880: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8890: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
88a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
88b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
88c0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
88d0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
88e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
88f0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8900: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
8910: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
8920: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
8930: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
8940: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
8950: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
8960: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
8970: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
8980: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
8990: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
89a0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
89b0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
89c0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
89d0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
89e0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
89f0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
8a00: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
8a10: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
8a20: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
8a30: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
8a40: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8a50: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
8a60: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
8a70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8a80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
8a90: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
8aa0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
8ab0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
8ac0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
8ad0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
8ae0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
8af0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
8b00: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
8b10: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
8b20: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
8b30: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
8b40: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
8b50: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
8b60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8b70: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
8b80: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
8b90: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
8ba0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
8bb0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
8bc0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
8bd0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
8be0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
8bf0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
8c00: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
8c10: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
8c20: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
8c30: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
8c40: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
8c50: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
8c60: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
8c70: 2b 31 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  +1);.  KeyInfo *
8c80: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
8c90: 63 28 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  c(sizeof(KeyInfo
8ca0: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
8cb0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
8cc0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
8cd0: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
8ce0: 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  .    p->nField =
8cf0: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
8d00: 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58  nXField = (u16)X
8d10: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
8d20: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
8d30: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
8d40: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
8d50: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
8d60: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
8d70: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
8d80: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
8d90: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
8da0: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
8db0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
8dc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
8dd0: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
8de0: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
8df0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8e00: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
8e10: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
8e20: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
8e30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
8e40: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
8e50: 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e   Make a new poin
8e60: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
8e70: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e   object.*/.KeyIn
8e80: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
8e90: 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  foRef(KeyInfo *p
8ea0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
8eb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
8ec0: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
8ed0: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ef++;.  }.  retu
8ee0: 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn p;.}..#ifdef 
8ef0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
8f00: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8f10: 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  f a KeyInfo obje
8f20: 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ct can be change
8f30: 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f  .  The KeyInfo o
8f40: 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c  bject.** can onl
8f50: 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20  y be changed if 
8f60: 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73  this is just a s
8f70: 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20  ingle reference 
8f80: 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a  to the object..*
8f90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8fa0: 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69  e is used only i
8fb0: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
8fc0: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
8fd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49  .int sqlite3KeyI
8fe0: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b  nfoIsWriteable(K
8ff0: 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75  eyInfo *p){ retu
9000: 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d  rn p->nRef==1; }
9010: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9020: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
9030: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
9040: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
9050: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
9060: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
9070: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
9080: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
9090: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
90a0: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
90b0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
90c0: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
90d0: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
90e0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
90f0: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
9100: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
9110: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
9120: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9130: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
9140: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
9150: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
9160: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
9170: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
9180: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
9190: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
91a0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
91b0: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
91c0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
91d0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
91e0: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
91f0: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
9200: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
9210: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
9220: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
9230: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
9240: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
9250: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
9260: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
9270: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
9280: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
9290: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
92a0: 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
92b0: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
92c0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
92d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
92e0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
92f0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9300: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9310: 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68  ,     /* Form th
9320: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
9330: 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c   from this ExprL
9340: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ist */.  int iSt
9350: 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  art,          /*
9360: 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73   Begin with this
9370: 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74   column of pList
9380: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
9390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
93a0: 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72  d this many extr
93b0: 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  a columns to the
93c0: 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   end */.){.  int
93d0: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
93e0: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
93f0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9400: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
9410: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9420: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  >db;.  int i;.. 
9430: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
9440: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
9450: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
9460: 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69  lloc(db, nExpr-i
9470: 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29  Start, nExtra+1)
9480: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
9490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
94a0: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
94b0: 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b  teable(pInfo) );
94c0: 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72  .    for(i=iStar
94d0: 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  t, pItem=pList->
94e0: 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70  a+iStart; i<nExp
94f0: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
9500: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
9510: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
9520: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
9530: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
9540: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
9550: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
9560: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
9570: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
9580: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69  pInfo->aColl[i-i
9590: 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  Start] = pColl;.
95a0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
95b0: 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74  rtOrder[i-iStart
95c0: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
95d0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
95e0: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
95f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  }../*.** Name of
9600: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9610: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
9620: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
9630: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
9640: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
9650: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
9660: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
9670: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
9680: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
9690: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
96a0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
96b0: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
96c0: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
96d0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
96e0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
96f0: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
9700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9710: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
9720: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
9730: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9740: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
9750: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9760: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
9770: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
9780: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
9790: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
97a0: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
97b0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
97c0: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
97d0: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
97e0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
97f0: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
9800: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
9810: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
9820: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
9830: 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42  **   "USE TEMP B
9840: 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a  -TREE FOR xxx".*
9850: 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69  *.** where xxx i
9860: 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e  s one of "DISTIN
9870: 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20  CT", "ORDER BY" 
9880: 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45  or "GROUP BY". E
9890: 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20  xactly which.** 
98a0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
98b0: 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75   the zUsage argu
98c0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
98d0: 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70  void explainTemp
98e0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
98f0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
9900: 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20  *zUsage){.  if( 
9910: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
9920: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
9930: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9940: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
9950: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
9960: 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
9970: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
9980: 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29  FOR %s", zUsage)
9990: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
99a0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
99b0: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
99c0: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
99d0: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
99e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
99f0: 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f  Assign expressio
9a00: 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e  n b to lvalue a.
9a10: 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70   A second, no-op
9a20: 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  , version of thi
9a30: 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72  s macro.** is pr
9a40: 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49  ovided when SQLI
9a50: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
9a60: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
9a70: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65   allows the code
9a80: 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65  .** in sqlite3Se
9a90: 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e  lect() to assign
9aa0: 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63   values to struc
9ab0: 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69  ture member vari
9ac0: 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e  ables that.** on
9ad0: 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49  ly exist if SQLI
9ae0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
9af0: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77  is not defined w
9b00: 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67  ithout polluting
9b10: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
9b20: 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74  h #ifndef direct
9b30: 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e  ives..*/.# defin
9b40: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
9b50: 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a  ger(a, b) a = b.
9b60: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
9b70: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
9b80: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
9b90: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
9ba0: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
9bb0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
9bc0: 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78  y,z).# define ex
9bd0: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
9be0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y,z).#endif..#if
9bf0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9c00: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26  _OMIT_EXPLAIN) &
9c10: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
9c20: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9c30: 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e  SELECT)./*.** Un
9c40: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
9c50: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
9c60: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
9c70: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
9c80: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
9c90: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
9ca0: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
9cb0: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
9cc0: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
9cd0: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
9ce0: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e  caption is of on
9cf0: 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72  e of the two for
9d00: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d  ms:.**.**   "COM
9d10: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
9d20: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
9d30: 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f  2 (op)".**   "CO
9d40: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
9d50: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
9d60: 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  b2 USING TEMP B-
9d70: 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a  TREE (op)".**.**
9d80: 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64   where iSub1 and
9d90: 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69   iSub2 are the i
9da0: 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61  ntegers passed a
9db0: 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
9dc0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
9dd0: 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20  parameters, and 
9de0: 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72  op is the text r
9df0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
9e00: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a   the parameter.*
9e10: 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  * of the same na
9e20: 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  me. The paramete
9e30: 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f  r "op" must be o
9e40: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
9e50: 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b  TK_EXCEPT,.** TK
9e60: 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b  _INTERSECT or TK
9e70: 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20  _ALL. The first 
9e80: 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20  form is used if 
9e90: 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70  argument bUseTmp
9ea0: 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f   is .** false, o
9eb0: 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  r the second for
9ec0: 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e  m if it is true.
9ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9ee0: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
9ef0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9f00: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9f10: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
9f20: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
9f30: 2c 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 20 2f 2a 20 4f 6e 65            /* One
9f50: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
9f60: 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a  _EXCEPT etc. */.
9f70: 20 20 69 6e 74 20 69 53 75 62 31 2c 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 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
9fa0: 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62   1 */.  int iSub
9fb0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
9fc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
9fd0: 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e  ery id 2 */.  in
9fe0: 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20  t bUseTmp       
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a000: 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20   True if a temp 
a010: 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a  table was used *
a020: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f  /.){.  assert( o
a030: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f  p==TK_UNION || o
a040: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
a050: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
a060: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   || op==TK_ALL )
a070: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
a080: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
a090: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a0a0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
a0b0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
a0c0: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
a0d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
a0e0: 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45  "COMPOUND SUBQUE
a0f0: 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25  RIES %d AND %d %
a100: 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69  s(%s)", iSub1, i
a110: 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55  Sub2,.        bU
a120: 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d  seTmp?"USING TEM
a130: 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73  P B-TREE ":"", s
a140: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a  electOpName(op).
a150: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
a160: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a170: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
a180: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
a190: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
a1a0: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
a1b0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
a1c0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
a1d0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
a1e0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
a1f0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
a200: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77  ainComposite(v,w
a210: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
a220: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
a230: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
a240: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
a250: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
a260: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
a270: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
a280: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
a290: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
a2a0: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
a2b0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
a2c0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
a2d0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
a2e0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
a2f0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
a300: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
a310: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
a320: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
a330: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
a340: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
a350: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
a360: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a370: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
a380: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
a390: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a3a0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
a3b0: 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72  Sort,   /* Infor
a3c0: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52  mation on the OR
a3d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
a3e0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
a3f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a400: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
a410: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
a420: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
a430: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
a440: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
a450: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a460: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a480: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
a490: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
a4a0: 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53  t addrBreak = pS
a4b0: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20  ort->labelDone; 
a4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
a4d0: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
a4e0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
a4f0: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  drContinue = sql
a500: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
a510: 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68  l(v);  /* Jump h
a520: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
a530: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
a540: 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65  ;.  int addrOnce
a550: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
a560: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
a570: 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e  rderBy = pSort->
a580: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
a590: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
a5a0: 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72  Dest;.  int iPar
a5b0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
a5c0: 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  rm;.  int regRow
a5d0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  ;.  int regRowid
a5e0: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ;.  int nKey;.  
a5f0: 69 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20  int iSortTab;   
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 2f 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72  /* Sorter cursor
a620: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
a630: 0a 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61  .  int nSortData
a640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a650: 20 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76     /* Trailing v
a660: 61 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72  alues to read fr
a670: 6f 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69  om sorter */.  i
a680: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71  nt i;.  int bSeq
a690: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a6a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
a6b0: 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  if sorter record
a6c0: 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e   includes seq. n
a6d0: 6f 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  o. */.#ifdef SQL
a6e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
a6f0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74  IN_COMMENTS.  st
a700: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
a710: 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e  em *aOutEx = p->
a720: 70 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69  pEList->a;.#endi
a730: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  f..  assert( add
a740: 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66  rBreak<0 );.  if
a750: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
a760: 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
a770: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a780: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
a790: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
a7a0: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
a7b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
a7c0: 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b  oto(v, addrBreak
a7d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a7e0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
a7f0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
a800: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62  Out);.  }.  iTab
a810: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
a820: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
a830: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
a840: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
a850: 69 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  ine ){.    regRo
a860: 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67  wid = 0;.    reg
a870: 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  Row = pDest->iSd
a880: 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74  st;.    nSortDat
a890: 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  a = nColumn;.  }
a8a0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
a8b0: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
a8c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a8d0: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c      regRow = sql
a8e0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a8f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72  Parse);.    nSor
a900: 74 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  tData = 1;.  }. 
a910: 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79   nKey = pOrderBy
a920: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
a930: 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70  >nOBSat;.  if( p
a940: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
a950: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
a960: 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rter ){.    int 
a970: 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70  regSortOut = ++p
a980: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
a990: 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72   iSortTab = pPar
a9a0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
a9b0: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
a9c0: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61  BkOut ){.      a
a9d0: 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65  ddrOnce = sqlite
a9e0: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
a9f0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
aa00: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
aa10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
aa20: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
aa30: 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53  , iSortTab, regS
aa40: 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e  ortOut, nKey+1+n
aa50: 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69  SortData);.    i
aa60: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
aa70: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
aa80: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
aa90: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
aaa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
aab0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
aac0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
aad0: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
aae0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
aaf0: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
ab00: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
ab10: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
ab20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ab30: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
ab40: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
ab50: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
ab60: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
ab70: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
ab80: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
ab90: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
aba0: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
abb0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
abc0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
abd0: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
abe0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
abf0: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
ac00: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
ac10: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
ac20: 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69  ; i<nSortData; i
ac30: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
ac40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ac50: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
ac60: 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20  b, nKey+bSeq+i, 
ac70: 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56  regRow+i);.    V
ac80: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ac90: 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  %s", aOutEx[i].z
aca0: 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d  Name ? aOutEx[i]
acb0: 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b  .zName : aOutEx[
acc0: 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a  i].zSpan));.  }.
acd0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
ace0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
acf0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
ad00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ad10: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
ad20: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
ad30: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
ad40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ad50: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
ad60: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
ad70: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
ad80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
ad90: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
ada0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
adb0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
adc0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
add0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
ade0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
adf0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
ae00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ae10: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
ae20: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
ae30: 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  Row, 1, regRowid
ae40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ae50: 20 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74            &pDest
ae60: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
ae70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ae80: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
ae90: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
aea0: 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ow, 1);.      sq
aeb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aec0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
aed0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
aee0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
aef0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
af00: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
af10: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
af20: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
af30: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
af40: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
af50: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
af60: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
af70: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
af80: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
af90: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
afa0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
afb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
afc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
afd0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
afe0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
aff0: 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20  routine ); .    
b000: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
b010: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
b020: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b030: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
b040: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69  utine );.      i
b050: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
b060: 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
b070: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b080: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
b090: 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  w, pDest->iSdst,
b0a0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
b0b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
b0c0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
b0d0: 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d  e(pParse, pDest-
b0e0: 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  >iSdst, nColumn)
b0f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b110: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
b120: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
b130: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
b140: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b150: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52  }.  }.  if( regR
b160: 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  owid ){.    sqli
b170: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b180: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
b190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
b1a0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
b1b0: 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  rse, regRowid);.
b1c0: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74    }.  /* The bot
b1d0: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
b1e0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
b1f0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
b200: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
b210: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
b220: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
b230: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
b240: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b250: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
b260: 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  erNext, iTab, ad
b270: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
b280: 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(v);.  }else{. 
b290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b2a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
b2b0: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
b2c0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b2d0: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
b2e0: 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69  regReturn ) sqli
b2f0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b300: 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72   OP_Return, pSor
b310: 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  t->regReturn);. 
b320: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
b330: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
b340: 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Break);.}../*.**
b350: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
b360: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
b370: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
b380: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
b390: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
b3a0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
b3b0: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
b3c0: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
b3d0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
b3e0: 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f  *.** Also try to
b3f0: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69   estimate the si
b400: 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ze of the return
b410: 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74  ed value and ret
b420: 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  urn that.** resu
b430: 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68  lt in *pEstWidth
b440: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
b450: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
b460: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
b470: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
b480: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
b490: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
b4a0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b4b0: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
b4c0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
b4d0: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
b4e0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
b4f0: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
b500: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
b510: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
b520: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
b530: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
b540: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
b550: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
b560: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
b570: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
b580: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
b590: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
b5a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b5b0: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
b5c0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
b5d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
b5e0: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
b5f0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
b600: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
b610: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
b620: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
b630: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
b640: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
b650: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
b660: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
b670: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
b680: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
b690: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
b6a0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
b6b0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
b6c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b6d0: 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33  ine has either 3
b6e0: 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73   or 6 parameters
b6f0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
b700: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
b710: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
b720: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b730: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  A compile-time o
b740: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
b750: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
b760: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b770: 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20  TADATA.# define 
b780: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
b790: 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79  ,D,E,F) columnTy
b7a0: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
b7b0: 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ,F).#else /* if 
b7c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b7d0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b7e0: 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66  TADATA) */.# def
b7f0: 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41  ine columnType(A
b800: 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75  ,B,C,D,E,F) colu
b810: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46  mnTypeImpl(A,B,F
b820: 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
b830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
b840: 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61  mnTypeImpl(.  Na
b850: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
b860: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
b870: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b880: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b890: 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68 61  DATA.  const cha
b8a0: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
b8b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
b8c0: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
b8d0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
b8e0: 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a 70  ,.#endif.  u8 *p
b8f0: 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68  EstWidth.){.  ch
b900: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
b910: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
b920: 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b  u8 estWidth = 1;
b930: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b940: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b950: 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e  ADATA.  char con
b960: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
b970: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b980: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
b990: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
b9a0: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Col = 0;.#endif.
b9b0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
b9c0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b9d0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
b9e0: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
b9f0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
ba00: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
ba10: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
ba20: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
ba30: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
ba40: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
ba50: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
ba60: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
ba70: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
ba80: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
ba90: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
baa0: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
bab0: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
bac0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
bad0: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
bae0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
baf0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
bb00: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
bb10: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
bb20: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
bb30: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
bb40: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
bb50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
bb60: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
bb70: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
bb80: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
bb90: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
bba0: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
bbb0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
bbc0: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74   pTab */.      t
bbd0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
bbe0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
bbf0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
bc00: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
bc10: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
bc20: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
bc30: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
bc40: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
bc50: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
bc60: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
bc70: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
bc80: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
bc90: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
bca0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
bcb0: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
bcc0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
bcd0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
bce0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
bcf0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
bd00: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
bd10: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
bd20: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
bd30: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
bd40: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
bd50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
bd60: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
bd70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
bd80: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
bd90: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
bda0: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
bdb0: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
bdc0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
bdd0: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
bde0: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
bdf0: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
be00: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
be10: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
be20: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
be30: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
be40: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
be50: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
be60: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
be70: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
be80: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
be90: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
bea0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
beb0: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
bec0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
bed0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
bee0: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
bef0: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
bf00: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
bf10: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
bf20: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
bf30: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
bf40: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
bf50: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
bf60: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
bf70: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
bf80: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
bf90: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
bfa0: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
bfb0: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
bfc0: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
bfd0: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
bfe0: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
bff0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
c000: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
c010: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
c020: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
c030: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
c040: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
c050: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
c060: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
c070: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
c080: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
c090: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
c0a0: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
c0b0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
c0c0: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
c0d0: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
c0e0: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
c0f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c100: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
c110: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
c120: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
c130: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
c140: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
c150: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
c160: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
c170: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
c180: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
c190: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
c1a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
c1b0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
c1c0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
c1d0: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
c1e0: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
c1f0: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
c200: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
c210: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
c220: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
c230: 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  >=0 && ALWAYS(iC
c240: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
c250: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
c260: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
c270: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
c280: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
c290: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
c2a0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
c2b0: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
c2c0: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
c2d0: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
c2e0: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
c2f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
c300: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
c310: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
c320: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
c330: 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
c340: 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 41 4c         ** The AL
c350: 57 41 59 53 28 29 20 69 73 20 62 65 63 61 75 73  WAYS() is becaus
c360: 65 20 69 43 6f 6c 3e 3d 70 53 2d 3e 70 45 4c 69  e iCol>=pS->pELi
c370: 73 74 2d 3e 6e 45 78 70 72 20 77 69 6c 6c 20 68  st->nExpr will h
c380: 61 76 65 20 62 65 65 6e 0a 20 20 20 20 20 20 20  ave been.       
c390: 20 20 20 2a 2a 20 63 61 75 67 68 74 20 61 6c 72     ** caught alr
c3a0: 65 61 64 79 20 62 79 20 6e 61 6d 65 20 72 65 73  eady by name res
c3b0: 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  olution..       
c3c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
c3d0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
c3e0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
c3f0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
c400: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
c410: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
c420: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
c430: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
c440: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
c450: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
c460: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
c470: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
c480: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
c490: 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c  sNC, p,&zOrigDb,
c4a0: 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67  &zOrigTab,&zOrig
c4b0: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
c4c0: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
c4d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
c4e0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
c4f0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
c500: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
c510: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
c520: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
c530: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
c540: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
c550: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
c560: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
c570: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
c580: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
c590: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c5a0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20  METADATA.       
c5b0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
c5c0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c5d0: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
c5e0: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
c5f0: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
c600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c610: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
c620: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
c630: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e;.          zOr
c640: 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  igCol = pTab->aC
c650: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
c660: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
c670: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
c680: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
c690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
c6a0: 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e  OrigTab = pTab->
c6b0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
c6c0: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
c6d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
c6e0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
c6f0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
c700: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
c710: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
c720: 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20        zOrigDb = 
c730: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
c740: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
c750: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  .        }.#else
c760: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c770: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
c780: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
c790: 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  R";.        }els
c7a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
c7b0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
c7c0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
c7d0: 20 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20         estWidth 
c7e0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c7f0: 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20  l].szEst;.      
c800: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
c810: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c820: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
c830: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c840: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
c850: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
c860: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
c870: 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
c880: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
c890: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
c8a0: 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69  d.      ** origi
c8b0: 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73  n info for the s
c8c0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
c8d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
c8e0: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  f the SELECT.   
c8f0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e     ** statement.
c900: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c910: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
c920: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
c930: 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  S = pExpr->x.pSe
c940: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
c950: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
c960: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
c970: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
c980: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
c990: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
c9a0: 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53   );.      sNC.pS
c9b0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
c9c0: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
c9d0: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
c9e0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
c9f0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
ca00: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
ca10: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
ca20: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
ca30: 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74   &zOrigCol, &est
ca40: 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 62  Width); .      b
ca50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
ca60: 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  if.  }..#ifdef S
ca70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
ca80: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20  UMN_METADATA  . 
ca90: 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b   if( pzOrigDb ){
caa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f  .    assert( pzO
cab0: 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67  rigTab && pzOrig
cac0: 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72  Col );.    *pzOr
cad0: 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a  igDb = zOrigDb;.
cae0: 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d      *pzOrigTab =
caf0: 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a   zOrigTab;.    *
cb00: 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69  pzOrigCol = zOri
cb10: 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gCol;.  }.#endif
cb20: 0a 20 20 69 66 28 20 70 45 73 74 57 69 64 74 68  .  if( pEstWidth
cb30: 20 29 20 2a 70 45 73 74 57 69 64 74 68 20 3d 20   ) *pEstWidth = 
cb40: 65 73 74 57 69 64 74 68 3b 0a 20 20 72 65 74 75  estWidth;.  retu
cb50: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
cb60: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cb70: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
cb80: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
cb90: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
cba0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
cbb0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
cbc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
cbd0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
cbe0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
cbf0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
cc00: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
cc10: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
cc20: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
cc30: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
cc40: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
cc50: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
cc60: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
cc70: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  lt set */.){.#if
cc80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cc90: 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65  _DECLTYPE.  Vdbe
cca0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
ccb0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
ccc0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
ccd0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
cce0: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e  = pTabList;.  sN
ccf0: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
cd00: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
cd10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
cd20: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
cd30: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
cd40: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
cd50: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69   char *zType;.#i
cd60: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cd70: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
cd80: 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  TA.    const cha
cd90: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
cda0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cdb0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
cdc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
cdd0: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
cde0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
cdf0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
ce00: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
ce10: 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a   &zOrigCol, 0);.
ce20: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
ce30: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
ce40: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
ce50: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
ce60: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
ce70: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
ce80: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
ce90: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
cea0: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
ceb0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
cec0: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
ced0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
cee0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
cef0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
cf00: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
cf10: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
cf20: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
cf30: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
cf40: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41  v, i, COLNAME_TA
cf50: 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53  BLE, zOrigTab, S
cf60: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cf70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cf80: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cf90: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
cfa0: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49  , zOrigCol, SQLI
cfb0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
cfc0: 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d  else.    zType =
cfd0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
cfe0: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , p, 0, 0, 0, 0)
cff0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
d000: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d010: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d020: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
d030: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d040: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
d050: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
d060: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
d070: 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ) */.}../*.** Ge
d080: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
d090: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
d0a0: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
d0b0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
d0c0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
d0d0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
d0e0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
d0f0: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
d100: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
d110: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
d120: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
d130: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
d140: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d150: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
d160: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
d170: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
d180: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
d190: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
d1a0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
d1b0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
d1c0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
d1d0: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
d1e0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d1f0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
d200: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d210: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
d220: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
d230: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
d240: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
d250: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
d260: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
d270: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
d280: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
d290: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
d2a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
d2b0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  if..  if( pParse
d2c0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
d2d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d2e0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
d2f0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
d300: 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
d310: 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  !=0 );.  pParse-
d320: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
d330: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
d340: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d350: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
d360: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
d370: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
d380: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
d390: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
d3a0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
d3b0: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
d3c0: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
d3d0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d3e0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d3f0: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
d400: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d410: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d420: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
d430: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d440: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
d450: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d460: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
d470: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
d480: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d490: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d4a0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d4b0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d4c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d4d0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
d4e0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47   || p->op==TK_AG
d4f0: 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
d500: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
d510: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
d520: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
d530: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
d540: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57      for(j=0; ALW
d550: 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  AYS(j<pTabList->
d560: 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nSrc); j++){.   
d570: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
d580: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d  t->a[j].iCursor=
d590: 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65  =p->iTable ) bre
d5a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
d5b0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
d5c0: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
d5d0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
d5e0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
d5f0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
d600: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
d610: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
d620: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
d630: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
d640: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
d650: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
d660: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
d670: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
d680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d690: 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
d6a0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
d6b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d6c0: 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  f( !shortNames &
d6d0: 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  & !fullNames ){.
d6e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d6f0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d700: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d710: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
d720: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
d730: 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  b, pEList->a[i].
d740: 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44  zSpan), SQLITE_D
d750: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
d760: 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d  else if( fullNam
d770: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  es ){.        ch
d780: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
d790: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
d7a0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d7b0: 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
d7c0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20  >zName, zCol);. 
d7d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d7e0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d7f0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d800: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44   zName, SQLITE_D
d810: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
d820: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d830: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d840: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d850: 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51  E_NAME, zCol, SQ
d860: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
d870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d880: 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
d890: 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74  char *z = pEList
d8a0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20  ->a[i].zSpan;.  
d8b0: 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73      z = z==0 ? s
d8c0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d8d0: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
d8e0: 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74  1) : sqlite3DbSt
d8f0: 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20  rDup(db, z);.   
d900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d910: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d920: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20  OLNAME_NAME, z, 
d930: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
d940: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
d950: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
d960: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
d970: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  t, pEList);.}../
d980: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
d990: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77  pression list (w
d9a0: 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74  hich is really t
d9b0: 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
d9c0: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66  ssions.** that f
d9d0: 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73  orm the result s
d9e0: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  et of a SELECT s
d9f0: 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74  tatement) comput
da00: 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
da10: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
da20: 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77  r a table that w
da30: 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78  ould hold the ex
da40: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
da50: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20  *.** All column 
da60: 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e  names will be un
da70: 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ique..**.** Only
da80: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
da90: 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20  s are computed. 
daa0: 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43   Column.zType, C
dab0: 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20  olumn.zColl,.** 
dac0: 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
dad0: 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a   of Column are z
dae0: 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  eroed..**.** Ret
daf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
db00: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20   success.  If a 
db10: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
db20: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
db30: 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e  ** store NULL in
db40: 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e   *paCol and 0 in
db50: 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75   *pnCol and retu
db60: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
db70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
db80: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
db90: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
dba0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
dbb0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
dbc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
dbd0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
dbe0: 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20   Expr list from 
dbf0: 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20  which to derive 
dc00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
dc10: 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20    i16 *pnCol,   
dc20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
dc30: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
dc40: 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f   columns here */
dc50: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f  .  Column **paCo
dc60: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
dc70: 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ite the new colu
dc80: 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a  mn list here */.
dc90: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
dca0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
dcb0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
dcc0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
dcd0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
dce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
dcf0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75   counters */.  u
dd00: 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  32 cnt;         
dd10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
dd20: 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b  dex added to mak
dd30: 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75  e the name uniqu
dd40: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  e */.  Column *a
dd50: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20  Col, *pCol;     
dd60: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
dd70: 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f  g over result co
dd80: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
dd90: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
dda0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ddb0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
ddc0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
ddd0: 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20  .  Expr *p;     
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ddf0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
de00: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
de10: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
de20: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
de30: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
de40: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  mn name */.  int
de50: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
de60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
de70: 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d   of name in zNam
de80: 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74  e[] */.  Hash ht
de90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dea0: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
deb0: 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  le of column nam
dec0: 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  es */..  sqlite3
ded0: 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20  HashInit(&ht);. 
dee0: 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
def0: 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74     nCol = pEList
df00: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f  ->nExpr;.    aCo
df10: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
df20: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
df30: 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
df40: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
df50: 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65   aCol==0 );.  }e
df60: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
df70: 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
df80: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
df90: 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29  Col==(i16)nCol )
dfa0: 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  ;.  *pnCol = nCo
dfb0: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
dfc0: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
dfd0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
dfe0: 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  l && !db->malloc
dff0: 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f  Failed; i++, pCo
e000: 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
e010: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
e020: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
e030: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  umn.    */.    p
e040: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
e050: 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74  ipCollate(pEList
e060: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
e070: 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
e080: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
e090: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
e0a0: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
e0b0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53   contains an "AS
e0c0: 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c   <name>" phrase,
e0d0: 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74   use <name> as t
e0e0: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d  he name */.    }
e0f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
e100: 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20   *pColExpr = p; 
e110: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
e120: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72  on that is the r
e130: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
e140: 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
e150: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
e160: 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61  /* Table associa
e170: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78  ted with this ex
e180: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
e190: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
e1a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
e1b0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
e1c0: 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
e1d0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
e1e0: 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
e1f0: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
e200: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
e210: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
e220: 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70  & ALWAYS(pColExp
e230: 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  r->pTab!=0) ){. 
e240: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
e250: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
e260: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
e270: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
e280: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
e290: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
e2a0: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
e2b0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
e2c0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
e2d0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
e2e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
e2f0: 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
e300: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
e310: 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
e320: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
e330: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
e340: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
e350: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
e360: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
e370: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
e380: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
e390: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
e3a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e3b0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
e3c0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
e3d0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
e3e0: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
e3f0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
e400: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
e410: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
e420: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e    }.    }.    zN
e430: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
e440: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 7a  intf(db, "%s", z
e450: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  Name);..    /* M
e460: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
e470: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
e480: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
e490: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
e4a0: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
e4b0: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
e4c0: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
e4d0: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
e4e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
e4f0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
e500: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
e510: 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
e520: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
e530: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
e540: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
e550: 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
e560: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
e570: 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
e580: 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
e590: 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
e5a0: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
e5b0: 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
e5c0: 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
e5d0: 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
e5e0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e5f0: 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
e600: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
e610: 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
e620: 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
e630: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
e640: 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
e650: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
e660: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
e670: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
e680: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
e690: 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
e6a0: 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
e6b0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
e6c0: 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
e6d0: 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
e6e0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
e6f0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
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 5f 42 4b 50 54  QLITE_NOMEM_BKPT
e7d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e7e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e7f0: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
e800: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
e810: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
e820: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
e830: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
e840: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
e850: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
e860: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
e870: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
e880: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
e890: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
e8a0: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
e8b0: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
e8c0: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
e8d0: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
e8e0: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
e8f0: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
e900: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
e910: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e920: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
e930: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
e940: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
e950: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
e960: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61  resolved..*/.sta
e970: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
e980: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
e990: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
e9a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e9b0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e9c0: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
e9d0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
e9e0: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
e9f0: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
ea00: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
ea10: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
ea20: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
ea30: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
ea40: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
ea50: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
ea60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ea70: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
ea80: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
ea90: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
eaa0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
eab0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
eac0: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
ead0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
eae0: 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b    u64 szAll = 0;
eaf0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
eb00: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
eb10: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
eb20: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
eb30: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
eb40: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
eb50: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
eb60: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
eb70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
eb80: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
eb90: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
eba0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
ebb0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
ebc0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
ebd0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
ebe0: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
ebf0: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
ec00: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
ec10: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
ec20: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
ec30: 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e  ){.    p = a[i].
ec40: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
ec50: 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 7b  Col->zType==0 ){
ec60: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79  .      pCol->zTy
ec70: 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  pe = sqlite3DbSt
ec80: 72 44 75 70 28 64 62 2c 20 0a 20 20 20 20 20 20  rDup(db, .      
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e    columnType(&sN
ecb0: 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f  C, p,0,0,0, &pCo
ecc0: 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20  l->szEst));.    
ecd0: 7d 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70  }.    szAll += p
ece0: 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20  Col->szEst;.    
ecf0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
ed00: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
ed10: 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28  nity(p);.    if(
ed20: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
ed30: 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  =0 ) pCol->affin
ed40: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
ed50: 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c  _BLOB;.    pColl
ed60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
ed70: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
ed80: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
ed90: 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d  && pCol->zColl==
eda0: 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
edb0: 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
edc0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
edd0: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
ede0: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
edf0: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
ee00: 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b  LogEst(szAll*4);
ee10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
ee20: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
ee30: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
ee40: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
ee50: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
ee60: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
ee70: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
ee80: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
ee90: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
eea0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
eeb0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
eec0: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
eed0: 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
eee0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
eef0: 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b   int savedFlags;
ef00: 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d  ..  savedFlags =
ef10: 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62   db->flags;.  db
ef20: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
ef30: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b  TE_FullColNames;
ef40: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
ef50: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
ef60: 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53  ames;.  sqlite3S
ef70: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
ef80: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  , pSelect, 0);. 
ef90: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
efa0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
efb0: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
efc0: 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
efd0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
efe0: 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  or;.  db->flags 
eff0: 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20  = savedFlags;.  
f000: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
f010: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
f020: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
f030: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
f040: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f050: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69   }.  /* The sqli
f060: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
f070: 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75  lect() is only u
f080: 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77  sed n contexts w
f090: 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20  here lookaside. 
f0a0: 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20   ** is disabled 
f0b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
f0c0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
f0d0: 62 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e  ble );.  pTab->n
f0e0: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
f0f0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54  >zName = 0;.  pT
f100: 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
f110: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
f120: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
f130: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 73  (1048576) );.  s
f140: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
f150: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
f160: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  , pSelect->pELis
f170: 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
f180: 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
f190: 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
f1a0: 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
f1b0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
f1c0: 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
f1d0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
f1e0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f1f0: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
f200: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
f210: 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
f220: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
f230: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
f240: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
f250: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
f260: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
f270: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
f280: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
f290: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
f2a0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
f2b0: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
f2c0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
f2d0: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
f2e0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
f2f0: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
f300: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
f310: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
f320: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
f330: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
f340: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b  eCreate(pParse);
f350: 0a 20 20 20 20 69 66 28 20 76 20 29 20 73 71 6c  .    if( v ) sql
f360: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
f370: 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 20 20  , OP_Init);.    
f380: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
f390: 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20 20 26 26  level==0.     &&
f3a0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
f3b0: 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
f3c0: 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
f3d0: 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b 0a 20 20  Const).    ){.  
f3e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f      pParse->okCo
f3f0: 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20  nstFactor = 1;. 
f400: 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72 65 74 75     }..  }.  retu
f410: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
f420: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
f430: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
f440: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
f450: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
f460: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
f470: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
f480: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
f490: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
f4a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
f4b0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
f4c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
f4d0: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
f4e0: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
f4f0: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
f500: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
f510: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
f520: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
f530: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
f540: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
f550: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
f560: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
f570: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
f580: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
f590: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
f5a0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
f5b0: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
f5c0: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
f5d0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
f5e0: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
f5f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f600: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
f610: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
f620: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
f630: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
f640: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
f650: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
f660: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
f670: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
f680: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
f690: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
f6a0: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
f6b0: 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a  values (zero).**
f6c0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
f6d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
f6e0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65  **.** The iOffse
f6f0: 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69  t register (if i
f700: 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69  t exists) is ini
f710: 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
f720: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
f730: 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69  OFFSET.  The iLi
f740: 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20  mit register is 
f750: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
f760: 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a  IMIT.  Register.
f770: 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20  ** iOffset+1 is 
f780: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
f790: 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a  IMIT+OFFSET..**.
f7a0: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
f7b0: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
f7c0: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
f7d0: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
f7e0: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
f7f0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
f800: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
f810: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
f820: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
f830: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
f840: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
f850: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
f860: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
f870: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
f880: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
f890: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
f8a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
f8b0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
f8c0: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
f8d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
f8e0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
f8f0: 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  fset;.  int n;. 
f900: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
f910: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a   return;..  /* .
f920: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
f930: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
f940: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
f950: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
f960: 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  oversy about wha
f970: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
f980: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
f990: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
f9a0: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
f9b0: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
f9c0: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
f9d0: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
f9e0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
f9f0: 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
fa00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
fa10: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d  pOffset==0 || p-
fa20: 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >pLimit!=0 );.  
fa30: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
fa40: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
fa50: 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
fa60: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
fa70: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
fa80: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
fa90: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
faa0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
fab0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
fac0: 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20  imit, &n) ){.   
fad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fae0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
faf0: 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a  er, n, iLimit);.
fb00: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
fb10: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
fb20: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69  nter"));.      i
fb30: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
fb40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
fb50: 74 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  to(v, iBreak);. 
fb60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
fb70: 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  >=0 && p->nSelec
fb80: 74 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45  tRow>sqlite3LogE
fb90: 73 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20  st((u64)n) ){.  
fba0: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
fbb0: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
fbc0: 45 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20  Est((u64)n);.   
fbd0: 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
fbe0: 20 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69   |= SF_FixedLimi
fbf0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
fc00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
fc10: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
fc20: 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69  se, p->pLimit, i
fc30: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
fc40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fc50: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
fc60: 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f   iLimit); VdbeCo
fc70: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
fc80: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fc90: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
fca0: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
fcb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fcc0: 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c  P_IfNot, iLimit,
fcd0: 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
fce0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
fcf0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  .    if( p->pOff
fd00: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
fd10: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
fd20: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
fd30: 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
fd40: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
fd50: 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
fd60: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
fd70: 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
fd80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
fd90: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
fda0: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
fdb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fdc0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fdd0: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
fde0: 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
fdf0: 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
fe00: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
fe10: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
fe20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fe30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66  eAddOp3(v, OP_Of
fe40: 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  fsetLimit, iLimi
fe50: 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f  t, iOffset+1, iO
fe60: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
fe70: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
fe80: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
fe90: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
fea0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
feb0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
fec0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
fed0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
fee0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fef0: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
ff00: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
ff10: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
ff20: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
ff30: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
ff40: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
ff50: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
ff60: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
ff70: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
ff80: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
ff90: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ffa0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
ffb0: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
ffc0: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
ffd0: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
ffe0: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
fff0: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
10000 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
10010 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
10020 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
10030 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10040 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
10050 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
10060 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
10070 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
10080 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
10090 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
100a0 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
100b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
100c0 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
100d0 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
100e0 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74  ;.  /* iCol must
100f0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d   be less than p-
10100 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20  >pEList->nExpr. 
10110 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   Otherwise an er
10120 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68  ror would.  ** h
10130 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20  ave been thrown 
10140 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f  during name reso
10150 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f  lution and we wo
10160 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74  uld not have got
10170 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ten.  ** this fa
10180 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d  r */.  if( pRet=
10190 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
101a0 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
101b0 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20  pr) ){.    pRet 
101c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
101d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
101e0 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
101f0 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
10200 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
10210 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
10220 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
10230 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
10240 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
10250 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
10260 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
10270 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
10280 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
10290 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
102a0 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
102b0 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
102c0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
102d0 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
102e0 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
102f0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
10300 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
10310 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
10320 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
10330 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
10340 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
10350 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
10360 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
10370 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
10380 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
10390 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
103a0 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
103b0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
103c0 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
103d0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
103e0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
103f0 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
10400 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
10410 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
10420 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
10430 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
10440 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
10450 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
10460 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
10470 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
10480 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
10490 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
104a0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
104b0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
104c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
104d0 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
104e0 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
104f0 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
10500 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
10510 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
10520 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
10530 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
10540 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
10550 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
10560 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10570 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
10580 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
10590 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
105a0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
105b0 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
105c0 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
105d0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
105e0 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
105f0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
10600 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
10610 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
10620 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
10630 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
10640 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
10650 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
10660 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
10670 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
10680 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
10690 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
106a0 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
106b0 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
106c0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
106d0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
106e0 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
106f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
10700 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
10710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
10720 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10730 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
10740 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
10750 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
10760 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
10770 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
10780 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
10790 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
107a0 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
107b0 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
107c0 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
107d0 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
107f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
10800 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
10810 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10830 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
10860 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
10870 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
10880 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
10890 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
108a0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
108b0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
108c0 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
108d0 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67   SrcList->a[].fg
108e0 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
108f0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
10900 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
10910 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
10920 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
10930 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
10940 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
10950 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
10960 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
10970 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
10980 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
10990 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
109a0 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
109b0 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
109c0 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
109d0 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
109e0 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
109f0 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
10a00 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
10a10 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
10a20 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
10a30 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
10a40 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
10a50 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
10a60 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
10a70 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
10a80 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
10a90 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
10aa0 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
10ab0 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
10ac0 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
10ad0 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
10ae0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10af0 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
10b00 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
10b10 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
10b20 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
10b30 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
10b40 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
10b50 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
10b60 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
10b70 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
10b80 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
10b90 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
10ba0 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
10bb0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
10bc0 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
10bd0 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
10be0 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
10bf0 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
10c00 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
10c10 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
10c20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
10c30 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
10c40 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
10c50 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
10c60 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
10c70 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
10c80 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
10c90 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
10ca0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
10cb0 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
10cc0 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
10cd0 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
10ce0 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
10cf0 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
10d00 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
10d10 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
10d20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
10d30 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
10d40 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
10d50 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
10d60 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
10d70 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
10d80 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
10d90 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
10da0 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
10db0 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
10dc0 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
10dd0 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
10de0 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
10df0 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
10e00 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
10e10 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
10e20 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
10e30 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
10e40 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
10e50 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
10e60 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
10e70 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
10e80 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
10e90 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
10ea0 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
10eb0 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
10ec0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
10ed0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
10ee0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10ef0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10f10 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
10f20 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
10f30 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
10f40 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
10f50 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
10f60 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
10f70 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
10f80 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
10f90 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
10fa0 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
10fb0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
10fc0 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
10fd0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
10fe0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
10ff0 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
11000 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
11010 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
11020 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
11030 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
11040 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
11050 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
11060 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
11070 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
11080 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
11090 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
110c0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
110d0 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
110e0 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
110f0 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
11100 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
11110 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
11120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11130 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
11140 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
11150 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
11160 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
11170 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
11180 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
11190 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
111a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
111b0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
111c0 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
111d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
111e0 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
111f0 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
11200 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
11210 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
11220 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
11230 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
11240 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
11250 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
11260 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
11270 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
11280 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
11290 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
112b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
112c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
112f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11300 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
11310 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
11320 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
11330 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
11340 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
11350 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
11360 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
11370 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
11380 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
11390 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
113a0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
113b0 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
113c0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
113d0 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20   do a recursive 
113e0 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73  query */.  if( s
113f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
11400 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
11410 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20  ECURSIVE, 0, 0, 
11420 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
11430 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c  /* Process the L
11440 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
11450 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79  clauses, if they
11460 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72   exist */.  addr
11470 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
11480 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11490 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
114a0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
114b0 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
114c0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
114d0 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20  imit;.  pOffset 
114e0 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
114f0 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  regLimit = p->iL
11500 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65  imit;.  regOffse
11510 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
11520 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d    p->pLimit = p-
11530 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
11540 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  p->iLimit = p->i
11550 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f  Offset = 0;.  pO
11560 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
11570 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  erBy;..  /* Loca
11580 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
11590 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72  mber of the Curr
115a0 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ent table */.  f
115b0 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
115c0 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b  <pSrc->nSrc); i+
115d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63  +){.    if( pSrc
115e0 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75  ->a[i].fg.isRecu
115f0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
11600 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e  Current = pSrc->
11610 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
11620 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
11640 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62  ate cursors numb
11650 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e  ers for Queue an
11660 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65  d Distinct.  The
11670 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
11680 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74  or.  ** the Dist
11690 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20  inct table must 
116a0 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67  be exactly one g
116b0 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75  reater than Queu
116c0 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20  e in order.  ** 
116d0 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74  for the SRT_Dist
116e0 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73  Fifo and SRT_Dis
116f0 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69  tQueue destinati
11700 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a  ons to work. */.
11710 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73    iQueue = pPars
11720 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28  e->nTab++;.  if(
11730 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
11740 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20   ){.    eDest = 
11750 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44  pOrderBy ? SRT_D
11760 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44  istQueue : SRT_D
11770 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69  istFifo;.    iDi
11780 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
11790 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
117a0 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
117b0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65  rderBy ? SRT_Que
117c0 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20  ue : SRT_Fifo;. 
117d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
117e0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
117f0 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51  Queue, eDest, iQ
11800 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ueue);..  /* All
11810 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f  ocate cursors fo
11820 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65  r Current, Queue
11830 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20  , and Distinct. 
11840 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20  */.  regCurrent 
11850 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11860 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11870 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
11880 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74  Pseudo, iCurrent
11890 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43  , regCurrent, nC
118a0 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ol);.  if( pOrde
118b0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
118c0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d  fo *pKeyInfo = m
118d0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
118e0 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
118f0 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   p, 1);.    sqli
11900 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11910 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
11920 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  l, iQueue, pOrde
11930 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
11940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11950 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
11960 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
11970 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65  FO);.    destQue
11980 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  ue.pOrderBy = pO
11990 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b  rderBy;.  }else{
119a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
119b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
119c0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
119d0 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20  ue, nCol);.  }. 
119e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
119f0 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29   "Queue table"))
11a00 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63  ;.  if( iDistinc
11a10 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72  t ){.    p->addr
11a20 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71  OpenEphm[0] = sq
11a30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11a40 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
11a50 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20  ral, iDistinct, 
11a60 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  0);.    p->selFl
11a70 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
11a80 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20  hemeral;.  }..  
11a90 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52  /* Detach the OR
11aa0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
11ab0 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  om the compound 
11ac0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70  SELECT */.  p->p
11ad0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
11ae0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
11af0 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75  ults of the setu
11b00 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65  p-query in Queue
11b10 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70  . */.  pSetup->p
11b20 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Next = 0;.  rc =
11b30 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11b40 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26  Parse, pSetup, &
11b50 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53  destQueue);.  pS
11b60 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  etup->pNext = p;
11b70 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
11b80 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76   end_of_recursiv
11b90 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46  e_query;..  /* F
11ba0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  ind the next row
11bb0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e   in the Queue an
11bc0 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f  d output that ro
11bd0 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  w */.  addrTop =
11be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11bf0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
11c00 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65   iQueue, addrBre
11c10 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
11c20 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  e(v);..  /* Tran
11c30 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f  sfer the next ro
11c40 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20  w in Queue over 
11c50 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  to Current */.  
11c60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11c70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
11c80 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54   iCurrent); /* T
11c90 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63  o reset column c
11ca0 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ache */.  if( pO
11cb0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
11cc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11cd0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51  v, OP_Column, iQ
11ce0 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
11cf0 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72  nExpr+1, regCurr
11d00 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
11d10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11d20 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
11d30 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43  ta, iQueue, regC
11d40 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  urrent);.  }.  s
11d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11d60 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
11d70 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75  Queue);..  /* Ou
11d80 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20  tput the single 
11d90 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a  row in Current *
11da0 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  /.  addrCont = s
11db0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11dc0 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66  bel(v);.  codeOf
11dd0 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65  fset(v, regOffse
11de0 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  t, addrCont);.  
11df0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
11e00 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
11e10 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a  List, iCurrent,.
11e20 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
11e30 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
11e40 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72  rBreak);.  if( r
11e50 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  egLimit ){.    s
11e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11e70 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
11e80 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61  ero, regLimit, a
11e90 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56  ddrBreak);.    V
11ea0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
11eb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
11ec0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
11ed0 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f   addrCont);..  /
11ee0 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72 65  * Execute the re
11ef0 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
11f00 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65  aking the single
11f10 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
11f20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  as.  ** the valu
11f30 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72 73  e for the recurs
11f40 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65  ive-table. Store
11f50 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
11f60 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a  the Queue..  */.
11f70 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
11f80 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
11f90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11fa0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11fb0 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72 65  "recursive aggre
11fc0 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74  gate queries not
11fd0 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
11fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50  }else{.    p->pP
11ff0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 71  rior = 0;.    sq
12000 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12010 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75  se, p, &destQueu
12020 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
12030 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  p->pPrior==0 );.
12040 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
12050 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  pSetup;.  }..  /
12060 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74  * Keep running t
12070 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68  he loop until th
12080 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79  e Queue is empty
12090 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
120a0 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
120b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
120c0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
120d0 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64  addrBreak);..end
120e0 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
120f0 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ery:.  sqlite3Ex
12100 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
12110 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64  rse->db, p->pOrd
12120 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64  erBy);.  p->pOrd
12130 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
12140 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
12150 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66  Limit;.  p->pOff
12160 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
12170 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
12180 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12190 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  _CTE */../* Forw
121a0 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
121b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
121c0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
121d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
121e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
121f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
12200 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
12210 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
12220 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
12230 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
12240 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12250 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
12260 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
12270 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
12280 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20  ;../*.** Handle 
12290 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
122a0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   of a compound-s
122b0 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
122c0 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20  nates from a.** 
122d0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20  VALUES clause.  
122e0 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73  By handling this
122f0 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
12300 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65  se, we avoid dee
12310 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20  p.** recursion, 
12320 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20  and thus do not 
12330 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20  need to enforce 
12340 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  the SQLITE_LIMIT
12350 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
12360 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20  .** on a VALUES 
12370 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  clause..**.** Be
12380 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63 74  cause the Select
12390 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74   object originat
123a0 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53  es from a VALUES
123b0 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31   clause:.**   (1
123c0 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d 49  ) It has no LIMI
123d0 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20 20  T or OFFSET.**  
123e0 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61   (2) All terms a
123f0 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20  re UNION ALL.** 
12400 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e    (3) There is n
12410 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
12420 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
12430 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
12440 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
12450 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
12460 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12470 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
12480 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12490 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
124a0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
124b0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
124c0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
124d0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
124e0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
124f0 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50  .){.  Select *pP
12500 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 52 6f 77  rior;.  int nRow
12510 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 1;.  int rc =
12520 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   0;.  assert( p-
12530 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
12540 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20 64  ultiValue );.  d
12550 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o{.    assert( p
12560 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
12570 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61 73  Values );.    as
12580 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
12590 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54  ALL || (p->op==T
125a0 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e 70  K_SELECT && p->p
125b0 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20  Prior==0) );.   
125c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
125d0 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  it==0 );.    ass
125e0 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
125f0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
12600 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c  ( p->pNext==0 ||
12610 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
12620 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c  r==p->pNext->pEL
12630 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
12640 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
12650 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12660 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
12670 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20  r->pNext==p );. 
12680 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72     p = p->pPrior
12690 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
126a0 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77 68 69  }while(1);.  whi
126b0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70 50 72  le( p ){.    pPr
126c0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
126d0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
126e0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
126f0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
12700 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
12710 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
12720 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 72 63  rior;.    if( rc
12730 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
12740 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52  >nSelectRow = nR
12750 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  ow;.    p = p->p
12760 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
12770 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12780 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12790 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
127a0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
127b0 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
127c0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
127d0 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
127e0 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
127f0 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
12800 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
12810 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
12820 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
12830 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
12840 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
12850 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
12860 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
12870 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
12880 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
12890 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
128a0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
128b0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
128c0 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
128d0 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
128e0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
128f0 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
12900 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
12910 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
12920 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
12930 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
12940 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
12950 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
12960 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
12970 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
12980 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
12990 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
129a0 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
129b0 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
129c0 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
129d0 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
129e0 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
129f0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
12a00 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
12a10 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
12a20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
12a30 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
12a40 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
12a50 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
12a60 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
12a70 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
12a80 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
12a90 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
12aa0 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
12ab0 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
12ac0 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
12ad0 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
12ae0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
12af0 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
12b00 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
12b10 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
12b20 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
12b30 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
12b40 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
12b50 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
12b60 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
12b70 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
12b80 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
12b90 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
12ba0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
12bb0 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
12bc0 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
12bd0 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
12be0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
12bf0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
12c00 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12c10 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12c20 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12c40 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
12c50 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
12c60 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
12c70 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12c80 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12c90 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12ca0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12cb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
12cc0 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
12cd0 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
12ce0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
12cf0 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
12d00 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
12d10 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
12d20 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
12d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12d40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12d50 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
12d60 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
12d70 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
12d80 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
12d90 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
12da0 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
12db0 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
12dc0 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
12dd0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
12de0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
12df0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
12e00 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
12e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12e20 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
12e30 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub1 = 0;       
12e40 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
12e50 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
12e60 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30  .  int iSub2 = 0
12e70 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
12e80 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
12e90 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
12ea0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
12eb0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
12ec0 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
12ed0 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
12ee0 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
12ef0 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
12f00 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
12f10 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
12f20 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
12f30 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
12f40 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
12f50 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
12f60 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
12f70 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
12f80 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
12f90 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
12fa0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
12fb0 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
12fc0 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
12fd0 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
12fe0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
12ff0 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
13000 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
13010 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
13020 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
13030 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13040 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
13050 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
13060 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
13070 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
13080 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
13090 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
130a0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
130b0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
130c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
130d0 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
130e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
130f0 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
13100 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
13110 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
13120 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
13130 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
13140 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
13150 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
13160 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
13170 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13180 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13190 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
131a0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
131b0 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
131c0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
131d0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
131e0 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
131f0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13200 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
13210 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
13220 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
13230 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
13240 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
13250 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13260 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
13270 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53  hemeral, dest.iS
13280 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  DParm, p->pEList
13290 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->nExpr);.    sq
132a0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
132b0 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
132c0 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74 2e  ERED);.    dest.
132d0 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
132e0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  e;.  }..  /* Spe
132f0 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f  cial handling fo
13300 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  r a compound-sel
13310 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ect that origina
13320 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53 20  tes as a VALUES 
13330 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  clause..  */.  i
13340 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
13350 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
13360 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
13370 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61  SelectValues(pPa
13380 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
13390 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
133a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
133b0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
133c0 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
133d0 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
133e0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
133f0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
13400 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
13410 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
13420 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
13430 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
13440 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st );.  assert( 
13450 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
13460 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  ==pPrior->pEList
13470 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e  ->nExpr );..#ifn
13480 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13490 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  CTE.  if( p->sel
134a0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
134b0 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65  sive ){.    gene
134c0 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
134d0 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  eQuery(pParse, p
134e0 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , &dest);.  }els
134f0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  e.#endif..  /* C
13500 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20  ompound SELECTs 
13510 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44  that have an ORD
13520 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
13530 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
13540 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ely..  */.  if( 
13550 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
13560 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
13570 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61  electOrderBy(pPa
13580 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
13590 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65    }else..  /* Ge
135a0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
135b0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
135c0 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ht SELECT statem
135d0 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69  ents..  */.  swi
135e0 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
135f0 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b    case TK_ALL: {
13600 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20  .      int addr 
13610 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
13620 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73  Limit;.      ass
13630 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
13640 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50  imit );.      pP
13650 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  rior->iLimit = p
13660 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
13670 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20  pPrior->iOffset 
13680 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
13690 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d      pPrior->pLim
136a0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
136b0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f        pPrior->pO
136c0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
136d0 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  et;.      explai
136e0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
136f0 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
13700 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
13710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
13720 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
13730 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  or, &dest);.    
13740 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
13750 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
13760 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
13770 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
13780 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
13790 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
137a0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
137b0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  0;.      p->iLim
137c0 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
137d0 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  mit;.      p->iO
137e0 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e  ffset = pPrior->
137f0 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  iOffset;.      i
13800 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
13810 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
13820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13830 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d  (v, OP_IfNot, p-
13840 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f  >iLimit); VdbeCo
13850 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
13860 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
13870 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
13880 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
13890 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
138a0 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->iOffset ){.  
138b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
138c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
138d0 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a 20 20 20  OffsetLimit,.   
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d           p->iLim
13900 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  it, p->iOffset+1
13910 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
13920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13930 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
13940 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
13950 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
13960 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
13970 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13980 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
13990 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
139a0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
139b0 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
139c0 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
139d0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
139e0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
139f0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
13a00 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
13a10 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
13a20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
13a30 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ow);.      if( p
13a40 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20  Prior->pLimit.  
13a50 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
13a60 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72  xprIsInteger(pPr
13a70 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c  ior->pLimit, &nL
13a80 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20  imit).       && 
13a90 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e  nLimit>0 && p->n
13aa0 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69  SelectRow > sqli
13ab0 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
13ac0 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 29 7b  Limit) .      ){
13ad0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
13ae0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
13af0 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d  LogEst((u64)nLim
13b00 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
13b10 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
13b20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13b30 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
13b40 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
13b50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13b60 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
13b70 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
13b80 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
13b90 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
13ba0 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
13bb0 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
13bc0 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
13bd0 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
13be0 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  u8 op = 0;      
13bf0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
13c00 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
13c10 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
13c20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
13c30 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
13c40 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
13c50 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
13c60 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
13c70 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
13c80 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61   *pOffset; /* Sa
13c90 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
13ca0 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e  >nLimit and p->n
13cb0 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  Offset */.      
13cc0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
13cd0 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e  SelectDest union
13ce0 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73  dest;..      tes
13cf0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
13d00 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20  _EXCEPT );.     
13d10 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
13d20 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
13d30 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
13d40 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
13d50 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
13d60 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
13d70 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
13d80 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
13d90 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
13da0 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
13db0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68  .        ** righ
13dc0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
13dd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13de0 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20  >pLimit==0 );   
13df0 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
13e00 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
13e10 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
13e20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
13e30 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f  fset==0 );     /
13e40 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
13e50 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
13e60 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e  ts */.        un
13e70 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
13e80 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  DParm;.      }el
13e90 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
13ea0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
13eb0 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
13ec0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
13ed0 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
13ee0 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
13ef0 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
13f00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
13f10 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
13f20 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
13f30 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
13f40 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
13f50 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
13f60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13f70 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
13f80 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
13f90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13fa0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
13fb0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
13fc0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
13fd0 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
13fe0 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
13ff0 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
14000 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
14010 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  eral;.        as
14020 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
14030 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
14040 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
14050 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
14060 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
14070 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
14080 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
14090 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71  erBy );.      sq
140a0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
140b0 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20  nit(&uniondest, 
140c0 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
140d0 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b);.      explai
140e0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
140f0 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
14100 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14110 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14120 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
14130 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b  or, &uniondest);
14140 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
14150 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
14160 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
14170 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
14180 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
14190 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
141a0 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ent.      */.   
141b0 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
141c0 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20  _EXCEPT ){.     
141d0 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65     op = SRT_Exce
141e0 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  pt;.      }else{
141f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14200 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
14210 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   );.        op =
14220 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
14230 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
14240 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
14250 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
14260 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
14270 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
14280 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
14290 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
142a0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
142b0 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20  uniondest.eDest 
142c0 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c  = op;.      expl
142d0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
142e0 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
142f0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14310 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14320 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
14330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14340 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
14350 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c       /* Query fl
14360 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69  attening in sqli
14370 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68  te3Select() migh
14380 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64  t refill p->pOrd
14390 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42  erBy..      ** B
143a0 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65  e sure to delete
143b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68   p->pOrderBy, th
143c0 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69  erefore, to avoi
143d0 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e  d a memory leak.
143e0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
143f0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
14400 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
14410 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
14420 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
14430 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
14440 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
14450 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
14460 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
14470 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20  K_UNION ){.     
14480 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
14490 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
144a0 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  Add(p->nSelectRo
144b0 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  w, pPrior->nSele
144c0 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a  ctRow);.      }.
144d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
144e0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
144f0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
14500 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
14510 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
14520 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
14530 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
14540 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  0;.      p->iOff
14550 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  set = 0;..      
14560 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
14570 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
14580 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
14590 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
145a0 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
145b0 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
145c0 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
145d0 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
145e0 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61  nTab==dest.iSDPa
145f0 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
14600 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
14610 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
14620 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
14630 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
14640 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
14650 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14660 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
14670 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
14680 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
14690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
146a0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
146b0 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
146c0 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
146d0 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
146e0 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
146f0 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
14700 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
14710 65 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c  e, pFirst->pSrc,
14720 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
14730 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14740 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
14750 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14760 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
14770 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
14780 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
14790 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
147a0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
147b0 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
147c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
147d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
147e0 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
147f0 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  b, iBreak); Vdbe
14800 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
14810 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
14820 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
14830 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
14840 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
14850 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
14860 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
14870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14880 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
14890 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
148a0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
148b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
148c0 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
148d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
148e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
148f0 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
14900 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
14910 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
14920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
14930 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
14940 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
14950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14960 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
14970 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
14980 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
14990 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
149a0 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  lt: assert( p->o
149b0 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
149c0 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  ); {.      int t
149d0 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
149e0 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
149f0 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
14a00 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
14a10 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
14a20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
14a30 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
14a40 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20  sectdest;.      
14a50 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f  int r1;..      /
14a60 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
14a70 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
14a80 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
14a90 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
14aa0 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
14ab0 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
14ac0 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
14ad0 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
14ae0 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
14af0 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
14b00 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
14b10 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
14b20 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14b30 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
14b40 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
14b50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14b60 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
14b70 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
14b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14b90 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
14ba0 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ral, tab1, 0);. 
14bb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14bc0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
14bd0 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
14be0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
14bf0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
14c00 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
14c10 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
14c20 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
14c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14c40 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
14c50 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
14c60 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
14c70 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
14c80 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
14c90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
14ca0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
14cb0 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
14cc0 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
14cd0 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  ab1);.      expl
14ce0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14cf0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
14d00 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14d10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14d20 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
14d30 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
14d40 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
14d50 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
14d60 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
14d70 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
14d80 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14d90 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
14da0 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
14db0 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
14dc0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
14dd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14de0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
14df0 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30  hemeral, tab2, 0
14e00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14e10 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14e20 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
14e30 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
14e40 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
14e50 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14e60 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
14e70 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
14e80 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
14e90 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
14ea0 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
14eb0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14ec0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73   0;.      inters
14ed0 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20  ectdest.iSDParm 
14ee0 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78  = tab2;.      ex
14ef0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
14f00 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
14f10 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
14f20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14f30 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14f40 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  p, &intersectdes
14f50 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
14f60 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
14f70 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
14f80 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
14f90 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
14fa0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
14fb0 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
14fc0 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
14fd0 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
14fe0 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
14ff0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
15000 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
15010 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
15020 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
15030 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
15040 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
15050 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20  pOffset;..      
15060 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
15070 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
15080 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
15090 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
150a0 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
150b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
150c0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
150d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
150e0 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  st.eDest==SRT_Ou
150f0 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
15100 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
15110 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   p;.        whil
15120 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
15130 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
15140 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
15150 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
15160 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
15170 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20 70   pFirst->pSrc, p
15180 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
15190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42        }.      iB
151a0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
151b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
151c0 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
151d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
151e0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d  el(v);.      com
151f0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
15200 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
15210 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
15220 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15230 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
15240 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  1, iBreak); Vdbe
15250 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
15260 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
15270 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
15280 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  );.      iStart 
15290 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
152a0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  Op2(v, OP_RowKey
152b0 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
152c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
152d0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
152e0 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
152f0 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56 64 62  ont, r1, 0); Vdb
15300 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15310 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
15320 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
15330 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c  , r1);.      sel
15340 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
15350 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
15360 74 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20  t, tab1,.       
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
15380 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
15390 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
153a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
153b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
153c0 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
153d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
153e0 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
153f0 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
15400 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
15410 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
15420 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
15430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15450 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
15460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15470 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15480 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
15490 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
154a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61    }.  }..  expla
154b0 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
154c0 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
154d0 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d  , iSub2, p->op!=
154e0 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43  TK_ALL);..  /* C
154f0 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
15500 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
15510 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  by .  ** tempora
15520 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64  ry tables needed
15530 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
15540 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
15550 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74  t..  ** Attach t
15560 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
15570 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70  ture to all temp
15580 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20  orary tables..  
15590 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63  **.  ** This sec
155a0 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74  tion is run by t
155b0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
155c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
155d0 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54  nly..  ** SELECT
155e0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74   statements to t
155f0 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73  he left always s
15600 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20  kip this part.  
15610 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  The right-most. 
15620 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74   ** SELECT might
15630 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20   also skip this 
15640 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e  part if it has n
15650 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
15660 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65  e and.  ** no te
15670 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65  mp tables are re
15680 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  quired..  */.  i
15690 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
156a0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
156b0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  l ){.    int i; 
156c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
156e0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65  ounter */.    Ke
156f0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
15700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
15710 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
15720 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  e for the result
15730 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65   set */.    Sele
15740 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  ct *pLoop;      
15750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
15760 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
15770 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15780 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  ts */.    CollSe
15790 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20  q **apColl;     
157a0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
157b0 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70  ooping through p
157c0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
157d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
157e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
157f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15800 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  of columns in re
15810 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20  sult set */..   
15820 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78   assert( p->pNex
15830 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c  t==0 );.    nCol
15840 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
15850 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  xpr;.    pKeyInf
15860 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
15870 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c  foAlloc(db, nCol
15880 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , 1);.    if( !p
15890 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
158a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
158b0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
158c0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
158d0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
158e0 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d  for(i=0, apColl=
158f0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
15900 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70   i<nCol; i++, ap
15910 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  Coll++){.      *
15920 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65  apColl = multiSe
15930 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
15940 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
15950 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20   if( 0==*apColl 
15960 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f  ){.        *apCo
15970 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
15980 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
15990 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
159a0 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
159b0 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
159c0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
159d0 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
159e0 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
159f0 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
15a00 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
15a10 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
15a20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
15a30 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
15a40 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
15a50 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
15a60 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
15a70 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
15a80 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
15a90 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
15aa0 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
15ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
15ac0 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
15ad0 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  m[1]<0 );.      
15ae0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15af0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
15b00 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
15b10 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
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 34 28 76 2c 20  VdbeChangeP4(v, 
15b40 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c  addr, (char*)sql
15b50 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
15b60 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  KeyInfo),.      
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
15b90 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
15ba0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
15bb0 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
15bc0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15bd0 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
15be0 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
15bf0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
15c00 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
15c10 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70   dest.iSdst;.  p
15c20 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65  Dest->nSdst = de
15c30 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69  st.nSdst;.  sqli
15c40 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
15c50 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20  db, pDelete);.  
15c60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
15c70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
15c80 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
15c90 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72  CT */../*.** Err
15ca0 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77  or message for w
15cb0 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  hen two or more 
15cc0 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f  terms of a compo
15cd0 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20  und select have 
15ce0 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a  different.** siz
15cf0 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a  e result sets..*
15d00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
15d10 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d  lectWrongNumTerm
15d20 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50  sError(Parse *pP
15d30 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
15d40 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  {.  if( p->selFl
15d50 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
15d60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15d70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15d80 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20  all VALUES must 
15d90 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
15da0 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b  mber of terms");
15db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
15dc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15dd0 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
15de0 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
15df0 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
15e00 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
15e10 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
15e20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
15e30 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
15e40 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a  (p->op));.  }.}.
15e50 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
15e60 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
15e70 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
15e80 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
15e90 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
15ea0 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
15eb0 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
15ec0 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
15ed0 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e  d in pIn->iSdst.
15ee0 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
15ef0 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e  In->nSdst column
15f00 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
15f10 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
15f20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
15f30 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
15f40 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
15f50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
15f60 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
15f70 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
15f80 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
15f90 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
15fa0 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
15fb0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65   is the first re
15fc0 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
15fd0 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
15fe0 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
15ff0 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
16000 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
16010 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
16020 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
16030 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
16040 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
16050 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
16060 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
16070 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
16080 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
16090 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
160a0 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
160b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
160c0 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
160d0 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
160e0 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
160f0 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
16100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
16110 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
16120 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
16130 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
16140 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
16150 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
16160 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
16170 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
16180 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
16190 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
161a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
161b0 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
161c0 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
161d0 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
161e0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
161f0 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
16200 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
16210 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
16220 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
16230 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
16240 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
16250 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
16260 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
16270 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
16280 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
16290 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
162a0 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
162b0 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
162c0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
162d0 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
162e0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
162f0 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
16300 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
16310 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
16320 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
16330 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
16340 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
16350 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
16360 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
16370 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
16380 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
16390 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
163a0 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
163b0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
163c0 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
163d0 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
163e0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
163f0 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31  addr2;.    addr1
16400 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16410 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
16420 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65  , regPrev); Vdbe
16430 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16440 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
16450 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16460 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
16470 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
16480 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20   pIn->nSdst,.   
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
164b0 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
164c0 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
164d0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
164e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
164f0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
16500 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65  dr2+2, iContinue
16510 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65  , addr2+2); Vdbe
16520 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16530 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16540 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
16550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16560 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
16570 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
16580 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
16590 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  dst-1);.    sqli
165a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
165b0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
165c0 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20  regPrev);.  }.  
165d0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
165e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
165f0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53  eturn 0;..  /* S
16600 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73  uppress the firs
16610 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
16620 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
16630 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
16640 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
16650 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
16660 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73  Continue);..  as
16670 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
16680 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
16690 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73  ;.  assert( pDes
166a0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61  t->eDest!=SRT_Ta
166b0 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28  ble );.  switch(
166c0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
166d0 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
166e0 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
166f0 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
16700 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
16710 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
16720 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
16730 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
16740 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16750 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
16760 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16770 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
16780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16790 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
167a0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
167b0 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a  In->nSdst, r1);.
167c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
167d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
167e0 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
167f0 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20  SDParm, r2);.   
16800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16810 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
16820 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
16830 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
16840 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16850 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
16860 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
16870 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16880 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
16890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
168a0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
168b0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
168c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
168d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
168e0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
168f0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
16900 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
16910 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
16920 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
16930 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
16940 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
16950 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
16960 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
16970 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
16980 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
16990 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
169a0 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
169b0 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
169c0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
169d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
169e0 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c  pIn->nSdst==1 ||
169f0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
16a00 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
16a10 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20  affSdst = .     
16a20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
16a30 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45  reAffinity(p->pE
16a40 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
16a50 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
16a60 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
16a70 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16a80 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
16a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16aa0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
16ab0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  d, pIn->iSdst, 1
16ac0 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  , r1, &pDest->af
16ad0 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20  fSdst,1);.      
16ae0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16af0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
16b00 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
16b10 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
16b20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16b30 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
16b40 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
16b50 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
16b60 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16b70 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
16b80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16b90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
16ba0 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
16bb0 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
16bc0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
16bd0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
16be0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
16bf0 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
16c00 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
16c10 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
16c20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
16c30 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
16c40 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
16c50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
16c60 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c  pIn->nSdst==1 ||
16c70 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
16c80 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49  );  testcase( pI
16c90 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20  n->nSdst!=1 );. 
16ca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16cb0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
16cc0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
16cd0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b  st->iSDParm, 1);
16ce0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
16cf0 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
16d00 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
16d10 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
16d20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16d30 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
16d40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16d50 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
16d60 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20   /* The results 
16d70 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
16d80 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
16d90 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
16da0 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e  rting at pDest->
16db0 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65  iSdst.  Then the
16dc0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
16dd0 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
16de0 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
16df0 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
16e00 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
16e10 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
16e20 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33  >iSdst = sqlite3
16e30 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
16e40 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  rse, pIn->nSdst)
16e50 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
16e60 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53  >nSdst = pIn->nS
16e70 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dst;.      }.   
16e80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16e90 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
16ea0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
16eb0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
16ec0 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
16ed0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16ee0 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
16ef0 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
16f00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
16f10 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
16f20 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
16f30 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
16f40 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
16f50 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
16f60 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
16f70 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
16f80 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
16f90 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
16fa0 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
16fb0 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
16fc0 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
16fd0 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
16fe0 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
16ff0 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
17000 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
17010 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
17020 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
17030 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
17040 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
17050 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
17060 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
17070 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
17080 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
17090 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
170a0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
170b0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
170c0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
170d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
170e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
170f0 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
17100 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17110 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17120 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
17130 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
17140 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
17150 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62  >nSdst);.      b
17160 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
17170 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
17180 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
17190 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
171a0 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
171b0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
171c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
171d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
171e0 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e  ecrJumpZero, p->
171f0 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
17200 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17210 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
17220 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74  rate the subrout
17230 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  ine return.  */.
17240 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17250 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
17260 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74  ntinue);.  sqlit
17270 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17280 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
17290 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e  turn);..  return
172a0 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
172b0 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70  Alternative comp
172c0 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65  ound select code
172d0 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63   generator for c
172e0 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a  ases when there.
172f0 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  ** is an ORDER B
17300 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
17310 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72  We assume a quer
17320 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
17330 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ng form:.**.**  
17340 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c      <selectA>  <
17350 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65  operator>  <sele
17360 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c  ctB>  ORDER BY <
17370 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a  orderbylist>.**.
17380 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
17390 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c   one of UNION AL
173a0 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  L, UNION, EXCEPT
173b0 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20  , or INTERSECT. 
173c0 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20   The idea.** is 
173d0 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65  to code both <se
173e0 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65  lectA> and <sele
173f0 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52  ctB> with the OR
17400 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
17410 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e  .** co-routines.
17420 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63    Then run the c
17430 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61  o-routines in pa
17440 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65  rallel and merge
17450 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
17460 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  into the output.
17470 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
17480 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
17490 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65  nes (called sele
174a0 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63  ctA and.** selec
174b0 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20  tB) there are 7 
174c0 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a  subroutines:.**.
174d0 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d  **    outA:    M
174e0 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
174f0 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f  f the selectA co
17500 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
17510 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
17520 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
17530 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a  mpound query..**
17540 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20  .**    outB:    
17550 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
17560 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63  of the selectB c
17570 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
17580 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
17590 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
175a0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20  ompound query.  
175b0 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20  (Only generated 
175c0 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a  for UNION and.**
175d0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
175e0 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20  ON ALL.  EXCEPT 
175f0 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e  and INSERTSECT n
17600 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f  ever output a ro
17610 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  w that.**       
17620 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e        appears on
17630 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20  ly in B.).**.** 
17640 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c     AltB:    Call
17650 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
17660 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
17670 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
17680 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71  <B..**.**    Aeq
17690 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
176a0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
176b0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
176c0 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a  ines and A==B..*
176d0 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20  *.**    AgtB:   
176e0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
176f0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
17700 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
17710 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A>B..**.**  
17720 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65    EofA:    Calle
17730 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
17740 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
17750 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lectA..**.**    
17760 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofB:    Called 
17770 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
17780 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
17790 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ctB..**.** The i
177a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
177b0 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65   the latter five
177c0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70   subroutines dep
177d0 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a  end on which .**
177e0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75   <operator> is u
177f0 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20  sed:.**.**.**   
17800 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
17810 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f  ALL         UNIO
17820 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43  N            EXC
17830 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54  EPT          INT
17840 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  ERSECT.**       
17850 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
17860 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17870 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
17880 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
17890 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42  ------.**   AltB
178a0 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
178b0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
178c0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
178d0 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
178e0 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20  .**.**   AeqB:  
178f0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
17900 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
17910 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
17920 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
17930 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20  .**.**   AgtB:  
17940 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
17950 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
17960 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20         nextB    
17970 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a          nextB.**
17980 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75  .**   EofA:   ou
17990 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
179a0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
179b0 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20      halt        
179c0 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
179d0 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20    EofB:   outA, 
179e0 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
179f0 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
17a00 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
17a10 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74   halt.**.** In t
17a20 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61  he AltB, AeqB, a
17a30 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69  nd AgtB subrouti
17a40 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41  nes, an EOF on A
17a50 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41   following nextA
17a60 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d  .** causes an im
17a70 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
17a80 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20  EofA and an EOF 
17a90 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on B following n
17aa0 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61  extB causes.** a
17ab0 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
17ac0 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69   to EofB.  Withi
17ad0 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c  n EofA and EofB,
17ae0 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72   and EOF on entr
17af0 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  y or.** followin
17b00 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61  g nextX causes a
17b10 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   jump to the end
17b20 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70   of the select p
17b30 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
17b40 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   Duplicate remov
17b50 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c  al in the UNION,
17b60 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
17b70 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20  ERSECT cases is 
17b80 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69  handled.** withi
17b90 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  n the output sub
17ba0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65  routine.  The re
17bb0 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73  gPrev register s
17bc0 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65  et holds the pre
17bd0 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75  viously.** outpu
17be0 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70  t value.  A comp
17bf0 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61  arison is made a
17c00 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75  gainst this valu
17c10 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  e and the output
17c20 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69  .** is skipped i
17c30 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c  f the next resul
17c40 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20  ts would be the 
17c50 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76  same as the prev
17c60 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ious..**.** The 
17c70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
17c80 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d  lan is to implem
17c90 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f  ent the two coro
17ca0 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e  utines and seven
17cb0 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20  .** subroutines 
17cc0 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20  first, then put 
17cd0 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69  the control logi
17ce0 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e  c at the bottom.
17cf0 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
17d00 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  **          goto
17d10 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41   Init.**     coA
17d20 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
17d30 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a  left query (A).*
17d40 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75  *     coB: corou
17d50 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71  tine for right q
17d60 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f  uery (B).**    o
17d70 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utA: output one 
17d80 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f  row of A.**    o
17d90 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utB: output one 
17da0 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20  row of B (UNION 
17db0 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e  and UNION ALL on
17dc0 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  ly).**    EofA: 
17dd0 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  ....**    EofB: 
17de0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  ....**    AltB: 
17df0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  ....**    AeqB: 
17e00 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  ....**    AgtB: 
17e10 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20  ....**    Init: 
17e20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75  initialize corou
17e30 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tine registers.*
17e40 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
17e50 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20   coA.**         
17e60 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20   if eof(A) goto 
17e70 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  EofA.**         
17e80 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20   yield coB.**   
17e90 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29         if eof(B)
17ea0 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20   goto EofB.**   
17eb0 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41   Cmpr: Compare A
17ec0 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  , B.**          
17ed0 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c  Jump AltB, AeqB,
17ee0 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64   AgtB.**     End
17ef0 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63  : ....**.** We c
17f00 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  all AltB, AeqB, 
17f10 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20  AgtB, EofA, and 
17f20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65  EofB "subroutine
17f30 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20  s" but they are 
17f40 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20  not.** actually 
17f50 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73  called using Gos
17f60 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e  ub and they do n
17f70 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41  ot Return.  EofA
17f80 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a   and EofB loop.*
17f90 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61  * until all data
17fa0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68   is exhausted th
17fb0 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22  en jump to the "
17fc0 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42  end" labe.  AltB
17fd0 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41  , AeqB,.** and A
17fe0 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68  gtB jump to eith
17ff0 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20  er L2 or to one 
18000 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e  of EofA or EofB.
18010 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
18020 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
18030 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69  _SELECT.static i
18040 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
18050 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
18060 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
18070 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
18080 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
18090 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
180a0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
180b0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
180c0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
180d0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
180e0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
180f0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
18100 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
18110 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
18120 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
18130 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
18140 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
18150 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
18160 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
18170 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
18180 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
18190 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
181a0 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
181b0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
181c0 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73  estA;     /* Des
181d0 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
181e0 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65  outine A */.  Se
181f0 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20  lectDest destB; 
18200 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
18210 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
18220 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41   B */.  int regA
18230 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrA;         /*
18240 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
18250 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63  r for select-A c
18260 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
18270 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
18280 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
18290 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
182a0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
182b0 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
182c0 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctA;      /* Add
182d0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
182e0 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
182f0 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
18300 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctB;      /* Add
18310 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
18320 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
18330 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b  /.  int regOutA;
18340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
18350 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18360 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  r the output-A s
18370 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18380 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20  nt regOutB;     
18390 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
183a0 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
183b0 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
183c0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
183d0 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  drOutA;         
183e0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
183f0 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
18400 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18410 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20  ddrOutB = 0;    
18420 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18430 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
18440 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18450 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20  addrEofA;       
18460 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18470 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68  the select-A-exh
18480 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
18490 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
184a0 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20  ofA_noB;     /* 
184b0 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f  Alternate addrEo
184c0 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69  fA if B is unini
184d0 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e  tialized */.  in
184e0 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20  t addrEofB;     
184f0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18500 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65  f the select-B-e
18510 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
18520 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18530 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAltB;         /
18540 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18550 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A<B subroutine 
18560 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71  */.  int addrAeq
18570 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18580 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d  dress of the A==
18590 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
185a0 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20    int addrAgtB; 
185b0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
185c0 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75  ss of the A>B su
185d0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
185e0 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20  t regLimitA;    
185f0 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
18600 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
18610 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  -A */.  int regL
18620 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a  imitB;        /*
18630 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
18640 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
18650 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
18660 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e          /* A ran
18670 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
18680 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73  to hold previous
18690 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
186a0 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20   savedLimit;    
186b0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
186c0 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a  e of p->iLimit *
186d0 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66  /.  int savedOff
186e0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76  set;      /* Sav
186f0 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
18700 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  Offset */.  int 
18710 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20  labelCmpr;      
18720 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
18730 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
18740 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
18750 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e  */.  int labelEn
18760 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  d;         /* La
18770 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20  bel for the end 
18780 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53  of the overall S
18790 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20  ELECT stmt */.  
187a0 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
187b0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e        /* Jump in
187c0 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
187d0 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20  get retargetted 
187e0 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
187f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
18800 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f  e of TK_ALL, TK_
18810 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
18820 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a  , TK_INTERSECT *
18830 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
18840 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d  yDup = 0; /* Com
18850 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
18860 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
18870 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b  e removal */.  K
18880 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67  eyInfo *pKeyMerg
18890 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73  e;   /* Comparis
188a0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
188b0 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20  or merging rows 
188c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
188d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
188e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
188f0 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
18900 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
18910 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
18920 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  use */.  int nOr
18930 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
18940 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
18950 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
18960 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
18970 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20  t *aPermute;    
18980 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
18990 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72  rom ORDER BY ter
189a0 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74  ms to result set
189b0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e   columns */.#ifn
189c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
189d0 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53  EXPLAIN.  int iS
189e0 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub1;            
189f0 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66  /* EQP id of lef
18a00 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
18a10 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20    int iSub2;    
18a20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
18a30 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  d of right-hand 
18a40 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a  query */.#endif.
18a50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
18a60 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
18a70 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d  ssert( pKeyDup==
18a80 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64  0 ); /* "Managed
18a90 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69  " code needs thi
18aa0 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32  s.  Ticket #3382
18ab0 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  . */.  db = pPar
18ac0 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50  se->db;.  v = pP
18ad0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
18ae0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
18af0 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20       /* Already 
18b00 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72  thrown the error
18b10 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66   if VDBE alloc f
18b20 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c  ailed */.  label
18b30 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
18b40 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
18b50 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c   labelCmpr = sql
18b60 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18b70 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74  l(v);...  /* Pat
18b80 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20  ch up the ORDER 
18b90 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  BY clause.  */. 
18ba0 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20   op = p->op;  . 
18bb0 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
18bc0 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
18bd0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d  Prior->pOrderBy=
18be0 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  =0 );.  pOrderBy
18bf0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
18c00 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
18c10 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  By );.  nOrderBy
18c20 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
18c30 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
18c40 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
18c50 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
18c60 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
18c70 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
18c80 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18c90 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
18ca0 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
18cb0 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
18cc0 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
18cd0 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
18ce0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
18cf0 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
18d00 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
18d10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18d20 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
18d30 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
18d40 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
18d50 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
18d60 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  tem;.      for(j
18d70 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
18d80 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42  By->a; j<nOrderB
18d90 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; j++, pItem++)
18da0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
18db0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18dc0 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
18dd0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
18de0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
18df0 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
18e00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
18e10 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
18e20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
18e30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
18e40 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
18e50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
18e60 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
18e70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
18e80 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  T;.        pNew-
18e90 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
18ea0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
18eb0 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
18ec0 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
18ed0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
18ee0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
18ef0 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
18f00 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
18f10 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
18f20 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
18f30 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
18f40 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
18f50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18f60 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
18f70 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
18f80 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
18f90 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
18fa0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
18fb0 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
18fc0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
18fd0 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
18fe0 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
18ff0 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
19000 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
19010 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
19020 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
19030 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
19040 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
19050 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
19060 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
19070 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
19080 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
19090 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
190a0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
190b0 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
190c0 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
190d0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
190e0 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
190f0 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31  t)*(nOrderBy + 1
19100 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  ));.  if( aPermu
19110 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
19120 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19130 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d  pItem;.    aPerm
19140 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42  ute[0] = nOrderB
19150 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  y;.    for(i=1, 
19160 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
19170 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20  a; i<=nOrderBy; 
19180 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
19190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
191a0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
191b0 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  Col>0 );.      a
191c0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
191d0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
191e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
191f0 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
19200 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
19210 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
19220 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
19230 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
19240 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
19250 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
19260 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19270 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
19280 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
19290 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
192a0 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
192b0 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
192c0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
192d0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
192e0 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
192f0 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
19300 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
19310 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
19320 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
19330 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
19340 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
19350 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
19360 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
19370 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
19380 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
19390 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
193a0 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
193b0 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
193c0 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
193d0 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
193e0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
193f0 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
19400 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
19410 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
19420 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
19430 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
19440 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
19450 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19460 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
19470 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
19480 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
19490 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
194a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
194b0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
194c0 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
194d0 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
194e0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
194f0 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
19500 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
19510 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19520 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
19530 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
19540 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
19550 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
19560 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
19570 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
19580 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
19590 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
195a0 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
195b0 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
195c0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
195d0 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
195e0 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
195f0 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
19600 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
19610 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
19620 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
19630 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
19640 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
19650 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
19660 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
19670 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
19680 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
19690 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
196a0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
196b0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
196c0 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
196d0 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
196e0 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
196f0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
19700 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
19710 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
19720 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
19730 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
19740 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
19750 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
19760 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
19770 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
19780 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
19790 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
197a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
197b0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
197c0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
197d0 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
197e0 69 4c 69 6d 69 74 2c 0a 20 20 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 72 65 67 4c 69 6d            regLim
19810 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
19820 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19830 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
19840 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
19850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
19860 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
19870 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
19880 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
19890 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
198a0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
198b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
198c0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
198d0 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
198e0 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
198f0 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
19900 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
19910 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19920 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
19930 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19940 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
19950 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
19960 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
19970 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
19980 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
19990 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
199a0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
199b0 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
199c0 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
199d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
199e0 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
199f0 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
19a00 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
19a10 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
19a20 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
19a30 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
19a40 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  lect..  */.  add
19a50 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
19a60 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19a70 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72  r(v) + 1;.  addr
19a80 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
19a90 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
19aa0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19ab0 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drA, 0, addrSele
19ac0 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctA);.  VdbeComm
19ad0 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45  ent((v, "left SE
19ae0 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f  LECT"));.  pPrio
19af0 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  r->iLimit = regL
19b00 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e  imitA;.  explain
19b10 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
19b20 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
19b30 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
19b40 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
19b50 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41  , pPrior, &destA
19b60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19b70 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
19b80 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
19b90 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
19ba0 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f  (v, addr1);..  /
19bb0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
19bc0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
19bd0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
19be0 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a  atement on .  **
19bf0 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65   the right - the
19c00 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f   "B" select.  */
19c10 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d  .  addrSelectB =
19c20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19c30 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
19c40 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
19c50 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19c60 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
19c70 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
19c80 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
19c90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
19ca0 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
19cb0 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
19cc0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
19cd0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
19ce0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
19cf0 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
19d00 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
19d10 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49    .  explainSetI
19d20 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
19d30 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
19d40 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
19d50 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
19d60 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
19d70 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
19d80 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
19d90 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
19da0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
19db0 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
19dc0 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65  AddrB);..  /* Ge
19dd0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19de0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
19df0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
19e00 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
19e10 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
19e20 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
19e30 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
19e40 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
19e50 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
19e60 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
19e70 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
19e80 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
19e90 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
19ea0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
19eb0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
19ec0 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
19ed0 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
19ee0 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
19ef0 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
19f00 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
19f10 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
19f20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
19f30 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
19f40 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
19f50 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
19f60 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
19f70 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
19f80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
19f90 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
19fa0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
19fb0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19fc0 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
19fd0 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
19fe0 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
19ff0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
1a000 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
1a020 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
1a030 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
1a040 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
1a050 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
1a060 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  End);.  }.  sqli
1a070 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
1a080 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20  pKeyDup);..  /* 
1a090 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1a0a0 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
1a0b0 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
1a0c0 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
1a0d0 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1a0e0 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1a0f0 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
1a100 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1a110 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
1a120 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1a130 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  {.    addrEofA_n
1a140 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20  oB = addrEofA = 
1a150 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73  labelEnd;.  }els
1a160 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1a170 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1a180 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
1a190 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20  );.    addrEofA 
1a1a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a1b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1a1c0 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
1a1d0 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  tB);.    addrEof
1a1e0 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56  A_noB = sqlite3V
1a1f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a200 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1a210 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a240 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a260 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1a270 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
1a280 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
1a290 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
1a2a0 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
1a2b0 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d  nSelectRow);.  }
1a2c0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a2d0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1a2e0 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1a2f0 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1a300 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
1a310 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1a320 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
1a330 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1a340 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1a350 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1a360 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
1a370 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
1a380 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
1a390 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
1a3a0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
1a3b0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1a3c0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1a3d0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1a3e0 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
1a3f0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1a400 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
1a410 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a420 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1a430 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
1a440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a450 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a460 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45  regAddrA, labelE
1a470 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  nd); VdbeCoverag
1a480 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1a490 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
1a4a0 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
1a4b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a4c0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1a4d0 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
1a4e0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1a4f0 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
1a500 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1a510 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
1a520 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a530 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
1a540 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
1a550 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a560 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a570 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1a580 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a590 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a5a0 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1a5b0 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
1a5c0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1a5d0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
1a5e0 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
1a5f0 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1a600 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1a610 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
1a620 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1a630 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
1a640 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1a650 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
1a660 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
1a670 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a680 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
1a690 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
1a6a0 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
1a6b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a6c0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a6d0 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1a6e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a6f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1a700 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1a710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1a720 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1a730 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1a740 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
1a750 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1a760 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
1a770 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
1a780 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1a790 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
1a7a0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1a7b0 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1a7c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a7d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1a7e0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1a7f0 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
1a800 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a810 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a820 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1a830 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a840 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a850 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1a860 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
1a870 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
1a880 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
1a890 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
1a8a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1a8b0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
1a8c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a8d0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1a8e0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1a8f0 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65  A_noB); VdbeCove
1a900 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1a910 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a920 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a930 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
1a940 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a950 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
1a960 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
1a970 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
1a980 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a990 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
1a9a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1a9b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
1a9c0 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
1a9d0 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
1a9e0 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
1a9f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1aa00 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
1aa10 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
1aa20 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
1aa30 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
1aa60 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  e, P4_KEYINFO);.
1aa70 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1aa80 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
1aa90 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69  PERMUTE);.  sqli
1aaa0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1aab0 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
1aac0 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
1aad0 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76  drAgtB); VdbeCov
1aae0 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1aaf0 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
1ab00 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
1ab10 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1ab20 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
1ab30 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1ab40 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
1ab50 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  nd);..  /* Set t
1ab60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
1ab70 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  put columns.  */
1ab80 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
1ab90 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
1aba0 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
1abb0 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a  First = pPrior;.
1abc0 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
1abd0 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
1abe0 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
1abf0 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  ior;.    generat
1ac00 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
1ac10 72 73 65 2c 20 70 46 69 72 73 74 2d 3e 70 53 72  rse, pFirst->pSr
1ac20 63 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  c, pFirst->pELis
1ac30 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  t);.  }..  /* Re
1ac40 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
1ac50 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
1ac60 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
1ac70 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
1ac80 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
1ac90 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
1aca0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
1acb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
1acc0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
1acd0 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
1ace0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1acf0 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e  or;.  pPrior->pN
1ad00 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a  ext = p;..  /***
1ad10 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75   TBD:  Insert su
1ad20 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74  broutine calls t
1ad30 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  o close cursors 
1ad40 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20  on incomplete.  
1ad50 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  **** subqueries 
1ad60 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43  ****/.  explainC
1ad70 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
1ad80 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
1ad90 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75  Sub2, 0);.  retu
1ada0 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21  rn pParse->nErr!
1adb0 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  =0;.}.#endif..#i
1adc0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1add0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1ade0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1adf0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1ae00 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
1ae10 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
1ae20 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1ae30 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78  ist(sqlite3*, Ex
1ae40 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78  prList*, int, Ex
1ae50 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
1ae60 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1ae70 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65  t(sqlite3*, Sele
1ae80 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ct *, int, ExprL
1ae90 69 73 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  ist*, int);../*.
1aea0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1aeb0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1aec0 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1aed0 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1aee0 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1aef0 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1af00 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1af10 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1af20 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1af30 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1af40 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1af50 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1af60 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1af70 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1af80 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1af90 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1afa0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1afb0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1afc0 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1afd0 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1afe0 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1aff0 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1b000 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1b010 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1b020 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1b030 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1b040 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1b050 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1b060 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
1b070 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
1b080 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
1b090 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
1b0a0 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
1b0b0 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
1b0c0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
1b0d0 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
1b0e0 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1b0f0 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
1b100 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
1b110 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
1b120 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1b130 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1b140 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
1b150 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
1b160 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
1b170 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
1b180 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
1b190 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
1b1a0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
1b1b0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
1b1c0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
1b1d0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1b1e0 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1b1f0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
1b200 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
1b210 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1b220 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1b230 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
1b240 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
1b250 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
1b260 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
1b270 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1b280 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
1b290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
1b2a0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
1b2b0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
1b2c0 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
1b2d0 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
1b2e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b2f0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
1b300 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
1b310 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
1b320 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1b330 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
1b340 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
1b350 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  n].pExpr, 0);.  
1b360 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1b370 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1b380 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
1b390 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pNew;.    }.  }e
1b3a0 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  lse{.    pExpr->
1b3b0 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1b3c0 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
1b3d0 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
1b3e0 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  st);.    pExpr->
1b3f0 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78  pRight = substEx
1b400 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
1b410 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
1b420 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
1b430 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1b440 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1b450 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
1b460 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
1b470 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
1b480 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31  Table, pEList, 1
1b490 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1b4a0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1b4b0 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
1b4c0 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
1b4d0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1b4e0 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1b4f0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1b500 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1b510 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1b520 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
1b530 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
1b540 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1b550 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
1b560 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
1b570 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1b580 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
1b590 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1b5a0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1b5b0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
1b5c0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1b5d0 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
1b5e0 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
1b5f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1b600 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1b610 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
1b620 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1b630 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  pr; i++){.    pL
1b640 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
1b650 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b660 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1b670 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
1b680 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
1b690 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1b6a0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
1b6b0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
1b6c0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1b6d0 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
1b6e0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1b6f0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1b700 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1b710 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1b720 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
1b730 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1b740 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
1b750 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
1b760 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
1b770 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
1b780 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  lues */.  int do
1b790 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 2f  Prior          /
1b7a0 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73  * Do substitutes
1b7b0 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f   on p->pPrior to
1b7c0 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  o */.){.  SrcLis
1b7d0 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1b7e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1b7f0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1b800 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1b810 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62  n;.  do{.    sub
1b820 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1b830 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65  ->pEList, iTable
1b840 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
1b850 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b860 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
1b870 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b880 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1b890 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
1b8a0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b8b0 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
1b8c0 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
1b8d0 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
1b8e0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b8f0 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
1b900 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
1b910 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20  pWhere, iTable, 
1b920 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 53 72  pEList);.    pSr
1b930 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
1b940 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
1b950 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53   );.    for(i=pS
1b960 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d  rc->nSrc, pItem=
1b970 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  pSrc->a; i>0; i-
1b980 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
1b990 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
1b9a0 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
1b9b0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b9c0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
1b9d0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
1b9e0 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
1b9f0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1ba00 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
1ba10 63 41 72 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  cArg, iTable, pE
1ba20 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
1ba30 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64     }.  }while( d
1ba40 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70  oPrior && (p = p
1ba50 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a  ->pPrior)!=0 );.
1ba60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1ba70 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ba80 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1ba90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1baa0 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1bab0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1bac0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1bad0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1bae0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1baf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1bb00 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1bb10 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1bb20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1bb30 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1bb40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1bb50 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1bb60 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1bb70 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1bb80 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1bb90 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1bba0 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1bbb0 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1bbc0 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1bbd0 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1bbe0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1bbf0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1bc00 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1bc10 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1bc20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1bc30 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1bc40 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1bc50 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1bc60 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1bc70 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1bc80 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1bc90 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1bca0 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1bcb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1bcc0 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1bcd0 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1bce0 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1bcf0 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1bd00 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1bd10 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1bd20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1bd30 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1bd40 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1bd50 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1bd60 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1bd70 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1bd80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bd90 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1bda0 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1bdb0 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1bdc0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1bdd0 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1bde0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1bdf0 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1be00 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1be10 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1be20 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1be30 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1be40 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1be50 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1be60 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1be70 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1be80 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1be90 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1bea0 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1beb0 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1bec0 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1bed0 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1bee0 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1bef0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1bf00 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
1bf10 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
1bf20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1bf30 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1bf40 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
1bf50 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1bf60 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1bf70 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
1bf80 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
1bf90 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1bfa0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1bfb0 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f 75 74   or (2a) the out
1bfc0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1bfd0 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  a join.**       
1bfe0 20 61 6e 64 20 28 32 62 29 20 74 68 65 20 6f 75   and (2b) the ou
1bff0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1c000 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1c010 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
1c020 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 46   one.**        F
1c030 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1c040 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63 61  ery that is a ca
1c050 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c 61 74  ndidate for flat
1c060 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69 73 0a  tening.  (2b is.
1c070 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20 74 6f  **        due to
1c080 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64   ticket [2f7170d
1c090 37 33 62 66 39 61 62 66 38 30 5d 20 66 72 6f 6d  73bf9abf80] from
1c0a0 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a   2015-02-09.).**
1c0b0 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
1c0c0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
1c0d0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1c0e0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1c0f0 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
1c100 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
1c110 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
1c120 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  thened by ticket
1c130 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
1c140 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1c150 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
1c160 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
1c170 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
1c180 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
1c190 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
1c1a0 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
1c1b0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
1c1c0 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
1c1d0 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
1c1e0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1c1f0 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
1c200 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
1c210 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
1c220 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
1c230 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
1c240 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
1c250 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
1c260 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1c270 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
1c280 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c290 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
1c2a0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1c2b0 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1c2c0 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
1c2d0 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1c2e0 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1c2f0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1c300 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1c310 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1c320 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74  a FROM close wit
1c330 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1c340 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1c350 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1c360 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1c370 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1c380 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1c390 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1c3a0 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
1c3b0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c3c0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1c3d0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1c3e0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
1c3f0 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
1c400 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1c410 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1c420 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1c430 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
1c440 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
1c450 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72  .**  (**)  Restr
1c460 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20  iction (10) was 
1c470 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1c480 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32   code on 2005-02
1c490 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20  -05 but we.**   
1c4a0 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20       accidently 
1c4b0 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d  carried the comm
1c4c0 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69  ent forward unti
1c4d0 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f  l 2014-09-15.  O
1c4e0 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
1c4f0 20 20 74 65 78 74 3a 20 22 54 68 65 20 73 75 62    text: "The sub
1c500 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c510 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
1c520 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c530 20 0a 2a 2a 20 20 20 20 20 20 20 20 64 6f 65 73   .**        does
1c540 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 22   not use LIMIT."
1c550 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
1c560 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1c570 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1c580 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
1c590 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
1c5a0 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e  ..**.**  (**)  N
1c5b0 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20  ot implemented. 
1c5c0 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72   Subsumed into r
1c5d0 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20  estriction (3). 
1c5e0 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   Was previously.
1c5f0 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61  **        a sepa
1c600 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e  rate restriction
1c610 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74   deriving from t
1c620 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a  icket #350..**.*
1c630 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
1c640 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
1c650 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1c660 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a  h use LIMIT..**.
1c670 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75  **  (14)  The su
1c680 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c690 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  use OFFSET..**.*
1c6a0 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
1c6b0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1c6c0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
1c6d0 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
1c6e0 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
1c6f0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
1c700 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
1c710 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
1c720 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
1c730 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
1c740 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
1c750 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  16)  The outer q
1c760 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
1c770 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
1c780 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a  subquery does.**
1c790 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74          not cont
1c7a0 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28  ain ORDER BY.  (
1c7b0 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54  Ticket #2942)  T
1c7c0 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20  his used to not 
1c7d0 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  matter.**       
1c7e0 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64   until we introd
1c7f0 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63  uced the group_c
1c800 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e  oncat() function
1c810 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20  .  .**.**  (17) 
1c820 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   The sub-query i
1c830 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  s not a compound
1c840 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69   select, or it i
1c850 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a  s a UNION ALL .*
1c860 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
1c870 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70  d clause made up
1c880 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e   entirely of non
1c890 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
1c8a0 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  es, and .**     
1c8b0 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75     the parent qu
1c8c0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ery:.**.**      
1c8d0 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73      * is not its
1c8e0 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f  elf part of a co
1c8f0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a  mpound select,.*
1c900 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1c910 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1c920 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65   or DISTINCT que
1c930 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ry, and.**      
1c940 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a      * is not a j
1c950 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  oin.**.**       
1c960 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
1c970 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
1c980 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
1c990 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
1c9a0 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
1c9b0 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
1c9c0 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
1c9d0 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
1c9e0 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
1c9f0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1ca00 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75  clauses.  The su
1ca10 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73  bquery cannot us
1ca20 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  e any compound.*
1ca30 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1ca40 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  r other than UNI
1ca50 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61  ON ALL because a
1ca60 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d  ll the other com
1ca70 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1ca80 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61  operators have a
1ca90 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e  n implied DISTIN
1caa0 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61  CT which is disa
1cab0 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20  llowed by.**    
1cac0 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20      restriction 
1cad0 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  (4)..**.**      
1cae0 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d    Also, each com
1caf0 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75  ponent of the su
1cb00 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74  b-query must ret
1cb10 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  urn the same num
1cb20 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66  ber.**        of
1cb30 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
1cb40 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c   This is actuall
1cb50 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20  y a requirement 
1cb60 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  for any compound
1cb70 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43  .**        SELEC
1cb80 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  T statement, but
1cb90 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65   all the code he
1cba0 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  re does is make 
1cbb0 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20  sure that no.** 
1cbc0 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c         such (ill
1cbd0 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20  egal) sub-query 
1cbe0 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68  is flattened. Th
1cbf0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65  e caller will de
1cc00 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20  tect the.**     
1cc10 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20     syntax error 
1cc20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74  and return a det
1cc30 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a  ailed message..*
1cc40 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74  *.**  (18)  If t
1cc50 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1cc60 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1cc70 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d  t, then all term
1cc80 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  s of the.**     
1cc90 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75     ORDER by clau
1cca0 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  se of the parent
1ccb0 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20   must be simple 
1ccc0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a  references to .*
1ccd0 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73  *        columns
1cce0 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
1ccf0 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20  y..**.**  (19)  
1cd00 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1cd10 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1cd20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1cd30 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
1cd40 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45        have a WHE
1cd50 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  RE clause..**.**
1cd60 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73    (20)  If the s
1cd70 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1cd80 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1cd90 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20  hen it must not 
1cda0 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  use.**        an
1cdb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1cdc0 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e  .  Ticket #3773.
1cdd0 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78    We could relax
1cde0 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
1cdf0 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77  .**        somew
1ce00 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68  hat by saying th
1ce10 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  at the terms of 
1ce20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1ce30 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20  use must.**     
1ce40 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d     appear as unm
1ce50 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63  odified result c
1ce60 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75  olumns in the ou
1ce70 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ter query.  But 
1ce80 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  we.**        hav
1ce90 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
1cea0 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f  tions in mind to
1ceb0 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20   deal with that 
1cec0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31  case..**.**  (21
1ced0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1cee0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1cef0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1cf00 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
1cf10 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
1cf20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37    (See ticket [7
1cf30 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a  52e1646fc])..**.
1cf40 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75  **  (22)  The su
1cf50 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  bquery is not a 
1cf60 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a  recursive CTE..*
1cf70 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20  *.**  (23)  The 
1cf80 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20  parent is not a 
1cf90 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f  recursive CTE, o
1cfa0 72 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  r the sub-query 
1cfb0 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20  is not a.**     
1cfc0 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72     compound quer
1cfd0 79 2e 20 54 68 69 73 20 72 65 73 74 72 69 63 74  y. This restrict
1cfe0 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74  ion is because t
1cff0 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a  ransforming the.
1d000 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74  **        parent
1d010 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   to a compound q
1d020 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68  uery confuses th
1d030 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64  e code that hand
1d040 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  les.**        re
1d050 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20  cursive queries 
1d060 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29  in multiSelect()
1d070 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54  ..**.**  (24)  T
1d080 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1d090 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1d0a0 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
1d0b0 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
1d0c0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
1d0d0 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
1d0e0 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
1d0f0 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
1d100 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
1d110 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
1d120 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
1d130 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
1d140 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
1d150 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
1d160 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
1d170 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
1d180 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
1d190 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
1d1a0 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
1d1b0 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
1d1c0 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
1d1d0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
1d1e0 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
1d1f0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
1d200 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1d210 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
1d220 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
1d230 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
1d240 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1d250 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1d260 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
1d270 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1d280 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
1d290 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
1d2a0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
1d2b0 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
1d2c0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
1d2d0 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
1d2e0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
1d2f0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
1d300 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
1d310 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
1d320 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
1d330 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
1d340 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
1d350 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1d360 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
1d370 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
1d380 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
1d390 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
1d3a0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1d3b0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1d3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d3d0 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
1d3e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d3f0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
1d400 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
1d410 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
1d420 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
1d430 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
1d440 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
1d450 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1d460 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
1d470 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1d480 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
1d490 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
1d4a0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
1d4b0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
1d4c0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1d4d0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1d4e0 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
1d4f0 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
1d500 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
1d510 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
1d520 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20  ;    /* Current 
1d530 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f  UNION ALL term o
1d540 66 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72  f the other quer
1d550 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  y */.  Select *p
1d560 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
1d570 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
1d580 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
1d590 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20   Select *pSub1; 
1d5a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d5b0 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  to the rightmost
1d5c0 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71   select in sub-q
1d5d0 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1d5e0 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
1d5f0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1d600 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1d610 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1d620 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
1d630 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1d640 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1d650 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1d660 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
1d670 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1d680 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1d690 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
1d6a0 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
1d6b0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1d6c0 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
1d6d0 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
1d6e0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1d6f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1d700 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
1d710 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d730 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1d740 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1d750 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
1d760 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
1d770 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
1d780 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1d790 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
1d7a0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
1d7b0 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1d7c0 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
1d7d0 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61  if not..  */.  a
1d7e0 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1d7f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
1d800 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61  or==0 );  /* Una
1d810 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63  ble to flatten c
1d820 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20  ompound queries 
1d830 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1d840 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
1d850 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  , SQLITE_QueryFl
1d860 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72  attener) ) retur
1d870 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
1d880 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1d890 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
1d8a0 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
1d8b0 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
1d8c0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
1d8d0 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74  From];.  iParent
1d8e0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
1d8f0 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70  rsor;.  pSub = p
1d900 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1d910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1d920 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62  !=0 );.  if( sub
1d930 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1d940 20 20 69 66 28 20 69 73 41 67 67 20 29 20 72 65    if( isAgg ) re
1d950 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d970 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d980 63 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20  ction (1)   */. 
1d990 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72     if( pSrc->nSr
1d9a0 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d9d0 69 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a  iction (2a)  */.
1d9e0 20 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65      if( (p->pWhe
1d9f0 72 65 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  re && ExprHasPro
1da00 70 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c  perty(p->pWhere,
1da10 45 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20  EP_Subquery)).  
1da20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78     || (sqlite3Ex
1da30 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70  prListFlags(p->p
1da40 45 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62 71  EList) & EP_Subq
1da50 75 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c  uery)!=0.     ||
1da60 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   (sqlite3ExprLis
1da70 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72  tFlags(p->pOrder
1da80 42 79 29 20 26 20 45 50 5f 53 75 62 71 75 65 72  By) & EP_Subquer
1da90 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  y)!=0.    ){.   
1daa0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 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 20 20                  
1dad0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1dae0 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20  tion (2b)  */.  
1daf0 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70    }.  }.    .  p
1db00 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1db10 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1db20 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
1db30 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
1db40 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
1db50 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
1db60 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
1db70 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
1db80 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
1db90 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  essions, we allo
1dba0 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
1dbb0 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
1dbc0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1dbd0 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
1dbe0 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
1dbf0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
1dc00 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1dc10 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1dc20 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
1dc30 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
1dc40 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
1dc50 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
1dc60 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
1dc70 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1dc80 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
1dc90 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dcb0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
1dcc0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1dcd0 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
1dce0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd00 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
1dd10 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
1dd20 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70  lFlags & SF_Comp
1dd30 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62  ound)!=0 && pSub
1dd40 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1dd50 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
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 20 20 20                  
1dd80 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dd90 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
1dda0 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
1ddb0 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
1ddc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ddd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dde0 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
1ddf0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1de00 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1de10 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
1de20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1de30 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a  riction (5)  */.
1de40 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1de50 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
1de60 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
1de70 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1de80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1de90 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
1dea0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1deb0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1dec0 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
1ded0 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1dee0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1def0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1df00 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
1df10 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
1df20 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
1df30 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
1df40 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
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 20 20 20 20 20 20 20                  
1df70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1df80 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
1df90 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
1dfa0 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
1dfb0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1dfc0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dfd0 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
1dfe0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1dff0 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
1e000 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1e010 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e020 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
1e030 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1e040 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
1e050 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1e060 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1e070 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1e080 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
1e090 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  /.  }.  testcase
1e0a0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1e0b0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
1e0c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
1e0d0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1e0e0 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a  SF_MinMaxAgg );.
1e0f0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1e100 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
1e110 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67  sive|SF_MinMaxAg
1e120 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
1e130 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69   0; /* Restricti
1e140 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34  ons (22) and (24
1e150 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
1e160 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1e170 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
1e180 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1e190 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
1e1a0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29  Restriction (23)
1e1b0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42   */.  }..  /* OB
1e1c0 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
1e1d0 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
1e1e0 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
1e1f0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1e200 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1e210 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
1e220 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
1e230 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1e240 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
1e250 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
1e260 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
1e270 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
1e280 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
1e290 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1e2a0 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
1e2b0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1e2c0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1e2d0 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1e2e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1e2f0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1e300 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
1e310 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
1e320 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
1e330 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
1e340 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
1e350 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
1e360 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
1e370 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1e380 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1e390 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1e3a0 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
1e3b0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
1e3c0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
1e3d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1e3e0 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
1e3f0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1e400 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1e410 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1e420 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1e430 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1e440 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
1e450 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1e460 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1e470 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1e480 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1e490 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1e4a0 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
1e4b0 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
1e4c0 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
1e4d0 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
1e4e0 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
1e4f0 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
1e500 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
1e510 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
1e520 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
1e530 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
1e540 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
1e550 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
1e560 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
1e570 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
1e580 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
1e590 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
1e5a0 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1e5b0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
1e5c0 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
1e5d0 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
1e5e0 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
1e5f0 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
1e600 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1e610 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
1e620 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
1e630 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
1e640 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
1e650 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66  if( (pSubitem->f
1e660 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
1e670 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
1e680 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1e690 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e6a0 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d   17: If the sub-
1e6b0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1e6c0 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  und SELECT, then
1e6d0 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73   it must.  ** us
1e6e0 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e  e only the UNION
1e6f0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41   ALL operator. A
1e700 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  nd none of the s
1e710 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65  imple select que
1e720 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ries.  ** that m
1e730 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f  ake up the compo
1e740 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61  und SELECT are a
1e750 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67  llowed to be agg
1e760 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e  regate or distin
1e770 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ct.  ** queries.
1e780 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
1e790 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1e7a0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
1e7b0 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  By ){.      retu
1e7c0 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69  rn 0;  /* Restri
1e7d0 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20  ction 20 */.    
1e7e0 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
1e7f0 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
1e800 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1e810 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
1e820 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
1e830 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1e840 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
1e850 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
1e860 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
1e870 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
1e880 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1e890 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1e8a0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1e8b0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
1e8c0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1e8d0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1e8e0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1e8f0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
1e900 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
1e910 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
1e920 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
1e930 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1e940 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53  EList->nExpr==pS
1e950 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
1e960 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pr );.      if( 
1e970 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1e980 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1e990 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
1e9a0 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  0.       || (pSu
1e9b0 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
1e9c0 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
1e9d0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62   .       || pSub
1e9e0 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a  1->pSrc->nSrc<1.
1e9f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1ea00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1ea10 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
1ea20 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e  e( pSub1->pSrc->
1ea30 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a  nSrc>1 );.    }.
1ea40 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  .    /* Restrict
1ea50 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69  ion 18. */.    i
1ea60 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
1ea70 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
1ea80 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1ea90 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  ii<p->pOrderBy->
1eaa0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
1eab0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
1eac0 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78  derBy->a[ii].u.x
1ead0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20  .iOrderByCol==0 
1eae0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1eaf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1eb00 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65   /***** If we re
1eb10 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
1eb20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1eb30 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a  rmitted. *****/.
1eb40 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
1eb50 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74  pParse,p,("flatt
1eb60 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65  en %s.%p from te
1eb70 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  rm %d\n",.      
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75               pSu
1eb90 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75  b->zSelName, pSu
1eba0 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f  b, iFrom));..  /
1ebb0 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
1ebc0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
1ebd0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1ebe0 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
1ebf0 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Name;.  TESTONLY
1ec00 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74  (i =) sqlite3Aut
1ec10 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1ec20 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
1ec30 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61   0, 0);.  testca
1ec40 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45  se( i==SQLITE_DE
1ec50 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  NY );.  pParse->
1ec60 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
1ec70 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1ec80 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
1ec90 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1eca0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1ecb0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
1ecc0 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
1ecd0 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
1ece0 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
1ecf0 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
1ed00 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1ed10 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
1ed20 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
1ed30 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1ed40 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
1ed50 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
1ed60 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
1ed70 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
1ed80 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
1ed90 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
1eda0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1edb0 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
1edc0 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
1edd0 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
1ede0 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
1edf0 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1ee00 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
1ee10 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
1ee20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
1ee30 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
1ee40 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1ee50 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
1ee60 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
1ee70 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
1ee80 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1ee90 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
1eea0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
1eeb0 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
1eec0 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
1eed0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
1eee0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1eef0 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
1ef00 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1ef10 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
1ef20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1ef30 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1ef40 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
1ef50 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
1ef60 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
1ef70 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
1ef80 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
1ef90 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=5
1efa0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1efb0 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
1efc0 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
1efd0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
1efe0 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1eff0 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
1f000 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1f010 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
1f020 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
1f030 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1f040 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1f050 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
1f060 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
1f070 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
1f080 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
1f090 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
1f0a0 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
1f0b0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1f0c0 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
1f0d0 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
1f0e0 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
1f0f0 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
1f100 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
1f110 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
1f120 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
1f130 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1f140 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
1f150 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
1f160 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d   Expr *pOffset =
1f170 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
1f180 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
1f190 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
1f1a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
1f1b0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1f1c0 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
1f1d0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
1f1e0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  mit = 0;.    p->
1f1f0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
1f200 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
1f210 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
1f220 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  0);.    sqlite3S
1f230 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65  electSetName(pNe
1f240 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d  w, pSub->zSelNam
1f250 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73  e);.    p->pOffs
1f260 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
1f270 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
1f280 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
1f290 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1f2a0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1f2b0 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
1f2c0 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  = TK_ALL;.    if
1f2d0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1f2e0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
1f2f0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  Prior;.    }else
1f300 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  {.      pNew->pP
1f310 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1f320 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
1f330 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
1f340 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  = pNew;.      pN
1f350 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ew->pNext = p;. 
1f360 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
1f370 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c   pNew;.      SEL
1f380 45 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73  ECTTRACE(2,pPars
1f390 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22  e,p,.         ("
1f3a0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1f3b0 79 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61  y flattener crea
1f3c0 74 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65  tes %s.%p as pee
1f3d0 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  r\n",.         p
1f3e0 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70  New->zSelName, p
1f3f0 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  New));.    }.   
1f400 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1f410 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1f420 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
1f430 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
1f440 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
1f450 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1f460 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
1f470 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
1f480 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
1f490 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
1f4a0 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
1f4b0 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
1f4c0 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
1f4d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1f4e0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1f4f0 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
1f500 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1f510 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
1f520 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1f530 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1f540 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
1f550 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1f560 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
1f570 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1f580 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
1f590 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
1f5a0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
1f5b0 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
1f5c0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
1f5d0 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
1f5e0 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
1f5f0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1f600 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
1f610 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
1f620 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
1f630 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
1f640 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
1f650 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
1f660 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
1f670 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
1f680 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
1f690 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
1f6a0 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
1f6b0 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3346..  **.  ** 
1f6c0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69  pSubitem->pTab i
1f6d0 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c  s always non-NUL
1f6e0 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69  L by test restri
1f6f0 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73  ctions and tests
1f700 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69   above..  */.  i
1f710 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74  f( ALWAYS(pSubit
1f720 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  em->pTab!=0) ){.
1f730 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
1f740 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
1f750 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
1f760 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d  TabToDel->nRef==
1f770 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
1f780 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1f790 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1f7a0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
1f7b0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
1f7c0 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
1f7d0 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1f7e0 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
1f7f0 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
1f800 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
1f810 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
1f820 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  ToDel->nRef--;. 
1f830 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65     }.    pSubite
1f840 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d  m->pTab = 0;.  }
1f850 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1f860 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  wing loop runs o
1f870 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72  nce for each ter
1f880 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  m in a compound-
1f890 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c  subquery.  ** fl
1f8a0 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73  attening (as des
1f8b0 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20  cribed above).  
1f8c0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1f8d0 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64  a different kind
1f8e0 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e  .  ** of flatten
1f8f0 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69  ing - a flatteni
1f900 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
1f910 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1f920 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20  y flattening -. 
1f930 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f   ** then this lo
1f940 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63  op only runs onc
1f950 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
1f960 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c  s loop moves all
1f970 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
1f980 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
1f990 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1f9a0 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
1f9b0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1f9c0 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
1f9d0 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
1f9e0 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
1f9f0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
1fa00 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
1fa10 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
1fa20 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
1fa30 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
1fa40 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
1fa50 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
1fa60 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
1fa70 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
1fa80 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
1fa90 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
1faa0 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
1fab0 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
1fac0 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
1fad0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1fae0 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
1faf0 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
1fb00 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
1fb10 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
1fb20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  in..  */.  for(p
1fb30 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e  Parent=p; pParen
1fb40 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65  t; pParent=pPare
1fb50 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62  nt->pPrior, pSub
1fb60 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1fb70 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b      int nSubSrc;
1fb80 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65  .    u8 jointype
1fb90 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
1fba0 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20  c = pSub->pSrc; 
1fbb0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1fbc0 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  se of subquery *
1fbd0 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20  /.    nSubSrc = 
1fbe0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20  pSubSrc->nSrc;  
1fbf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1fc00 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46  ms in subquery F
1fc10 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1fc20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
1fc30 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1fc40 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1fc50 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1fc60 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  ..    if( pSrc )
1fc70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1fc80 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f  pParent==p );  /
1fc90 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72  * First time thr
1fca0 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1fcb0 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1fcc0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a  = pSubitem->fg.j
1fcd0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
1fce0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1fcf0 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
1fd00 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
1fd10 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
1fd20 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1fd30 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
1fd40 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
1fd50 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1fd60 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
1fd70 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
1fd80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1fd90 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1fda0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1fdb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1fdc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1fdd0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1fde0 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
1fdf0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1fe00 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
1fe10 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
1fe20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
1fe30 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
1fe40 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
1fe50 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
1fe60 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
1fe70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
1fe80 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
1fe90 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
1fea0 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
1feb0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1fec0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1fed0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1fee0 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
1fef0 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
1ff00 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
1ff10 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
1ff20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1ff30 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
1ff40 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
1ff50 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
1ff60 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
1ff70 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1ff80 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
1ff90 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
1ffa0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
1ffb0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
1ffc0 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
1ffd0 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
1ffe0 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75   query FROM clau
1fff0 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20  se to 4 slots.. 
20000 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65     ** The middle
20010 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
20020 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
20030 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
20040 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72  space.    ** for
20050 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74   the two element
20060 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
20070 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
20080 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
20090 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
200a0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
200b0 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73  >pSrc = pSrc = s
200c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
200d0 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e  arge(db, pSrc, n
200e0 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
200f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
20100 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
20110 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20120 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20130 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
20140 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
20150 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
20160 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
20170 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
20180 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
20190 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
201a0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
201b0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
201c0 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69  te(db, pSrc->a[i
201d0 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b  +iFrom].pUsing);
201e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
201f0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
20200 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
20210 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
20220 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
20230 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
20240 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
20250 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
20260 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
20270 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
20280 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a  c->a[iFrom].fg.j
20290 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
202a0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
202b0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
202c0 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
202d0 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
202e0 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
202f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
20300 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
20310 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
20320 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
20330 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
20340 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
20350 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
20360 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
20370 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
20380 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
20390 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
203a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
203b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
203c0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
203d0 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
203e0 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
203f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
20400 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
20410 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20420 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
20430 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
20440 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
20450 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
20460 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
20470 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
20480 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
20490 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
204a0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
204b0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
204c0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
204d0 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
204e0 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
204f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20500 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
20510 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
20520 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
20530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
20540 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
20550 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
20560 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
20570 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20580 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
20590 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
205a0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
205b0 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
205c0 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d   }.    if( pSub-
205d0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
205e0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
205f0 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72  int, any non-zer
20600 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61  o iOrderByCol va
20610 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68  lues indicate th
20620 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
20630 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20  ORDER BY column 
20640 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64  expression is id
20650 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69  entical to the i
20660 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20  OrderByCol'th.  
20670 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
20680 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  n returned by SE
20690 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
206a0 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65  Sub. Since these
206b0 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a   values.      **
206c0 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   do not necessar
206d0 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  ily correspond t
206e0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c  o columns in SEL
206f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50  ECT statement pP
20700 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20  arent,.      ** 
20710 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65  zero them before
20720 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65   transfering the
20730 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20740 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
20750 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68   ** Not doing th
20760 69 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20  is may cause an 
20770 65 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65  error if a subse
20780 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68  quent call to th
20790 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
207a0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
207b0 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f   flatten a compo
207c0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e  und sub-query in
207d0 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20  to pParent.     
207e0 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61   ** (the only wa
207f0 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
20800 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70  n is if the comp
20810 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69  ound sub-query i
20820 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65  s.      ** curre
20830 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75  ntly part of pSu
20840 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69  b->pSrc). See ti
20850 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66  cket [d11a6e908f
20860 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ].  */.      Exp
20870 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
20880 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
20890 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
208a0 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
208b0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
208c0 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
208d0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
208e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
208f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
20900 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
20910 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
20920 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d  ( pSub->pPrior==
20930 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
20940 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
20950 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
20960 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
20970 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68  0;.    }.    pWh
20980 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
20990 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
209a0 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69  Where, 0);.    i
209b0 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
209c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
209d0 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  ( pParent->pHavi
209e0 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ng==0 );.      p
209f0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
20a00 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  = pParent->pWher
20a10 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
20a20 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
20a30 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
20a40 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
20a50 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
20a60 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
20a70 20 0a 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 20 20 20 20                  
20a90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
20aa0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
20ab0 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20  ving, 0));.     
20ac0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
20ad0 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
20ae0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20af0 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
20b00 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
20b10 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  , pSub->pGroupBy
20b20 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
20b30 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20b40 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
20b50 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
20b60 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68  ent->pWhere, pWh
20b70 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ere);.    }.    
20b80 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
20b90 70 50 61 72 65 6e 74 2c 20 69 50 61 72 65 6e 74  pParent, iParent
20ba0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20  , pSub->pEList, 
20bb0 30 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68  0);.  .    /* Th
20bc0 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
20bd0 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
20be0 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
20bf0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
20c00 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64  outer query is d
20c10 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f  istinct. .    */
20c20 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
20c30 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
20c40 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
20c50 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f  stinct;.  .    /
20c60 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  *.    ** SELECT 
20c70 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
20c80 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
20c90 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
20ca0 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a  FFSET y;.    **.
20cb0 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65      ** One is te
20cc0 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20  mpted to try to 
20cd0 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63  add a and b to c
20ce0 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74  ombine the limit
20cf0 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20  s.  But this.   
20d00 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   ** does not wor
20d10 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69  k if either limi
20d20 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20  t is negative.. 
20d30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
20d40 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
20d50 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69      pParent->pLi
20d60 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
20d70 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  it;.      pSub->
20d80 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
20d90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
20da0 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
20db0 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
20dc0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
20dd0 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
20de0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
20df0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
20e00 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53  , pSub1);..#if S
20e10 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
20e20 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
20e30 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
20e40 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  100 ){.    SELEC
20e50 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
20e60 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c  rse,p,("After fl
20e70 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a  attening:\n"));.
20e80 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
20e90 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
20ea0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
20eb0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
20ec0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
20ed0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
20ee0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
20ef0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
20f00 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21  IEW) */....#if !
20f10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
20f20 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
20f30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
20f40 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
20f50 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
20f60 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20   relevant WHERE 
20f70 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
20f80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20f90 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52  into.** the WHER
20fa0 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  E clause of subq
20fb0 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  uery.  Example:.
20fc0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
20fd0 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
20fe0 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
20ff0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78  FROM t1) WHERE x
21000 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
21010 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
21020 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nto:.**.**    SE
21030 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
21040 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20  ECT a AS x, c-d 
21050 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45  AS y FROM t1 WHE
21060 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31  RE a=5 AND c-d=1
21070 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20  0).**     WHERE 
21080 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a  x=5 AND y=10;.**
21090 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20  .** The hope is 
210a0 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61  that the terms a
210b0 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65  dded to the inne
210c0 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b  r query will mak
210d0 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66  e it more.** eff
210e0 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f  icient..**.** Do
210f0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69   not attempt thi
21100 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
21110 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 54  f:.**.**   (1) T
21120 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
21130 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  s an aggregate. 
21140 20 28 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20   (In that case, 
21150 77 65 27 64 20 72 65 61 6c 6c 79 20 77 61 6e 74  we'd really want
21160 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 63 6f 70  .**       to cop
21170 79 20 74 68 65 20 6f 75 74 65 72 20 57 48 45 52  y the outer WHER
21180 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E-clause terms o
21190 6e 74 6f 20 74 68 65 20 48 41 56 49 4e 47 20 63  nto the HAVING c
211a0 6c 61 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  lause of the.** 
211b0 20 20 20 20 20 20 69 6e 6e 65 72 20 71 75 65 72        inner quer
211c0 79 2e 20 20 42 75 74 20 74 68 65 79 20 70 72 6f  y.  But they pro
211d0 62 61 62 6c 79 20 77 6f 6e 27 74 20 68 65 6c 70  bably won't help
211e0 20 74 68 65 72 65 20 73 6f 20 64 6f 20 6e 6f 74   there so do not
211f0 20 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20   bother.).**.** 
21200 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20    (2) The inner 
21210 71 75 65 72 79 20 69 73 20 74 68 65 20 72 65 63  query is the rec
21220 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61  ursive part of a
21230 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78   common table ex
21240 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
21250 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20    (3) The inner 
21260 71 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49  query has a LIMI
21270 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20  T clause (since 
21280 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
21290 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20  he WHERE.**     
212a0 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68    close would ch
212b0 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67  ange the meaning
212c0 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a   of the LIMIT)..
212d0 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20  **.**   (4) The 
212e0 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74  inner query is t
212f0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
21300 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
21310 20 20 28 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a    (The caller.**
21320 20 20 20 20 20 20 20 65 6e 66 6f 72 63 65 73 20         enforces 
21330 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
21340 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
21350 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ine does not hav
21360 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20  e enough.**     
21370 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f    information to
21380 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   know.).**.**   
21390 28 35 29 20 54 68 65 20 57 48 45 52 45 20 63 6c  (5) The WHERE cl
213a0 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
213b0 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68  originates in th
213c0 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
213d0 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  ause.**       of
213e0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a   a LEFT JOIN..**
213f0 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
21400 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
21410 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ade and non-zero
21420 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
21430 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
21440 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63  terms are duplic
21450 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75  ated into the su
21460 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
21470 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68  c int pushDownWh
21480 65 72 65 54 65 72 6d 73 28 0a 20 20 73 71 6c 69  ereTerms(.  sqli
21490 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
214a0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
214b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f  e connection (fo
214c0 72 20 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20  r malloc()) */. 
214d0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20   Select *pSubq, 
214e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
214f0 62 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45  bquery whose WHE
21500 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20  RE clause is to 
21510 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a  be augmented */.
21520 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
21530 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
21540 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
21550 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
21560 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20  /.  int iCursor 
21570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
21580 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
21590 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b  e subquery */.){
215a0 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
215b0 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a   int nChng = 0;.
215c0 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20    if( pWhere==0 
215d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
215e0 28 20 28 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61  ( (pSubq->selFla
215f0 67 73 20 26 20 28 53 46 5f 41 67 67 72 65 67 61  gs & (SF_Aggrega
21600 74 65 7c 53 46 5f 52 65 63 75 72 73 69 76 65 29  te|SF_Recursive)
21610 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74  )!=0 ){.     ret
21620 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
21630 63 74 69 6f 6e 73 20 28 31 29 20 61 6e 64 20 28  ctions (1) and (
21640 32 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  2) */.  }.  if( 
21650 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30  pSubq->pLimit!=0
21660 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
21670 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
21680 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77  n (3) */.  }.  w
21690 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70  hile( pWhere->op
216a0 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
216b0 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77  nChng += pushDow
216c0 6e 57 68 65 72 65 54 65 72 6d 73 28 64 62 2c 20  nWhereTerms(db, 
216d0 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70  pSubq, pWhere->p
216e0 52 69 67 68 74 2c 20 69 43 75 72 73 6f 72 29 3b  Right, iCursor);
216f0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57  .    pWhere = pW
21700 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d  here->pLeft;.  }
21710 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
21720 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50  operty(pWhere,EP
21730 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
21740 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
21750 63 74 69 6f 6e 20 35 20 2a 2f 0a 20 20 69 66 28  ction 5 */.  if(
21760 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
21770 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65  bleConstant(pWhe
21780 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a  re, iCursor) ){.
21790 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20      nChng++;.   
217a0 20 77 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b   while( pSubq ){
217b0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
217c0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
217d0 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20   pWhere, 0);.   
217e0 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45     pNew = substE
217f0 78 70 72 28 64 62 2c 20 70 4e 65 77 2c 20 69 43  xpr(db, pNew, iC
21800 75 72 73 6f 72 2c 20 70 53 75 62 71 2d 3e 70 45  ursor, pSubq->pE
21810 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 53 75  List);.      pSu
21820 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  bq->pWhere = sql
21830 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
21840 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70  pSubq->pWhere, p
21850 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 53 75 62  New);.      pSub
21860 71 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f  q = pSubq->pPrio
21870 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
21880 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23  eturn nChng;.}.#
21890 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
218a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
218b0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
218c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
218d0 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
218e0 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  Based on the con
218f0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67  tents of the Agg
21900 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
21910 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
21920 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
21930 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
21940 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66   checks if the f
21950 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
21960 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  e:.**.**    * th
21970 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  e query contains
21980 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61   just a single a
21990 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
219a0 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  n,.**    * the a
219b0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
219c0 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28  n is either min(
219d0 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a  ) or max(), and.
219e0 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75  **    * the argu
219f0 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72  ment to the aggr
21a00 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
21a10 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
21a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f  ..**.** If all o
21a30 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
21a40 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45  true, then WHERE
21a50 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
21a60 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
21a70 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  X.** is returned
21a80 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
21a90 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78   Also, *ppMinMax
21aa0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
21ab0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74   to the .** list
21ac0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
21ad0 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72  ssed to the aggr
21ae0 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74  egate before ret
21af0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72  urning..**.** Or
21b00 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69  , if the conditi
21b10 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f  ons above are no
21b20 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78  t met, *ppMinMax
21b30 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
21b40 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42  .** WHERE_ORDERB
21b50 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75  Y_NORMAL is retu
21b60 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
21b70 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41  u8 minMaxQuery(A
21b80 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
21b90 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d  , ExprList **ppM
21ba0 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52  inMax){.  int eR
21bb0 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
21bc0 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20  BY_NORMAL;      
21bd0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
21be0 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e  lue */..  *ppMin
21bf0 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Max = 0;.  if( p
21c00 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
21c10 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  1 ){.    Expr *p
21c20 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Expr = pAggInfo-
21c30 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b  >aFunc[0].pExpr;
21c40 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75   /* Aggregate fu
21c50 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  nction */.    Ex
21c60 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
21c70 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
21c80 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
21c90 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69  ts to agg functi
21ca0 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  on */..    asser
21cb0 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
21cc0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
21cd0 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20  .    if( pEList 
21ce0 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
21cf0 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61  ==1 && pEList->a
21d00 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  [0].pExpr->op==T
21d10 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
21d20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
21d30 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d   *zFunc = pExpr-
21d40 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
21d50 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
21d60 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22  Cmp(zFunc, "min"
21d70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21d80 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
21d90 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20  ERBY_MIN;.      
21da0 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
21db0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  List;.      }els
21dc0 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
21dd0 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78  ICmp(zFunc, "max
21de0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
21df0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
21e00 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20  DERBY_MAX;.     
21e10 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
21e20 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  EList;.      }. 
21e30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
21e40 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30  rt( *ppMinMax==0
21e50 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d   || (*ppMinMax)-
21e60 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72  >nExpr==1 );.  r
21e70 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f  eturn eRet;.}../
21e80 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
21e90 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
21ea0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
21eb0 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
21ec0 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
21ed0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
21ee0 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
21ef0 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
21f00 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
21f10 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
21f20 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
21f30 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
21f40 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
21f50 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
21f60 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
21f70 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
21f80 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
21f90 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
21fa0 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
21fb0 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
21fc0 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
21fd0 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
21fe0 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
21ff0 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
22000 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
22010 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
22020 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
22030 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
22040 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
22050 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
22060 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
22070 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
22080 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
22090 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
220a0 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
220b0 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
220c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
220d0 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
220e0 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
220f0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
22100 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
22110 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
22120 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
22130 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
22140 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
22150 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
22160 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
22170 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
22180 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
22190 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
221a0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
221b0 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
221c0 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
221d0 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
221e0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
221f0 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
22200 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
22210 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
22220 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45  funcFlags&SQLITE
22230 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20  _FUNC_COUNT)==0 
22240 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
22250 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45  ( pExpr->flags&E
22260 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  P_Distinct ) ret
22270 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  urn 0;..  return
22280 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
22290 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  If the source-li
222a0 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61  st item passed a
222b0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61  s an argument wa
222c0 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
222d0 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42   an.** INDEXED B
222e0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
222f0 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ry to locate the
22300 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78   specified index
22310 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61  . If there.** wa
22320 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20  s such a clause 
22330 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  and the named in
22340 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  dex cannot be fo
22350 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  und, return .** 
22360 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64  SQLITE_ERROR and
22370 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
22380 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72  in pParse. Other
22390 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a  wise, populate .
223a0 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78  ** pFrom->pIndex
223b0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
223c0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
223d0 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
223e0 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  okup(Parse *pPar
223f0 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
22400 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
22410 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54  .  if( pFrom->pT
22420 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e  ab && pFrom->fg.
22430 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20  isIndexedBy ){. 
22440 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
22450 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
22460 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64    char *zIndexed
22470 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a  By = pFrom->u1.z
22480 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49  IndexedBy;.    I
22490 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
224a0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
224b0 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
224c0 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
224d0 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
224e0 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b  me, zIndexedBy);
224f0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70   .        pIdx=p
22500 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  Idx->pNext.    )
22510 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20  ;.    if( !pIdx 
22520 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22530 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
22540 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
22550 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79   %s", zIndexedBy
22560 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
22570 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
22580 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
22590 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
225a0 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d      }.    pFrom-
225b0 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78  >pIBIndex = pIdx
225c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
225d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
225e0 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e  * Detect compoun
225f0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
22600 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  nts that use an 
22610 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
22620 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65  with .** an alte
22630 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
22640 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
22650 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  *    SELECT ... 
22660 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
22670 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
22680 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f  2 ORDER BY .. CO
22690 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
226a0 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74  These are rewrit
226b0 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72  ten as a subquer
226c0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  y:.**.**    SELE
226d0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
226e0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
226f0 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
22700 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20  FROM t2).**     
22710 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c  ORDER BY ... COL
22720 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
22730 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
22740 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  on is necessary 
22750 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74  because the mult
22760 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
22770 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76   routine.** abov
22780 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  e that generates
22790 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
227a0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
227b0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
227c0 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20   clause.** uses 
227d0 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  a merge algorith
227e0 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  m that requires 
227f0 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
22800 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74  ng sequence on t
22810 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  he.** result col
22820 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f  umns as on the O
22830 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
22840 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68   See ticket.** h
22850 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
22860 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37  .org/src/info/67
22870 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54  09574d2a.**.** T
22880 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
22890 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  on is only neede
228a0 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e  d for EXCEPT, IN
228b0 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49  TERSECT, and UNI
228c0 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e  ON..** The UNION
228d0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f   ALL operator wo
228e0 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75  rks fine with mu
228f0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
22900 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  () even when.** 
22910 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54  there are COLLAT
22920 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  E terms in the O
22930 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74  RDER BY..*/.stat
22940 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f  ic int convertCo
22950 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
22960 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70  bquery(Walker *p
22970 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
22980 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
22990 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
229a0 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c  elect *pX;.  sql
229b0 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75  ite3 *db;.  stru
229c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
229d0 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *a;.  SrcList *
229e0 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65  pNewSrc;.  Parse
229f0 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65   *pParse;.  Toke
22a00 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20  n dummy;..  if( 
22a10 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  p->pPrior==0 ) r
22a20 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
22a30 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ue;.  if( p->pOr
22a40 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
22a50 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
22a60 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26    for(pX=p; pX &
22a70 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  & (pX->op==TK_AL
22a80 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  L || pX->op==TK_
22a90 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e  SELECT); pX=pX->
22aa0 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20  pPrior){}.  if( 
22ab0 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  pX==0 ) return W
22ac0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61  RC_Continue;.  a
22ad0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
22ae0 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f  a;.  for(i=p->pO
22af0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  rderBy->nExpr-1;
22b00 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
22b10 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d   if( a[i].pExpr-
22b20 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
22b30 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ate ) break;.  }
22b40 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
22b50 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
22b60 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
22b70 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
22b80 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74  that means the t
22b90 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
22ba0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20   required. */.. 
22bb0 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
22bc0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  r->pParse;.  db 
22bd0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22be0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
22bf0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
22c00 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
22c10 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
22c20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
22c30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
22c40 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  y, 0, sizeof(dum
22c50 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20  my));.  pNewSrc 
22c60 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
22c70 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
22c80 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d  Parse,0,0,0,&dum
22c90 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20  my,pNew,0,0);.  
22ca0 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29  if( pNewSrc==0 )
22cb0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
22cc0 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b  t;.  *pNew = *p;
22cd0 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65  .  p->pSrc = pNe
22ce0 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73  wSrc;.  p->pELis
22cf0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
22d00 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
22d10 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
22d20 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b  (db, TK_ASTERISK
22d30 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
22d40 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
22d50 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
22d60 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
22d70 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
22d80 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
22d90 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
22da0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
22db0 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
22dc0 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20   p->pWith = 0;. 
22dd0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
22de0 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
22df0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
22e00 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72  lags & SF_Conver
22e10 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  ted)==0 );.  p->
22e20 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
22e30 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65  onverted;.  asse
22e40 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  rt( pNew->pPrior
22e50 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  !=0 );.  pNew->p
22e60 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
22e70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  New;.  pNew->pLi
22e80 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
22e90 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
22ea0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
22eb0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  nue;.}../*.** Ch
22ec0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
22ed0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
22ee0 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74 61 62  rm pFrom has tab
22ef0 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
22f00 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  on.** arguments.
22f10 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6c 65    If it does, le
22f20 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
22f30 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20 61  sage in pParse a
22f40 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
22f50 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70 46 72  -zero, since pFr
22f60 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  om is not allowe
22f70 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c 65 2d  d to be a table-
22f80 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e  valued function.
22f90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
22fa0 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
22fb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
22fc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22fd0 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  em *pFrom){.  if
22fe0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61  ( pFrom->fg.isTa
22ff0 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c  bFunc ){.    sql
23000 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23010 72 73 65 2c 20 22 27 25 73 27 20 69 73 20 6e 6f  rse, "'%s' is no
23020 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70  t a function", p
23030 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  From->zName);.  
23040 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
23050 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
23060 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23070 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67  IT_CTE./*.** Arg
23080 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68 69  ument pWith (whi
23090 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  ch may be NULL) 
230a0 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b  points to a link
230b0 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65  ed list of neste
230c0 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65  d .** WITH conte
230d0 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20  xts, from inner 
230e0 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66  to outermost. If
230f0 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74   the table ident
23100 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f  ified by .** FRO
23110 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
23120 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79   pItem is really
23130 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d   a common-table-
23140 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29  expression (CTE)
23150 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e   .** then return
23160 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
23170 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e  e CTE definition
23180 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e   for that table.
23190 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65   Otherwise.** re
231a0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
231b0 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   If a non-NULL v
231c0 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
231d0 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74  , set *ppContext
231e0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
231f0 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20   With.** object 
23200 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65  that the returne
23210 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f  d CTE belongs to
23220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
23230 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57 69  ct Cte *searchWi
23240 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74  th(.  With *pWit
23250 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
23260 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
23270 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48 20   innermost WITH 
23280 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
23290 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
232a0 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46  *pItem,     /* F
232b0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
232c0 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f  nt to resolve */
232d0 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74  .  With **ppCont
232e0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
232f0 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20     /* OUT: WITH 
23300 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76 61  clause return va
23310 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  lue belongs to *
23320 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
23330 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
23340 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
23350 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  ==0 && (zName = 
23360 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30  pItem->zName)!=0
23370 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b   ){.    With *p;
23380 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68  .    for(p=pWith
23390 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72  ; p; p=p->pOuter
233a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
233b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
233c0 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
233d0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
233e0 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
233f0 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
23400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
23410 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b   *ppContext = p;
23420 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
23430 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  n &p->a[i];.    
23440 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23450 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23460 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f   0;.}../* The co
23470 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69  de generator mai
23480 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f  ntains a stack o
23490 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63 6c  f active WITH cl
234a0 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68  auses.** with th
234b0 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54  e inner-most WIT
234c0 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61  H clause being a
234d0 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
234e0 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
234f0 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65  is routine pushe
23500 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75 73  s the WITH claus
23510 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
23520 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
23530 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20  ** onto the top 
23540 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66  of the stack. If
23550 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20   argument bFree 
23560 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
23570 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  is.** WITH claus
23580 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
23590 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
235a0 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  stack. In this c
235b0 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64  ase it.** should
235c0 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
235d0 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20 6f  with the Parse o
235e0 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20  bject. In other 
235f0 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62  cases, when.** b
23600 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74  Free==0, the Wit
23610 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  h object will be
23620 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
23630 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a  h the SELECT .**
23640 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
23650 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73 6f  which it is asso
23660 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ciated..*/.void 
23670 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
23680 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
23690 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62  ith *pWith, u8 b
236a0 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Free){.  assert(
236b0 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50   bFree==0 || (pP
236c0 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26  arse->pWith==0 &
236d0 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54  & pParse->pWithT
236e0 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69  oFree==0) );.  i
236f0 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
23700 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
23710 70 57 69 74 68 21 3d 70 57 69 74 68 20 29 3b 0a  pWith!=pWith );.
23720 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65      pWith->pOute
23730 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  r = pParse->pWit
23740 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
23750 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
23760 20 20 69 66 28 20 62 46 72 65 65 20 29 20 70 50    if( bFree ) pP
23770 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
23780 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d  e = pWith;.  }.}
23790 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
237a0 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
237b0 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72  argument pFrom r
237c0 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64  efers to a CTE d
237d0 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61  eclared by .** a
237e0 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20   WITH clause on 
237f0 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e  the stack curren
23800 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  tly maintained b
23810 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e  y the parser. An
23820 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74  d,.** if current
23830 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  ly processing a 
23840 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  CTE expression, 
23850 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72  if it is a recur
23860 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  sive.** referenc
23870 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
23880 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   CTE..**.** If p
23890 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20  From falls into 
238a0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
238b0 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f  o categories abo
238c0 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a  ve, pFrom->pTab.
238d0 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
238e0 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  lds are populate
238f0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
23900 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
23910 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d   check.** (pFrom
23920 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65  ->pTab!=0) to de
23930 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
23940 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73  or not a success
23950 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73  ful match.** was
23960 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   found..**.** Wh
23970 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d  ether or not a m
23980 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53  atch is found, S
23990 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
239a0 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
239b0 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61  .** occurs. If a
239c0 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
239d0 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ur, an error mes
239e0 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
239f0 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20  n the.** parser 
23a00 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63  and some error c
23a10 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ode other than S
23a20 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
23a30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
23a40 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57   withExpand(.  W
23a50 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
23a60 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
23a70 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b  t_item *pFrom.){
23a80 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23a90 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
23aa0 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  se;.  sqlite3 *d
23ab0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23ac0 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
23ad0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
23ae0 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45    /* Matched CTE
23af0 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20   (or NULL if no 
23b00 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68  match) */.  With
23b10 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20   *pWith;        
23b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
23b30 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20  ITH clause that 
23b40 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  pCte belongs to 
23b50 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
23b60 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
23b70 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68  .  pCte = search
23b80 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69  With(pParse->pWi
23b90 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74  th, pFrom, &pWit
23ba0 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29  h);.  if( pCte )
23bb0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
23bc0 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  b;.    ExprList 
23bd0 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c  *pEList;.    Sel
23be0 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53  ect *pSel;.    S
23bf0 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20  elect *pLeft;   
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c10 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  Left-most SELECT
23c20 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
23c30 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73    int bMayRecurs
23c40 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ive;            
23c50 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f  /* True if compo
23c60 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e  und joined by UN
23c70 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20  ION [ALL] */.   
23c80 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74   With *pSavedWit
23c90 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
23ca0 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
23cb0 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  of pParse->pWith
23cc0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   */..    /* If p
23cd0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
23ce0 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73  non-NULL at this
23cf0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69   point, then thi
23d00 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a  s is an illegal.
23d10 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
23d20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54   reference to CT
23d30 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e  E pCte. Leave an
23d40 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
23d50 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
23d60 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74  ** early. If pCt
23d70 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e 55  e->zCteErr is NU
23d80 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  LL, then this is
23d90 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
23da0 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20   reference..    
23db0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
23dc0 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20   proceed.  */.  
23dd0 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74 65    if( pCte->zCte
23de0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
23df0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23e00 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45  rse, pCte->zCteE
23e10 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  rr, pCte->zName)
23e20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
23e30 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
23e40 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e 6e 6f   }.    if( canno
23e50 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
23e60 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  se, pFrom) ) ret
23e70 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
23e80 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
23e90 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
23ea0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  .    pFrom->pTab
23eb0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
23ec0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
23ed0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
23ee0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
23ef0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
23f00 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e  bort;.    pTab->
23f10 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  nRef = 1;.    pT
23f20 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
23f30 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
23f40 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
23f50 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
23f60 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
23f70 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
23f80 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
23f90 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
23fa0 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  76) );.    pTab-
23fb0 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
23fc0 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e  Ephemeral | TF_N
23fd0 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
23fe0 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
23ff0 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
24000 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
24010 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
24020 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
24030 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
24040 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
24050 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
24060 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a  om->pSelect );..
24070 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
24080 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73  this is a recurs
24090 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20  ive CTE. */.    
240a0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
240b0 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52  elect;.    bMayR
240c0 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65  ecursive = ( pSe
240d0 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  l->op==TK_ALL ||
240e0 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   pSel->op==TK_UN
240f0 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62  ION );.    if( b
24100 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
24110 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
24120 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
24130 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
24140 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66  t->pSrc;.      f
24150 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
24160 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
24170 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
24180 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
24190 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20   &pSrc->a[i];.  
241a0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
241b0 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20  >zDatabase==0 . 
241c0 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
241d0 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20  ->zName!=0 .    
241e0 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
241f0 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d  e3StrICmp(pItem-
24200 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e  >zName, pCte->zN
24210 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29  ame).          )
24220 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
24230 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  m->pTab = pTab;.
24240 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
24250 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
24260 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
24270 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
24280 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c         pSel->sel
24290 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75  Flags |= SF_Recu
242a0 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d  rsive;.        }
242b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
242c0 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20      /* Only one 
242d0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
242e0 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64  nce is permitted
242f0 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54  . */ .    if( pT
24300 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20  ab->nRef>2 ){.  
24310 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
24320 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  Msg(.          p
24330 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65  Parse, "multiple
24340 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72   references to r
24350 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20  ecursive table: 
24360 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  %s", pCte->zName
24370 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
24380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24390 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
243a0 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65  ssert( pTab->nRe
243b0 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e  f==1 || ((pSel->
243c0 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75  selFlags&SF_Recu
243d0 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e  rsive) && pTab->
243e0 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20  nRef==2 ));..   
243f0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
24400 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65 72   "circular refer
24410 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70  ence: %s";.    p
24420 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61 72  SavedWith = pPar
24430 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
24440 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
24450 57 69 74 68 3b 0a 20 20 20 20 73 71 6c 69 74 65  With;.    sqlite
24460 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
24470 6b 65 72 2c 20 62 4d 61 79 52 65 63 75 72 73 69  ker, bMayRecursi
24480 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ve ? pSel->pPrio
24490 72 20 3a 20 70 53 65 6c 29 3b 0a 20 20 20 20 70  r : pSel);.    p
244a0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
244b0 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70  With;..    for(p
244c0 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74  Left=pSel; pLeft
244d0 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d  ->pPrior; pLeft=
244e0 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a  pLeft->pPrior);.
244f0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65      pEList = pLe
24500 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ft->pEList;.    
24510 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20  if( pCte->pCols 
24520 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
24530 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
24540 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c  Expr!=pCte->pCol
24550 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  s->nExpr ){.    
24560 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
24570 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
24580 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c  le %s has %d val
24590 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d  ues for %d colum
245a0 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ns",.           
245b0 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45   pCte->zName, pE
245c0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74  List->nExpr, pCt
245d0 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a  e->pCols->nExpr.
245e0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
245f0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
24600 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
24610 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
24620 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
24630 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74    }.      pEList
24640 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a   = pCte->pCols;.
24650 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
24660 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
24670 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
24680 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
24690 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
246a0 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
246b0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
246c0 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  if( pSel->selFla
246d0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
246e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  e ){.        pCt
246f0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75  e->zCteErr = "mu
24700 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69 76 65  ltiple recursive
24710 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22   references: %s"
24720 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24730 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74         pCte->zCt
24740 65 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76  eErr = "recursiv
24750 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61  e reference in a
24760 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a   subquery: %s";.
24770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
24780 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
24790 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
247a0 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e      }.    pCte->
247b0 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20  zCteErr = 0;.   
247c0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
247d0 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d   pSavedWith;.  }
247e0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
247f0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
24800 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24810 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66  MIT_CTE./*.** If
24820 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73 73   the SELECT pass
24830 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
24840 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e   argument has an
24850 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54 48   associated WITH
24860 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70   .** clause, pop
24870 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61   it from the sta
24880 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  ck stored as par
24890 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f  t of the Parse o
248a0 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bject..**.** Thi
248b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
248c0 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65 63  ed as the xSelec
248d0 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c  tCallback2() cal
248e0 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69  lback by.** sqli
248f0 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
24900 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61  ) when walking a
24910 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20   SELECT tree to 
24920 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a  resolve table.**
24930 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72   names and other
24940 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
24950 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  ments. .*/.stati
24960 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70  c void selectPop
24970 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61  With(Walker *pWa
24980 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
24990 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
249a0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
249b0 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70 57 69  rse;.  With *pWi
249c0 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f  th = findRightmo
249d0 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20  st(p)->pWith;.  
249e0 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
249f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
24a00 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68  se->pWith==pWith
24a10 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
24a20 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70  pWith = pWith->p
24a30 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  Outer;.  }.}.#el
24a40 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
24a50 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
24a60 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
24a70 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
24a80 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
24a90 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
24aa0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
24ab0 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
24ac0 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
24ad0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
24ae0 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
24af0 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
24b00 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
24b10 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
24b20 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
24b30 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
24b40 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
24b50 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
24b60 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
24b70 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
24b80 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
24b90 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
24ba0 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
24bb0 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
24bc0 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
24bd0 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
24be0 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
24bf0 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
24c00 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
24c10 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24c20 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
24c30 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
24c40 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
24c50 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
24c60 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
24c70 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
24c80 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
24c90 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
24ca0 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
24cb0 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
24cc0 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
24cd0 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
24ce0 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74 65   up the persiste
24cf0 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
24d00 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
24d10 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
24d20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
24d30 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
24d40 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f  lause to accommo
24d50 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
24d60 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
24d70 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
24d80 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
24d90 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
24da0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
24db0 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
24dc0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
24dd0 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
24de0 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
24df0 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
24e00 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
24e10 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
24e20 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
24e30 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
24e40 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
24e50 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
24e60 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
24e70 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
24e80 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
24e90 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
24ea0 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
24eb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
24ec0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61  electExpander(Wa
24ed0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
24ee0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
24ef0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
24f00 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
24f10 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53  int i, j, k;.  S
24f20 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
24f30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
24f40 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
24f50 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
24f60 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
24f70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24f80 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69    Expr *pE, *pRi
24f90 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75  ght, *pExpr;.  u
24fa0 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  16 selFlags = p-
24fb0 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d  >selFlags;..  p-
24fc0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
24fd0 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20  Expanded;.  if( 
24fe0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24ff0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
25000 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
25010 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53   if( NEVER(p->pS
25020 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c  rc==0) || (selFl
25030 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
25040 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
25050 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
25060 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
25070 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
25080 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
25090 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 78 53   if( pWalker->xS
250a0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 3d 3d  electCallback2==
250b0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 29 7b  selectPopWith ){
250c0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74 68  .    sqlite3With
250d0 50 75 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e  Push(pParse, fin
250e0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
250f0 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  With, 0);.  }.. 
25100 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
25110 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
25120 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
25130 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
25140 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
25150 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
25160 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
25170 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
25180 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
25190 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
251a0 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
251b0 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
251c0 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
251d0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
251e0 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
251f0 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
25200 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
25210 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
25220 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
25230 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
25240 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
25250 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
25260 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
25270 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
25280 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
25290 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
252a0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
252b0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
252c0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
252d0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
252e0 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
252f0 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d  sive==0 || pFrom
25300 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ->pTab!=0 );.   
25310 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
25320 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e  sRecursive ) con
25330 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
25340 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
25350 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
25360 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
25370 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28   if( withExpand(
25380 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20  pWalker, pFrom) 
25390 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
253a0 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  rt;.    if( pFro
253b0 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73  m->pTab ) {} els
253c0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
253d0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
253e0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
253f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
25400 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
25410 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
25420 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
25430 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
25440 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
25450 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
25460 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
25470 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
25480 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
25490 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
254a0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
254b0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
254c0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
254d0 6f 72 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  ort;.      pFrom
254e0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
254f0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
25500 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
25510 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66  able));.      if
25520 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
25530 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25540 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
25550 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   1;.      pTab->
25560 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
25570 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
25580 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64  te_sq_%p", (void
25590 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77  *)pTab);.      w
255a0 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
255b0 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65  or ){ pSel = pSe
255c0 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20  l->pPrior; }.   
255d0 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
255e0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
255f0 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69  arse, pSel->pELi
25600 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26  st,&pTab->nCol,&
25610 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
25620 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
25630 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
25640 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
25650 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
25660 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
25670 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20  48576) );.      
25680 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
25690 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
256a0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
256b0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
256c0 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
256d0 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
256e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
256f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
25700 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
25710 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
25720 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
25730 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
25740 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72  m(pParse, 0, pFr
25750 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  om);.      if( p
25760 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
25770 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
25780 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d   if( pTab->nRef=
25790 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  =0xffff ){.     
257a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
257b0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
257c0 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
257d0 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36  to \"%s\": max 6
257e0 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20  5535",.         
257f0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
25800 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
25810 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
25820 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25830 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
25840 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20   pTab->nRef++;. 
25850 20 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74       if( !IsVirt
25860 75 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e  ual(pTab) && can
25870 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
25880 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
25890 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
258a0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
258b0 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  }.#if !defined(S
258c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
258d0 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
258e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
258f0 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
25900 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
25910 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  ) || pTab->pSele
25920 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31  ct ){.        i1
25930 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  6 nCol;.        
25940 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
25950 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
25960 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
25970 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25980 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25990 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
259a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  0 );.        pFr
259b0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
259c0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
259d0 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
259e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
259f0 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
25a00 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  me(pFrom->pSelec
25a10 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
25a20 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
25a30 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  pTab->nCol;.    
25a40 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
25a50 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   -1;.        sql
25a60 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
25a70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
25a80 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
25a90 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43   pTab->nCol = nC
25aa0 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ol;.      }.#end
25ab0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
25ac0 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
25ad0 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
25ae0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
25af0 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
25b00 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
25b10 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
25b20 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
25b30 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
25b40 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
25b50 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
25b60 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
25b70 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
25b80 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
25b90 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
25ba0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
25bb0 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
25bc0 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
25bd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
25be0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
25bf0 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
25c00 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
25c10 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
25c20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
25c30 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
25c40 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
25c50 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
25c60 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
25c70 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
25c80 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
25c90 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
25ca0 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
25cb0 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
25cc0 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
25cd0 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70  e TK_ASTERISK op
25ce0 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
25cf0 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
25d00 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  d in the column.
25d10 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20    ** list.  The 
25d20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
25d30 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
25d40 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53  e the TK_ASTERIS
25d50 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  K.  ** expressio
25d60 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61  ns and expand ea
25d70 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
25d80 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
25d90 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61  s in.  ** all ta
25da0 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
25db0 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
25dc0 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
25dd0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
25de0 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
25df0 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
25e00 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
25e10 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
25e20 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
25e30 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73  {.    pE = pELis
25e40 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
25e50 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
25e60 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
25e70 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
25e80 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
25e90 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
25ea0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25eb0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
25ec0 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
25ed0 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
25ee0 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
25ef0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
25f00 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
25f10 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op==TK_ASTERISK
25f20 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
25f30 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
25f40 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
25f50 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
25f60 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
25f70 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
25f80 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
25f90 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
25fa0 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
25fb0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
25fc0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
25fd0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
25fe0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
25ff0 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
26000 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
26010 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
26020 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
26030 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
26040 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
26050 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
26060 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
26070 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
26080 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
26090 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
260a0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
260b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
260c0 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
260d0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
260e0 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
260f0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
26100 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
26110 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
26120 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
26130 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52   pRight = pE->pR
26140 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
26150 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
26160 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20  OT || pRight!=0 
26170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
26180 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
26190 0a 20 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e  .       && (pE->
261a0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
261b0 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54  ight->op!=TK_AST
261c0 45 52 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a  ERISK).      ){.
261d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
261e0 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65  particular expre
261f0 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ssion does not n
26200 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
26210 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
26220 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
26230 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
26240 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
26250 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20  , a[k].pExpr);. 
26260 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
26270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
26280 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
26290 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
262a0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
262b0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
262c0 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d  nExpr-1].zSpan =
262d0 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20   a[k].zSpan;.   
262e0 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d         a[k].zNam
262f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
26300 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b   a[k].zSpan = 0;
26310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26320 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
26330 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
26340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
26350 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
26360 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
26370 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
26380 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
26390 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
263a0 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
263b0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
263c0 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
263d0 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
263e0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
263f0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
26400 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
26410 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
26420 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
26430 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DOT ){.         
26440 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65   assert( pE->pLe
26450 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ft!=0 );.       
26460 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
26470 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e  HasProperty(pE->
26480 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c  pLeft, EP_IntVal
26490 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
264a0 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c   zTName = pE->pL
264b0 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  eft->u.zToken;. 
264c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
264d0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
264e0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
264f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
26500 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
26510 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
26520 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
26530 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  b;.          Sel
26540 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f  ect *pSub = pFro
26550 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
26560 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
26570 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
26580 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
26590 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68  const char *zSch
265a0 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  emaName = 0;.   
265b0 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
265c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
265d0 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  abName==0 ){.   
265e0 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
265f0 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
26600 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26610 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
26620 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
26630 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eak;.          i
26640 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70  f( pSub==0 || (p
26650 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
26660 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d  SF_NestedFrom)==
26670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26680 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20   pSub = 0;.     
26690 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
266a0 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
266b0 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
266c0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
266d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
266e0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
266f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44  }.            iD
26700 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
26710 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
26720 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
26730 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
26740 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20  Name = iDb>=0 ? 
26750 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
26760 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20  me : "*";.      
26770 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26780 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
26790 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
267a0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
267b0 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
267c0 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l[j].zName;.    
267d0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43          char *zC
267e0 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20  olname;  /* The 
267f0 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  computed column 
26800 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
26810 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65      char *zToFre
26820 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64  e;   /* Malloced
26830 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65   string that nee
26840 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ds to be freed *
26850 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f  /.            To
26860 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ken sColname;  /
26870 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  * Computed colum
26880 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65  n name as a toke
26890 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20  n */..          
268a0 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20    assert( zName 
268b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
268c0 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75  f( zTName && pSu
268d0 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  b.             &
268e0 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70  & sqlite3MatchSp
268f0 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c  anName(pSub->pEL
26900 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c  ist->a[j].zSpan,
26910 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d   0, zTName, 0)==
26920 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  0.            ){
26930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
26940 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
26950 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
26960 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
26970 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
26980 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69  'hidden', omit i
26990 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e  t from the expan
269a0 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
269b0 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
269c0 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45  st unless the SE
269d0 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f  LECT has the SF_
269e0 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20  IncludeHidden.  
269f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74            ** bit
26a00 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20   set..          
26a10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
26a20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
26a30 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69  s & SF_IncludeHi
26a40 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20  dden)==0.       
26a50 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65        && IsHidde
26a60 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
26a70 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20  Col[j]) .       
26a80 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26a90 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
26aa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26ab0 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
26ac0 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  een = 1;..      
26ad0 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
26ae0 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
26af0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26b00 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pFrom->fg.joint
26b10 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
26b20 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
26b30 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64       && tableAnd
26b40 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  ColumnIndex(pTab
26b50 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  List, i, zName, 
26b60 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20  0, 0).          
26b70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26b80 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
26b90 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
26ba0 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
26bb0 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
26bd0 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67  table to the rig
26be0 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ht of the join *
26bf0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
26c00 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26c10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26c20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
26c30 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
26c40 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20  (pFrom->pUsing, 
26c50 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26c70 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
26c80 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
26c90 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
26ca0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
26cb0 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
26cc0 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
26cd0 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
26ce0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
26cf0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26d00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26d10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26d20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
26d30 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
26d40 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20  TK_ID, zName);. 
26d50 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
26d60 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
26d70 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
26d80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
26d90 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
26da0 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
26db0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
26dc0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
26dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26de0 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
26df0 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
26e00 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
26e10 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
26e20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
26e30 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
26e40 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
26e60 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b  ( zSchemaName ){
26e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26e80 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
26e90 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
26ea0 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20  zSchemaName);.  
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
26ec0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
26ed0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
26ee0 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c  T, pLeft, pExpr,
26ef0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
26f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26f10 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
26f20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26f30 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73      zColname = s
26f40 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
26f50 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  , "%s.%s", zTabN
26f60 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
26f70 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f               zTo
26f80 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  Free = zColname;
26f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
26fb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
26fc0 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
26fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
26ff0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
27000 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
27010 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20   pNew, pExpr);. 
27020 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27030 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f  e3TokenInit(&sCo
27040 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  lname, zColname)
27050 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
27060 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
27070 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65  Name(pParse, pNe
27080 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29  w, &sColname, 0)
27090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
270a0 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65  ( pNew && (p->se
270b0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
270c0 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20  edFrom)!=0 ){.  
270d0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
270e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
270f0 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b   *pX = &pNew->a[
27100 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  pNew->nExpr-1];.
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
27120 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ( pSub ){.      
27130 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
27140 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
27150 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  trDup(db, pSub->
27160 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
27170 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  an);.           
27180 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
27190 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
271b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
271c0 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
271d0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
271e0 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20  b, "%s.%s.%s",. 
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
27220 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c  aName, zTabName,
27230 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
27240 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
27250 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
27260 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
27270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27280 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54      pX->bSpanIsT
27290 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ab = 1;.        
272a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
272b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
272c0 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20  db, zToFree);.  
272d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
272e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
272f0 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
27300 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
27310 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
27320 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
27330 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
27340 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
27350 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
27360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27370 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
27380 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
27390 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
273a0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
273b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
273c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
273d0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
273e0 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a  te(db, pEList);.
273f0 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
27400 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51  pNew;.  }.#if SQ
27410 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
27420 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20    if( p->pEList 
27430 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  && p->pEList->nE
27440 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
27450 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
27460 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
27470 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27480 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
27490 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
274a0 65 74 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  et");.    return
274b0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
274c0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
274d0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
274e0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
274f0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
27500 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
27510 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
27520 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
27530 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
27540 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
27550 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
27560 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
27570 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
27580 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
27590 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
275a0 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
275b0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
275c0 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
275d0 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
275e0 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
275f0 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
27600 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
27610 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
27620 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
27630 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
27640 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27650 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  ExprWalkNoop(Wal
27660 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
27670 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
27680 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27690 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
276a0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
276b0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
276c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
276d0 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
276e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
276f0 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
27700 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
27710 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
27720 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
27730 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
27740 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
27750 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
27760 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
27770 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
27780 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
27790 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
277a0 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
277b0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
277c0 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
277d0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
277e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
277f0 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
27800 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
27810 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
27820 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
27830 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
27840 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
27850 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
27860 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
27870 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
27880 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
27890 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
278a0 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
278b0 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
278c0 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
278d0 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
278e0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
278f0 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
27900 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
27910 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
27920 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
27930 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
27940 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
27950 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
27960 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
27970 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
27980 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
27990 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
279a0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68  .  if( pParse->h
279b0 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20  asCompound ){.  
279c0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
279d0 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d  ack = convertCom
279e0 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62  poundSelectToSub
279f0 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74  query;.    sqlit
27a00 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
27a10 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20   pSelect);.  }. 
27a20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
27a30 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
27a40 64 65 72 3b 0a 20 20 69 66 28 20 28 70 53 65 6c  der;.  if( (pSel
27a50 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
27a60 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 29 3d 3d  SF_MultiValue)==
27a70 30 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65  0 ){.    w.xSele
27a80 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
27a90 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 7d  lectPopWith;.  }
27aa0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
27ab0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
27ac0 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
27ad0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
27ae0 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ERY./*.** This i
27af0 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  s a Walker.xSele
27b00 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62  ctCallback callb
27b10 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
27b20 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66  te3SelectTypeInf
27b30 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  o().** interface
27b40 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
27b50 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
27b60 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d  query, add Colum
27b70 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75  n.zType and Colu
27b80 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f  mn.zColl.** info
27b90 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54  rmation to the T
27ba0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
27bb0 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
27bc0 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  he result set.**
27bd0 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72   of that subquer
27be0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62  y..**.** The Tab
27bf0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
27c00 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
27c10 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20   result set was 
27c20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62  constructed.** b
27c30 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  y selectExpander
27c40 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20  () but the type 
27c50 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
27c60 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d  formation was om
27c70 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74  itted.** at that
27c80 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69   point because i
27c90 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e  dentifiers had n
27ca0 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f  ot yet been reso
27cb0 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  lved.  This.** r
27cc0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
27cd0 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65   after identifie
27ce0 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  r resolution..*/
27cf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
27d00 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
27d10 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
27d20 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
27d30 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
27d40 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
27d50 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
27d60 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
27d70 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
27d80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
27d90 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
27da0 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73 73 65 72  olved );.  asser
27db0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
27dc0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
27dd0 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c  )==0 );.  p->sel
27de0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54  Flags |= SF_HasT
27df0 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  ypeInfo;.  pPars
27e00 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
27e10 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  rse;.  pTabList 
27e20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72  = p->pSrc;.  for
27e30 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
27e40 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
27e50 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
27e60 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
27e70 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
27e80 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
27e90 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
27ea0 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
27eb0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
27ec0 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
27ed0 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
27ee0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
27ef0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
27f00 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  T */.      Selec
27f10 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
27f20 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
27f30 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
27f40 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
27f50 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d  >pPrior ) pSel =
27f60 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSel->pPrior;. 
27f70 20 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64         selectAdd
27f80 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
27f90 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
27fa0 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  Tab, pSel);.    
27fb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
27fc0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
27fd0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
27fe0 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
27ff0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
28000 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
28010 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
28020 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
28030 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
28040 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
28050 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
28060 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
28070 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
28080 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
28090 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
280a0 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
280b0 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
280c0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
280d0 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
280e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
280f0 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
28100 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
28110 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
28120 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
28130 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71   = selectAddSubq
28140 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20  ueryTypeInfo;.  
28150 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
28160 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
28170 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
28180 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
28190 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
281a0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
281b0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
281c0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
281d0 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61   up a SELECT sta
281e0 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
281f0 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
28200 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
28210 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
28220 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
28230 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
28240 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
28250 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
28260 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
28270 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
28280 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
28290 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
282a0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
282b0 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
282c0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
282d0 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
282e0 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
282f0 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
28300 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
28310 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
28320 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
28330 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
28340 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
28350 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
28360 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
28370 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28380 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
28390 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
283a0 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
283b0 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
283c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
283d0 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
283e0 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
283f0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
28400 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
28410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
28420 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
28430 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
28440 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
28450 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
28460 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
28470 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
28480 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
28490 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
284a0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
284b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
284c0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
284d0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
284e0 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
284f0 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
28500 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
28510 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
28520 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b  pand(pParse, p);
28530 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
28540 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
28550 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
28560 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
28570 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
28580 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
28590 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  C);.  if( pParse
285a0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
285b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
285c0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
285d0 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
285e0 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f  pParse, p);.}../
285f0 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
28600 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
28610 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
28620 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
28630 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
28640 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
28650 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
28660 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
28670 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
28680 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
28690 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
286a0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
286b0 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c   that stores NUL
286c0 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
286d0 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c  se memory.** cel
286e0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
286f0 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
28700 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
28710 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
28720 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
28730 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
28740 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
28750 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
28760 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e   *pFunc;.  int n
28770 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Reg = pAggInfo->
28780 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f  nFunc + pAggInfo
28790 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28  ->nColumn;.  if(
287a0 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nReg==0 ) retur
287b0 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  n;.#ifdef SQLITE
287c0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
287d0 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49  fy that all AggI
287e0 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72  nfo registers ar
287f0 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  e within the ran
28800 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a  ge specified by.
28810 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52    ** AggInfo.mnR
28820 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65  eg..AggInfo.mxRe
28830 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  g */.  assert( n
28840 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg==pAggInfo->m
28850 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d  xReg-pAggInfo->m
28860 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28  nReg+1 );.  for(
28870 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
28880 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
28890 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
288a0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
288b0 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
288c0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
288d0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
288e0 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
288f0 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20  ->mxReg );.  }. 
28900 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
28910 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
28920 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
28930 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
28940 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
28950 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
28960 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   && pAggInfo->aF
28970 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  unc[i].iMem<=pAg
28980 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
28990 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
289a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
289b0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41  , OP_Null, 0, pA
289c0 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70  ggInfo->mnReg, p
289d0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b  AggInfo->mxReg);
289e0 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
289f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
28a00 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
28a10 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
28a20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75  ++){.    if( pFu
28a30 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
28a40 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
28a50 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
28a60 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
28a70 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
28a80 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pE, EP_xIsSele
28a90 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
28aa0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20   pE->x.pList==0 
28ab0 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pE->x.pList->
28ac0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
28ad0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
28ae0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
28af0 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73  TINCT aggregates
28b00 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
28b10 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20  ly one ".       
28b20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b      "argument");
28b30 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
28b40 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
28b50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28b60 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
28b70 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
28b80 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
28b90 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  rse, pE->x.pList
28ba0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
28bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28bc0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
28bd0 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
28be0 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  Distinct, 0, 0,.
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
28c10 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
28c20 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
28c30 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
28c40 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
28c50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
28c60 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
28c70 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
28c80 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
28c90 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
28ca0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
28cb0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
28cc0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
28cd0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
28ce0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
28cf0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
28d00 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
28d10 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
28d20 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
28d30 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
28d40 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
28d50 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
28d60 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
28d70 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
28d80 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
28d90 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
28da0 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
28db0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
28dc0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
28dd0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
28de0 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
28df0 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
28e00 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30  st->nExpr : 0, 0
28e10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28e20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
28e30 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
28e40 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
28e50 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
28e60 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
28e70 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
28e80 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
28e90 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
28ea0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
28eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
28ec0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
28ed0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
28ee0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
28ef0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
28f00 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
28f10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
28f20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e  regHit = 0;.  in
28f30 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20  t addrHitTest = 
28f40 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  0;.  struct AggI
28f50 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
28f60 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
28f70 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
28f80 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
28f90 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 1;.  for(i=0, 
28fa0 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
28fb0 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
28fc0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
28fd0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
28fe0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
28ff0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
29000 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
29010 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
29020 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
29030 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
29040 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
29050 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
29060 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
29070 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
29080 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
29090 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
290a0 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
290b0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
290c0 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
290d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
290e0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
290f0 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20  ist, regAgg, 0, 
29100 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
29110 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29120 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20     nArg = 0;.   
29130 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20     regAgg = 0;. 
29140 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
29150 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
29160 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
29170 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
29180 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
29190 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d   testcase( nArg=
291a0 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20  =0 );  /* Error 
291b0 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20  condition */.   
291c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72     testcase( nAr
291d0 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f  g>1 );   /* Also
291e0 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
291f0 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
29200 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
29210 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
29220 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
29230 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
29240 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
29250 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
29260 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
29270 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
29280 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
29290 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
292a0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
292b0 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
292c0 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
292d0 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
292e0 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
292f0 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
29300 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
29310 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
29320 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
29330 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
29340 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
29350 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
29360 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
29370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29380 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
29390 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
293a0 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
293b0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
293c0 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30     if( regHit==0
293d0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41   && pAggInfo->nA
293e0 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67  ccumulator ) reg
293f0 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Hit = ++pParse->
29400 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
29410 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
29420 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67   OP_CollSeq, reg
29430 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Hit, 0, 0, (char
29440 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
29450 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LSEQ);.    }.   
29460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29470 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p4(v, OP_AggStep
29480 30 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  0, 0, regAgg, pF
29490 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
294b0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
294c0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
294d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
294e0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
294f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
29500 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
29510 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
29520 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
29530 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
29540 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
29550 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
29560 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
29570 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29580 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
29590 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
295a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
295b0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
295c0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
295d0 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
295e0 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
295f0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
29600 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
29610 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
29620 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
29630 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
29640 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
29650 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
29660 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
29670 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
29680 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
29690 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
296a0 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
296b0 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
296c0 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
296d0 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
296e0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
296f0 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
29700 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
29710 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
29720 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
29730 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
29740 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
29750 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
29760 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
29770 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
29780 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
29790 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
297a0 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
297b0 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
297c0 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
297d0 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
297e0 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
297f0 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
29800 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
29810 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
29820 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  gHit); VdbeCover
29830 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
29840 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
29850 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
29860 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
29870 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
29880 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
29890 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
298a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
298b0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
298c0 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
298d0 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
298e0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
298f0 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
29900 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
29910 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69  e);.  if( addrHi
29920 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c  tTest ){.    sql
29930 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
29940 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29  (v, addrHitTest)
29950 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
29960 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45  dd a single OP_E
29970 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
29980 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74  on to the VDBE t
29990 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70  o explain a simp
299a0 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71  le.** count(*) q
299b0 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f  uery ("SELECT co
299c0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62  unt(*) FROM pTab
299d0 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ")..*/.#ifndef S
299e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
299f0 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  IN.static void e
29a00 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
29a10 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
29a20 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
29a30 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
29a40 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
29a50 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
29a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
29a70 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
29a80 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
29a90 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
29aa0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29ab0 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
29ac0 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a   scan, or NULL *
29ad0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
29ae0 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
29af0 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20  .    int bCover 
29b00 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48  = (pIdx!=0 && (H
29b10 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
29b20 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
29b30 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20  dex(pIdx)));.   
29b40 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71   char *zEqp = sq
29b50 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
29b60 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54  rse->db, "SCAN T
29b70 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20  ABLE %s%s%s",.  
29b80 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
29b90 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  e,.        bCove
29ba0 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45  r ? " USING COVE
29bb0 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22  RING INDEX " : "
29bc0 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  ",.        bCove
29bd0 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  r ? pIdx->zName 
29be0 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  : "".    );.    
29bf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29c00 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  4(.        pPars
29c10 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70  e->pVdbe, OP_Exp
29c20 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
29c30 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
29c40 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  Eqp, P4_DYNAMIC.
29c50 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
29c60 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
29c70 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
29c80 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
29c90 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
29ca0 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e for the SELECT
29cb0 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
29cc0 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65   in the p argume
29cd0 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nt.  .**.** The 
29ce0 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75  results are retu
29cf0 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  rned according t
29d00 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  o the SelectDest
29d10 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53   structure..** S
29d20 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73  ee comments in s
29d30 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66  qliteInt.h for f
29d40 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
29d50 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
29d60 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
29d70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
29d80 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
29d90 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
29da0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
29db0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
29dc0 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
29dd0 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
29de0 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
29df0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
29e00 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
29e10 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
29e20 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
29e30 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
29e40 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
29e50 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hat..*/.int sqli
29e60 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
29e70 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
29e80 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
29e90 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
29ea0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
29eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
29ec0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
29ed0 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
29ee0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
29ef0 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t      /* What t
29f00 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
29f10 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
29f20 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
29f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
29f40 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
29f50 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
29f60 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
29f70 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
29f80 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
29f90 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
29fa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
29fb0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
29fc0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
29fd0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29ff0 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
2a000 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
2a010 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
2a020 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b  ist *pEList = 0;
2a030 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
2a040 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
2a050 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
2a060 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
2a070 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
2a080 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
2a090 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
2a0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a0b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2a0c0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
2a0d0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
2a0e0 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
2a0f0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
2a100 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
2a110 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
2a120 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a130 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
2a140 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
2a150 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
2a160 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2a170 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
2a180 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
2a190 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73  .  DistinctCtx s
2a1a0 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66  Distinct; /* Inf
2a1b0 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
2a1c0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
2a1d0 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43  yword */.  SortC
2a1e0 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20  tx sSort;       
2a1f0 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77    /* Info on how
2a200 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44   to code the ORD
2a210 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2a220 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
2a230 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
2a240 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
2a250 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
2a260 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a280 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
2a290 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
2a2a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2a2b0 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
2a2c0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
2a2d0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e  nection */..#ifn
2a2e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a2f0 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52  EXPLAIN.  int iR
2a300 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d  estoreSelectId =
2a310 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
2a320 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53  Id;.  pParse->iS
2a330 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
2a340 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b  ->iNextSelectId+
2a350 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20  +;.#endif..  db 
2a360 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2a370 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
2a380 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
2a390 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
2a3a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2a3b0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
2a3c0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
2a3d0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
2a3e0 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
2a3f0 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
2a400 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
2a410 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23  of(sAggInfo));.#
2a420 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2a430 4e 41 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d  NABLED.  pParse-
2a440 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b  >nSelectIndent++
2a450 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  ;.  SELECTTRACE(
2a460 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65  1,pParse,p, ("be
2a470 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c  gin processing:\
2a480 6e 22 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  n"));.  if( sqli
2a490 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2a4a0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71   0x100 ){.    sq
2a4b0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2a4c0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2a4d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
2a4e0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2a4f0 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2a500 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st!=SRT_DistFifo
2a510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2a520 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2a530 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2a540 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  T_Fifo );.  asse
2a550 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2a560 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2a570 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st!=SRT_DistQueu
2a580 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
2a590 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2a5a0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2a5b0 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66  RT_Queue );.  if
2a5c0 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
2a5d0 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2a5e0 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65   assert(pDest->e
2a5f0 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73  Dest==SRT_Exists
2a600 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2a610 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a  ==SRT_Union || .
2a620 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2a630 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63  ->eDest==SRT_Exc
2a640 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ept || pDest->eD
2a650 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
2a660 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
2a670 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a680 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74  _Queue  || pDest
2a690 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2a6a0 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20  tFifo ||.       
2a6b0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2a6c0 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ==SRT_DistQueue 
2a6d0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2a6e0 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20  =SRT_Fifo);.    
2a6f0 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
2a700 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
2a710 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
2a720 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
2a730 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
2a740 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
2a750 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
2a760 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2a770 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
2a780 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
2a790 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
2a7a0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
2a7b0 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
2a7c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
2a7d0 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
2a7e0 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65  , p, 0);.  memse
2a7f0 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a  t(&sSort, 0, siz
2a800 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73  eof(sSort));.  s
2a810 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2a820 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
2a830 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2a840 63 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  c;.  if( pParse-
2a850 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
2a860 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2a870 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2a880 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2a890 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
2a8a0 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65    isAgg = (p->se
2a8b0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2a8c0 65 67 61 74 65 29 21 3d 30 3b 0a 23 69 66 20 53  egate)!=0;.#if S
2a8d0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2a8e0 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
2a8f0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2a900 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  100 ){.    SELEC
2a910 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2a920 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e  rse,p, ("after n
2a930 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c  ame resolution:\
2a940 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
2a950 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2a960 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2a970 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20 49 66 20 77  ndif...  /* If w
2a980 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
2a990 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
2a9a0 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
2a9b0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
2a9c0 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
2a9d0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2a9e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2a9f0 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
2aa00 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
2aa10 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
2aa20 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  st, p->pEList->n
2aa30 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74  Expr) ){.    got
2aa40 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2aa50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54  }.#endif..  /* T
2aa60 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ry to flatten su
2aa70 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  bqueries in the 
2aa80 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69  FROM clause up i
2aa90 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65  nto the main que
2aaa0 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  ry.  */.#if !def
2aab0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2aac0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
2aad0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2aae0 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
2aaf0 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
2ab00 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
2ab10 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2ab20 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ab30 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2ab40 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2ab50 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2ab60 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2ab70 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
2ab80 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2ab90 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
2aba0 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2abb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
2abc0 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74   /* Catch mismat
2abd0 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72  ch in the declar
2abe0 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20  ed columns of a 
2abf0 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d  view and the num
2ac00 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f  ber of.    ** co
2ac10 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  lumns in the SEL
2ac20 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a  ECT on the RHS *
2ac30 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  /.    if( pTab->
2ac40 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69  nCol!=pSub->pELi
2ac50 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
2ac60 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2ac70 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65  sg(pParse, "expe
2ac80 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
2ac90 66 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74  for '%s' but got
2aca0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
2acc0 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e  ->nCol, pTab->zN
2acd0 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ame, pSub->pELis
2ace0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
2acf0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2ad00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 41  ;.    }..    isA
2ad10 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73  ggSub = (pSub->s
2ad20 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2ad30 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20  regate)!=0;.    
2ad40 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
2ad50 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
2ad60 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75  , isAgg, isAggSu
2ad70 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
2ad80 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
2ad90 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
2ada0 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
2adb0 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
2adc0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
2add0 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
2ade0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2adf0 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
2ae00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
2ae10 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
2ae20 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2ae30 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  c;.    if( db->m
2ae40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2ae50 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2ae60 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
2ae70 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2ae80 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  ){.      sSort.p
2ae90 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2aea0 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
2aeb0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
2aec0 74 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20  t a pointer the 
2aed0 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
2aee0 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ruction, allocat
2aef0 69 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69  ing a new VDBE i
2af00 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20  f one.  ** does 
2af10 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
2af20 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  t */.  v = sqlit
2af30 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2af40 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
2af50 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2af60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2af70 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2af80 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c  ELECT.  /* Handl
2af90 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
2afa0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  T statements usi
2afb0 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ng the separate 
2afc0 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20  multiSelect().  
2afd0 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20  ** procedure..  
2afe0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
2aff0 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
2b000 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
2b010 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
2b020 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2b030 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2b040 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2b050 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45  electId);.#if SE
2b060 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2b070 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
2b080 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
2b090 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
2b0a0 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
2b0b0 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
2b0c0 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
2b0d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2b0e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2b0f0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
2b100 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
2b110 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
2b120 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
2b130 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2b140 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2b150 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2b160 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2b170 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  W).  for(i=0; i<
2b180 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2b190 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2b1a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2b1b0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2b1c0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
2b1d0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
2b1e0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
2b1f0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
2b200 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2b210 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
2b220 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68   /* Sometimes th
2b230 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62  e code for a sub
2b240 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65  query will be ge
2b250 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61  nerated more tha
2b260 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69  n.    ** once, i
2b270 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2b280 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48  s part of the WH
2b290 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ERE clause in a 
2b2a0 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a  LEFT JOIN,.    *
2b2b0 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  * for example.  
2b2c0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f  In that case, do
2b2d0 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20   not regenerate 
2b2e0 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69  the code to mani
2b2f0 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69  fest.    ** a vi
2b300 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75  ew or the co-rou
2b310 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tine to implemen
2b320 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66  t a view.  The f
2b330 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20  irst instance.  
2b340 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65    ** is sufficie
2b350 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73  nt, though the s
2b360 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e  ubroutine to man
2b370 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64  ifest the view d
2b380 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  oes need.    ** 
2b390 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67  to be invoked ag
2b3a0 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
2b3b0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2b3c0 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ub ){.      if( 
2b3d0 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
2b3e0 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  outine==0 ){.   
2b3f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b400 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2b410 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ub, pItem->regRe
2b420 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64  turn, pItem->add
2b430 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20  rFillSub);.     
2b440 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75   }.      continu
2b450 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
2b460 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
2b470 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
2b480 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
2b490 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
2b4a0 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
2b4b0 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  erred to by this
2b4c0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
2b4d0 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
2b4e0 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
2b4f0 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
2b500 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
2b510 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
2b520 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
2b530 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
2b540 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
2b550 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
2b560 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
2b570 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
2b580 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
2b590 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
2b5a0 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
2b5b0 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
2b5c0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
2b5d0 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
2b5e0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
2b5f0 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f  ..    /* Make co
2b600 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74  pies of constant
2b610 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65   WHERE-clause te
2b620 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  rms in the outer
2b630 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20   query down.    
2b640 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75  ** inside the su
2b650 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61  bquery.  This ca
2b660 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75  n help the subqu
2b670 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20  ery to run more 
2b680 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20  efficiently..   
2b690 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74   */.    if( (pIt
2b6a0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
2b6b0 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20  & JT_OUTER)==0. 
2b6c0 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57      && pushDownW
2b6d0 68 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70 53  hereTerms(db, pS
2b6e0 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  ub, p->pWhere, p
2b6f0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20  Item->iCursor). 
2b700 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54     ){.#if SELECT
2b710 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2b720 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2b730 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
2b740 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45  00 ){.        SE
2b750 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
2b760 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
2b770 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75   WHERE-clause pu
2b780 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20  sh-down:\n"));. 
2b790 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
2b7a0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2b7b0 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  p, 0);.      }.#
2b7c0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
2b7d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2b7e0 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
2b7f0 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
2b800 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  */.    if( pTabL
2b810 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20  ist->nSrc==1.   
2b820 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67    && (p->selFlag
2b830 73 20 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 0a 20  s & SF_All)==0. 
2b840 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
2b850 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
2b860 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74  QLITE_SubqCorout
2b870 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ine).    ){.    
2b880 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
2b890 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
2b8a0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
2b8b0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
2b8c0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
2b8d0 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
2b8e0 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
2b8f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2b900 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
2b910 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
2b920 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
2b930 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
2b940 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2b950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b960 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
2b970 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
2b980 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64  regReturn, 0, ad
2b990 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  drTop);.      Vd
2b9a0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
2b9b0 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
2b9c0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2b9d0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2b9e0 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
2b9f0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2ba00 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
2ba10 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
2ba20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2ba30 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
2ba40 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2ba50 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
2ba60 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
2ba70 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
2ba80 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
2ba90 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
2baa0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2bab0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2bac0 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74   = pSub->nSelect
2bad0 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  Row;.      pItem
2bae0 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
2baf0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74  e = 1;.      pIt
2bb00 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20  em->regResult = 
2bb10 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20  dest.iSdst;.    
2bb20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
2bb30 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74  Coroutine(v, pIt
2bb40 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2bb50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2bb60 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2bb70 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73  rTop-1);.      s
2bb80 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2bb90 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
2bba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2bbb0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2bbc0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2bbd0 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
2bbe0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
2bbf0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  h.      ** the c
2bc00 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73  ontent of this s
2bc10 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d  ubquery.  pItem-
2bc20 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c  >addrFillSub wil
2bc30 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  l point.      **
2bc40 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
2bc50 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2bc60 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49   subroutine.  pI
2bc70 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20  tem->regReturn. 
2bc80 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67       ** is a reg
2bc90 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
2bca0 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72  to hold the subr
2bcb0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64  outine return ad
2bcc0 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20  dress.      */. 
2bcd0 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72       int topAddr
2bce0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
2bcf0 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
2bd00 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20  int retAddr;.   
2bd10 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
2bd20 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
2bd30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
2bd40 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
2bd50 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2bd60 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
2bd70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2bd80 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2bd90 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2bda0 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
2bdb0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
2bdc0 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
2bdd0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
2bde0 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b  Correlated==0 ){
2bdf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2be00 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
2be10 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e  ot correlated an
2be20 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  d if we are not 
2be30 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20  inside of.      
2be40 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20    ** a trigger, 
2be50 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65  then we only nee
2be60 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
2be70 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75   value of the su
2be80 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a  bquery.        *
2be90 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20  * once. */.     
2bea0 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71     onceAddr = sq
2beb0 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
2bec0 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
2bed0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2bee0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2bef0 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
2bf00 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
2bf10 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2bf20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bf30 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
2bf40 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
2bf50 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
2bf60 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2bf70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2bf80 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
2bf90 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
2bfa0 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
2bfb0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2bfc0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2bfd0 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63  er(pItem->iSelec
2bfe0 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d  tId, (u8)pParse-
2bff0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
2c000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
2c010 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
2c020 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
2c030 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
2c040 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d  owLogEst = pSub-
2c050 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
2c060 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20     if( onceAddr 
2c070 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
2c080 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64  pHere(v, onceAdd
2c090 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64  r);.      retAdd
2c0a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2c0b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2c0c0 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  rn, pItem->regRe
2c0d0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  turn);.      Vdb
2c0e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
2c0f0 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54  d %s", pItem->pT
2c100 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
2c110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2c120 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64  angeP1(v, topAdd
2c130 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20  r, retAddr);.   
2c140 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
2c150 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
2c160 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  se);.    }.    i
2c170 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2c180 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
2c190 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73  t_end;.    pPars
2c1a0 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
2c1b0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2c1c0 65 69 67 68 74 28 70 29 3b 0a 20 20 7d 0a 23 65  eight(p);.  }.#e
2c1d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 56 61 72 69 6f  ndif..  /* Vario
2c1e0 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  us elements of t
2c1f0 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64  he SELECT copied
2c200 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69   into local vari
2c210 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63  ables for.  ** c
2c220 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20  onvenience */.  
2c230 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
2c240 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  st;.  pWhere = p
2c250 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
2c260 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
2c270 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
2c280 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
2c290 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
2c2a0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2c2b0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
2c2c0 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
2c2d0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2c2e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2c2f0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
2c300 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2c310 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
2c320 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  fter all FROM-cl
2c330 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  ause analysis:\n
2c340 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
2c350 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2c360 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2c370 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
2c380 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e   query is DISTIN
2c390 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
2c3a0 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61   BY but is not a
2c3b0 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64  n aggregate, and
2c3c0 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65   .  ** if the se
2c3d0 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65  lect-list is the
2c3e0 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44   same as the ORD
2c3f0 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e  ER BY list, then
2c400 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a   this query.  **
2c410 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
2c420 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e  n as a GROUP BY.
2c430 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2c440 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
2c450 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54       SELECT DIST
2c460 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  INCT xyz FROM ..
2c470 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  . ORDER BY xyz. 
2c480 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e   **.  ** is tran
2c490 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a  sformed to:.  **
2c4a0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
2c4b0 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52   xyz FROM ... GR
2c4c0 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52  OUP BY xyz ORDER
2c4d0 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
2c4e0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
2c4f0 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61  m is preferred a
2c500 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  s a single index
2c510 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29   (or temp-table)
2c520 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73   may be .  ** us
2c530 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ed for both the 
2c540 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53  ORDER BY and DIS
2c550 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67  TINCT processing
2c560 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20  . As originally 
2c570 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68  .  ** written th
2c580 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65  e query must use
2c590 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f   a temp-table fo
2c5a0 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  r at least one o
2c5b0 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a  f the ORDER .  *
2c5c0 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  * BY and DISTINC
2c5d0 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  T, and an index 
2c5e0 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70  or separate temp
2c5f0 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f  -table for the o
2c600 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
2c610 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2c620 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
2c630 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
2c640 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20  Distinct .   && 
2c650 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2c660 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72  ompare(sSort.pOr
2c670 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d  derBy, pEList, -
2c680 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  1)==0.  ){.    p
2c690 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2c6a0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
2c6b0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
2c6c0 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
2c6d0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
2c6e0 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  pEList, 0);.    
2c6f0 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
2c700 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
2c710 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
2c720 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
2c730 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
2c740 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
2c750 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
2c760 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
2c770 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
2c780 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
2c790 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
2c7a0 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
2c7b0 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
2c7c0 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
2c7d0 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
2c7e0 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20  inct.isTnct );. 
2c7f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2c800 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
2c810 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72   clause, then cr
2c820 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
2c830 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20  l index to.  ** 
2c840 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20  do the sorting. 
2c850 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e   But this sortin
2c860 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  g ephemeral inde
2c870 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20  x might end up. 
2c880 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64   ** being unused
2c890 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
2c8a0 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e   be extracted in
2c8b0 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
2c8c0 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20  r..  ** If that 
2c8d0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
2c8e0 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  n the OP_OpenEph
2c8f0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
2c900 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
2c910 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
2c920 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69  _Noop once we fi
2c930 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
2c940 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
2c950 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64  is.  ** not need
2c960 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61  ed.  The sSort.a
2c970 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72  ddrSortIndex var
2c980 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2c990 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a   facilitate.  **
2c9a0 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
2c9b0 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
2c9c0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
2c9d0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2c9e0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
2c9f0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
2ca00 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f  List(pParse, sSo
2ca10 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
2ca20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
2ca30 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
2ca40 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
2ca50 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
2ca60 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
2ca70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ca80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2ca90 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
2caa0 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75        sSort.iECu
2cab0 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64  rsor, sSort.pOrd
2cac0 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45  erBy->nExpr+1+pE
2cad0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a  List->nExpr, 0,.
2cae0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2caf0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2cb00 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20  YINFO.      );. 
2cb10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72   }else{.    sSor
2cb20 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
2cb30 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
2cb40 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
2cb50 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
2cb60 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
2cb70 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
2cb80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
2cb90 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
2cba0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
2cbb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2cbc0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2cbd0 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
2cbe0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
2cbf0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
2cc00 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
2cc10 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
2cc20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2cc30 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
2cc40 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20  lectRow = 320;  
2cc50 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77  /* 4 billion row
2cc60 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
2cc70 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
2cc80 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
2cc90 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
2cca0 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53  0 && sSort.addrS
2ccb0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20  ortIndex>=0 ){. 
2ccc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2ccd0 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53  angeOpcode(v, sS
2cce0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2ccf0 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  x, OP_SorterOpen
2cd00 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72  );.    sSort.sor
2cd10 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c  tFlags |= SORTFL
2cd20 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  AG_UseSorter;.  
2cd30 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20  }..  /* Open an 
2cd40 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
2cd50 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
2cd60 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
2cd70 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
2cd80 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
2cd90 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
2cda0 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
2cdb0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2cdc0 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
2cdd0 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
2cde0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2cdf0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce10 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
2ce20 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
2ce30 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce50 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72  (char*)keyInfoFr
2ce60 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2ce70 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30  e, p->pEList,0,0
2ce80 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cea0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2ceb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2cec0 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
2ced0 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44  ORDERED);.    sD
2cee0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2cef0 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
2cf00 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20  CT_UNORDERED;.  
2cf10 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74  }else{.    sDist
2cf20 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
2cf30 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2cf40 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
2cf50 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
2cf60 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
2cf70 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   No aggregate fu
2cf80 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47  nctions and no G
2cf90 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
2cfa0 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46  /.    u16 wctrlF
2cfb0 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63  lags = (sDistinc
2cfc0 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45  t.isTnct ? WHERE
2cfd0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a  _WANT_DISTINCT :
2cfe0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
2cff0 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
2d000 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20  ==SF_FixedLimit 
2d010 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  );.    wctrlFlag
2d020 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  s |= p->selFlags
2d030 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74   & SF_FixedLimit
2d040 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
2d050 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
2d060 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f  n. */.    pWInfo
2d070 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2d080 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2d090 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73  bList, pWhere, s
2d0a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20  Sort.pOrderBy,. 
2d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
2d0d0 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c  >pEList, wctrlFl
2d0e0 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ags, p->nSelectR
2d0f0 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ow);.    if( pWI
2d100 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
2d110 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66  lect_end;.    if
2d120 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  ( sqlite3WhereOu
2d130 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
2d140 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63  nfo) < p->nSelec
2d150 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d  tRow ){.      p-
2d160 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
2d170 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
2d180 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
2d190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d1a0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2d1b0 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65   && sqlite3Where
2d1c0 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2d1d0 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73  o) ){.      sDis
2d1e0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2d1f0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2d200 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
2d210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d220 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
2d230 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f  {.      sSort.nO
2d240 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68  BSat = sqlite3Wh
2d250 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2d260 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
2d270 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53  sSort.nOBSat==sS
2d280 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
2d290 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
2d2a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2d2b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2d2c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
2d2d0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
2d2e0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
2d2f0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
2d300 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
2d310 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
2d320 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
2d330 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
2d340 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
2d350 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
2d360 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
2d370 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53     */.    if( sS
2d380 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d390 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f  x>=0 && sSort.pO
2d3a0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
2d3b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2d3c0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
2d3d0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d3e0 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  x);.    }..    /
2d3f0 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
2d400 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
2d410 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
2d420 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
2d430 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53   pEList, -1, &sS
2d440 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
2d450 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
2d460 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2d470 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
2d480 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4a0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
2d4b0 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
2d4c0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
2d4d0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
2d4e0 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
2d4f0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2d500 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
2d510 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
2d520 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
2d530 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
2d540 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
2d550 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
2d560 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
2d570 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
2d580 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
2d590 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
2d5a0 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
2d5b0 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
2d5c0 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
2d5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2d5e0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
2d5f0 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
2d600 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
2d610 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
2d620 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2d630 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
2d640 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
2d650 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
2d660 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
2d670 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
2d680 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
2d690 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
2d6a0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
2d6b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
2d6c0 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
2d6d0 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
2d6e0 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d700 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
2d710 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
2d720 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
2d730 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
2d740 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
2d750 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
2d760 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
2d770 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
2d780 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
2d790 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
2d7a0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
2d7b0 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
2d7c0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
2d7d0 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
2d7e0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
2d7f0 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
2d800 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
2d810 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
2d820 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
2d830 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
2d840 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
2d850 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
2d860 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
2d870 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79  .    int orderBy
2d880 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  Grp = 0; /* True
2d890 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59   if the GROUP BY
2d8a0 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72   and ORDER BY ar
2d8b0 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20  e the same */.. 
2d8c0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
2d8d0 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
2d8e0 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
2d8f0 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
2d900 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
2d910 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
2d920 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2d930 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
2d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d950 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2d960 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
2d970 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2d980 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
2d990 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
2d9a0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
2d9b0 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
2d9c0 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
2d9d0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
2d9e0 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
2d9f0 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
2da00 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
2da10 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
2da20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2da30 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
2da40 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
2da50 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
2da60 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2da70 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
2da80 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
2da90 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2daa0 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
2dab0 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20  st(100) );.     
2dac0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
2dad0 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65  ow>66 ) p->nSele
2dae0 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20  ctRow = 66;.    
2daf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2db00 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c  ert( 0==sqlite3L
2db10 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20  ogEst(1) );.    
2db20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2db30 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
2db40 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
2db50 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61  oth a GROUP BY a
2db60 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  nd an ORDER BY c
2db70 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61  lause and they a
2db80 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69  re.    ** identi
2db90 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  cal, then it may
2dba0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2dbb0 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45  disable the ORDE
2dbc0 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20  R BY clause .   
2dbd0 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e   ** on the groun
2dbe0 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55  ds that the GROU
2dbf0 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20  P BY will cause 
2dc00 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
2dc10 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20   out .    ** in 
2dc20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
2dc30 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e  r. It also may n
2dc40 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42  ot - the GROUP B
2dc50 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20  Y might use a.  
2dc60 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e    ** database in
2dc70 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20  dex that causes 
2dc80 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70  rows to be group
2dc90 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72  ed together as r
2dca0 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62  equired.    ** b
2dcb0 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ut not actually 
2dcc0 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77  sorted. Either w
2dcd0 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ay, record the f
2dce0 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20  act that the.   
2dcf0 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64   ** ORDER BY and
2dd00 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2dd10 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62  s are the same b
2dd20 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72  y setting the or
2dd30 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20  derByGrp.    ** 
2dd40 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
2dd50 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2dd60 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72  rListCompare(pGr
2dd70 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72  oupBy, sSort.pOr
2dd80 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b  derBy, -1)==0 ){
2dd90 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72  .      orderByGr
2dda0 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20  p = 1;.    }. . 
2ddb0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
2ddc0 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
2ddd0 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
2dde0 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
2ddf0 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
2de00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2de10 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
2de20 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
2de30 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
2de40 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
2de50 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
2de60 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
2de70 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
2de80 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
2de90 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
2dea0 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
2deb0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
2dec0 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
2ded0 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
2dee0 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
2def0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2df00 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
2df10 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
2df20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
2df30 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
2df40 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20  AggInfo.mnReg = 
2df50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
2df60 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
2df70 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
2df80 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
2df90 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  y->nExpr : 0;.  
2dfa0 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
2dfb0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
2dfc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2dfd0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2dfe0 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
2dff0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2e000 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
2e010 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29   sSort.pOrderBy)
2e020 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
2e030 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
2e040 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2e050 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
2e060 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
2e070 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
2e080 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
2e090 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
2e0a0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
2e0b0 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
2e0c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2e0d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2e0e0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
2e0f0 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
2e100 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2e110 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  sNC.ncFlags |= N
2e120 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
2e130 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2e140 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
2e150 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
2e160 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
2e170 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  ist);.      sNC.
2e180 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49  ncFlags &= ~NC_I
2e190 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a  nAggFunc;.    }.
2e1a0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52      sAggInfo.mxR
2e1b0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2e1c0 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  m;.    if( db->m
2e1d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2e1e0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
2e1f0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
2e200 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
2e210 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
2e220 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
2e230 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
2e240 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
2e250 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
2e260 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
2e270 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2e280 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
2e290 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2e2a0 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
2e2b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
2e2c0 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
2e2d0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
2e2e0 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
2e2f0 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
2e300 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
2e310 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
2e320 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
2e330 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
2e340 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
2e350 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
2e360 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
2e370 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
2e380 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
2e390 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
2e3a0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
2e3b0 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
2e3c0 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
2e3d0 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
2e3e0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
2e3f0 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
2e400 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
2e410 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
2e420 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
2e430 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
2e440 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2e450 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
2e460 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
2e470 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
2e480 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
2e490 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
2e4a0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2e4b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2e4c0 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
2e4d0 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2e4e0 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
2e4f0 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
2e500 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2e510 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
2e520 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
2e530 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
2e540 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
2e550 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
2e560 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
2e570 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
2e580 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
2e590 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
2e5a0 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
2e5b0 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
2e5c0 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
2e5d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
2e5e0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
2e5f0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
2e600 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
2e610 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2e620 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
2e630 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2e640 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
2e650 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2e660 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2e670 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  y, 0, sAggInfo.n
2e680 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
2e690 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
2e6a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e6b0 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
2e6c0 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
2e6d0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2e6e0 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
2e6f0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
2e700 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
2e710 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2e720 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
2e730 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
2e740 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
2e750 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
2e760 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
2e770 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
2e780 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
2e790 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2e7a0 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
2e7b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2e7c0 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
2e7d0 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
2e7e0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2e7f0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2e800 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2e810 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
2e820 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
2e830 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2e840 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
2e850 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2e860 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
2e870 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2e880 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2e890 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2e8a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
2e8b0 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
2e8c0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2e8d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2e8e0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2e8f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e900 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2e910 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
2e920 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2e930 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
2e940 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
2e950 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e960 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e970 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
2e980 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2e990 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2e9a0 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
2e9b0 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
2e9c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e9d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
2e9e0 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65  , 0, iAMem, iAMe
2e9f0 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  m+pGroupBy->nExp
2ea00 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r-1);..      /* 
2ea10 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
2ea20 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
2ea30 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
2ea40 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
2ea50 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
2ea60 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
2ea70 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
2ea80 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
2ea90 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
2eaa0 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
2eab0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
2eac0 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
2ead0 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
2eae0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
2eaf0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
2eb00 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
2eb10 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
2eb20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2eb30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2eb40 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2eb50 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2eb60 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2eb70 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2eb80 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2eb90 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c  Where, pGroupBy,
2eba0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48   0,.          WH
2ebb0 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f  ERE_GROUPBY | (o
2ebc0 72 64 65 72 42 79 47 72 70 20 3f 20 57 48 45 52  rderByGrp ? WHER
2ebd0 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20  E_SORTBYGROUP : 
2ebe0 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  0), 0.      );. 
2ebf0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
2ec00 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2ec10 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
2ec20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
2ec30 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70  dered(pWInfo)==p
2ec40 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29  GroupBy->nExpr )
2ec50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2ec60 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
2ec70 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
2ec80 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
2ec90 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
2eca0 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
2ecb0 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
2ecc0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2ecd0 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
2ece0 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
2ecf0 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
2ed00 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
2ed10 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
2ed20 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
2ed30 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
2ed40 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
2ed50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2ed60 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
2ed70 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
2ed80 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
2ed90 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
2eda0 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
2edb0 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
2edc0 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
2edd0 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
2ede0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2edf0 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
2ee00 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
2ee10 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
2ee20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
2ee30 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
2ee40 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
2ee50 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
2ee60 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
2ee70 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
2ee80 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
2ee90 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
2eea0 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ..        explai
2eeb0 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
2eec0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2eed0 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
2eee0 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
2eef0 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d  s&SF_Distinct)==
2ef00 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  0) ?.           
2ef10 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e           "DISTIN
2ef20 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22  CT" : "GROUP BY"
2ef30 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
2ef40 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
2ef50 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
2ef60 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2ef70 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
2ef80 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2ef90 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2efa0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2efb0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2efc0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2efd0 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66       if( sAggInf
2efe0 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65  o.aCol[i].iSorte
2eff0 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2f000 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
2f010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
2f020 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2f030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f040 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
2f050 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
2f060 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
2f070 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f080 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2f090 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2f0a0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
2f0b0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
2f0c0 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
2f0d0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  0, 0);.        j
2f0e0 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
2f0f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2f100 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2f110 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2f120 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2f130 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
2f140 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
2f150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2f160 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2f170 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
2f180 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
2f190 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
2f1a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f1b0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f  rCodeGetColumnTo
2f1c0 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Reg(pParse, .   
2f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1e0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2f1f0 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
2f200 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
2f210 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ble, r1);.      
2f220 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2f230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f240 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
2f250 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
2f260 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2f270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f280 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2f290 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
2f2a0 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
2f2b0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2f2c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2f2d0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
2f2e0 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
2f2f0 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
2f300 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2f310 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2f320 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
2f330 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
2f340 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2f350 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2f360 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
2f370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2f380 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2f390 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2f3a0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  o.sortingIdxPTab
2f3b0 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50   = sortPTab = pP
2f3c0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2f3d0 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20        sortOut = 
2f3e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2f3f0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
2f400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f410 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
2f420 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c  seudo, sortPTab,
2f430 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b   sortOut, nCol);
2f440 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f450 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2f460 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67  _SorterSort, sAg
2f470 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2f480 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
2f490 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2f4a0 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
2f4b0 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72  rt")); VdbeCover
2f4c0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2f4d0 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
2f4e0 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
2f4f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2f500 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2f510 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  );..      }..   
2f520 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
2f530 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  ex or temporary 
2f540 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68  table used by th
2f550 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a  e GROUP BY sort.
2f560 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61        ** will na
2f570 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20  turally deliver 
2f580 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65  rows in the orde
2f590 72 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  r required by th
2f5a0 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20  e ORDER BY.     
2f5b0 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63   ** clause, canc
2f5c0 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  el the ephemeral
2f5d0 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65   table open code
2f5e0 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20  d earlier..     
2f5f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
2f600 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
2f610 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
2f620 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
2f630 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
2f640 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65  ss..      ** Use
2f650 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75   the SQLITE_Grou
2f660 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69  pByOrder flag wi
2f670 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
2f680 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20  RL_OPTIMIZER to 
2f690 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
2f6a0 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  e this optimizat
2f6b0 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ion for testing 
2f6c0 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20  purposes.  */.  
2f6d0 20 20 20 20 69 66 28 20 6f 72 64 65 72 42 79 47      if( orderByG
2f6e0 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  rp && Optimizati
2f6f0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2f700 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
2f710 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 67  r) .       && (g
2f720 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71  roupBySort || sq
2f730 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
2f740 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20  ed(pWInfo)).    
2f750 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f    ){.        sSo
2f760 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
2f770 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f780 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
2f790 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2f7a0 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
2f7b0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
2f7c0 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
2f7d0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
2f7e0 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
2f7f0 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
2f800 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
2f810 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
2f820 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
2f830 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
2f840 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
2f850 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
2f860 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
2f870 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
2f880 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
2f890 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
2f8a0 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
2f8b0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
2f8c0 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
2f8d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
2f8e0 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
2f8f0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2f900 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2f910 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2f920 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2f930 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2f940 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2f950 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2f960 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
2f970 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2f980 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
2f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9a0 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50 54   sortOut, sortPT
2f9b0 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
2f9c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
2f9d0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
2f9e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2f9f0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2fa00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2fa10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2fa20 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54  P_Column, sortPT
2fa30 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  ab, j, iBMem+j);
2fa40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2fa50 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
2fa60 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
2fa70 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
2fa80 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
2fa90 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
2faa0 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
2fab0 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
2fac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2fad0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2fae0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
2faf0 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
2fb00 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
2fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
2fb30 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
2fb40 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
2fb50 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64  YINFO);.      ad
2fb60 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
2fb70 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2fb80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fb90 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
2fba0 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20 30 2c  ump, addr1+1, 0,
2fbb0 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43   addr1+1); VdbeC
2fbc0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
2fbd0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
2fbe0 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
2fbf0 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50  enever the GROUP
2fc00 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20   BY changes..   
2fc10 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e     ** Changes in
2fc20 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
2fc30 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
2fc40 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
2fc50 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
2fc60 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
2fc70 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
2fc80 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
2fc90 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2fca0 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
2fcb0 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
2fcc0 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
2fcd0 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
2fce0 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
2fcf0 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
2fd00 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
2fd10 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
2fd20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
2fd30 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
2fd40 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
2fd50 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
2fd60 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
2fd70 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
2fd80 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
2fd90 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
2fda0 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
2fdb0 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d  se, iBMem, iAMem
2fdc0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
2fdd0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
2fde0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2fdf0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
2fe00 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
2fe10 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
2fe20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
2fe30 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b  tput one row"));
2fe40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fe50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2fe60 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67  fPos, iAbortFlag
2fe70 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65  , addrEnd); Vdbe
2fe80 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2fe90 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2fea0 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20  v, "check abort 
2feb0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2fec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2fed0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2fee0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
2fef0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
2ff00 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
2ff10 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
2ff20 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
2ff30 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
2ff40 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
2ff50 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
2ff60 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
2ff70 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
2ff80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2ff90 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2ffa0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
2ffb0 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
2ffc0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2ffd0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
2ffe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fff0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
30000 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
30010 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
30020 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
30030 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
30040 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
30050 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
30060 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
30070 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
30080 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30090 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
300a0 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67  _SorterNext, sAg
300b0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
300c0 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
300d0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
300e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
300f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30100 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
30110 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
30120 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
30130 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
30140 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
30150 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
30160 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
30170 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
30180 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
30190 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
301a0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
301b0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
301c0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
301d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
301e0 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
301f0 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
30200 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
30210 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
30220 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
30230 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
30240 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
30250 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
30260 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
30270 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
30280 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
30290 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
302a0 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
302b0 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
302c0 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
302d0 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
302e0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
302f0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
30300 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
30310 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
30320 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
30330 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
30340 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
30350 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
30360 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
30370 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
30380 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
30390 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
303a0 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
303b0 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
303c0 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
303d0 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
303e0 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
303f0 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
30400 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
30410 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30420 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
30430 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
30440 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
30450 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
30460 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
30470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30480 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
30490 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
304a0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
304b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
304c0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
304d0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
304e0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
304f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
30500 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
30510 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30520 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
30530 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
30540 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
30550 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
30560 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
30570 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79  ent((v, "Groupby
30580 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
30590 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
305a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
305b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
305c0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
305d0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e  tRow);.      fin
305e0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
305f0 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
30600 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
30610 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
30620 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
30630 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
30640 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
30650 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
30660 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
30670 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
30680 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20   -1, &sSort,.   
30690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306a0 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70     &sDistinct, p
306b0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
306c0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
306d0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
306e0 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
306f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30700 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
30710 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
30720 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
30730 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
30740 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
30750 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
30760 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
30770 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
30780 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
30790 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
307a0 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
307b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
307c0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
307d0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
307e0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
307f0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
30800 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30810 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
30820 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
30830 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
30840 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
30850 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67  y.  Begin aggreg
30860 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68  ate queries with
30870 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f  out GROUP BY: */
30880 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
30890 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
308a0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
308b0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
308c0 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65  OUNT.      Table
308d0 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66   *pTab;.      if
308e0 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70  ( (pTab = isSimp
308f0 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67  leCount(p, &sAgg
30900 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  Info))!=0 ){.   
30910 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d       /* If isSim
30920 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72  pleCount() retur
30930 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
30940 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
30950 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  e, then.        
30960 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
30970 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
30980 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  orm:.        **.
30990 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
309a0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
309b0 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20  M <tbl>.        
309c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
309d0 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ere the Table st
309e0 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
309f0 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c   represents tabl
30a00 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20  e <tbl>..       
30a10 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
30a20 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
30a30 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20   so common that 
30a40 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  it is optimized 
30a50 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20  specially. The. 
30a60 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75         ** OP_Cou
30a70 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
30a80 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65  s executed eithe
30a90 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20  r on the intkey 
30aa0 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20  table that.     
30ab0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
30ac0 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  he data for tabl
30ad0 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e  e <tbl> or on on
30ae0 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73  e of its indexes
30af0 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  . It.        ** 
30b00 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65  is better to exe
30b10 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61  cute the op on a
30b20 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65  n index, as inde
30b30 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20  xes are almost. 
30b40 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
30b50 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c   spread across l
30b60 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74  ess pages than t
30b70 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
30b80 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ng tables..     
30b90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
30ba0 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71  nst int iDb = sq
30bb0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
30bc0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
30bd0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
30be0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
30bf0 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e   iCsr = pParse->
30c00 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43  nTab++;     /* C
30c10 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d  ursor to scan b-
30c20 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tree */.        
30c30 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
30c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c50 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
30c60 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
30c70 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
30c80 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
30c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
30ca0 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64  info for scanned
30cb0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
30cc0 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
30cd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
30ce0 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69         /* Best i
30cf0 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61  ndex found so fa
30d00 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
30d10 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74   iRoot = pTab->t
30d20 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
30d30 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
30d40 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65  f scanned b-tree
30d50 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c   */..        sql
30d60 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
30d70 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
30d80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
30d90 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
30da0 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
30db0 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
30dc0 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ame);..        /
30dd0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
30de0 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20   index that has 
30df0 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20  the lowest scan 
30e00 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  cost..        **
30e10 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
30e20 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20  1-04-15) Do not 
30e30 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f  do a full scan o
30e40 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69  f an unordered i
30e50 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
30e60 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
30e70 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20  3-10-03) Do not 
30e80 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65  count the entrie
30e90 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69  s in a partial i
30ea0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
30eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70  .        ** In p
30ec0 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49  ractice the KeyI
30ed0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69  nfo structure wi
30ee0 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
30ef0 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20  It is only .    
30f00 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f      ** passed to
30f10 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61   keep OP_OpenRea
30f20 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20  d happy..       
30f30 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
30f40 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
30f50 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65  ) pBest = sqlite
30f60 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
30f70 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
30f80 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
30f90 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
30fa0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
30fb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
30fc0 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  dx->bUnordered==
30fd0 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
30fe0 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
30ff0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20  Tab->szTabRow.  
31000 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
31010 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
31020 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
31030 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78   (!pBest || pIdx
31040 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74  ->szIdxRow<pBest
31050 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20  ->szIdxRow).    
31060 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
31070 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
31080 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
31090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
310a0 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20   if( pBest ){.  
310b0 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
310c0 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
310d0 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
310e0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
310f0 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
31100 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pBest);.        
31110 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  }..        /* Op
31120 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
31130 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74  ursor, execute t
31140 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f  he OP_Count, clo
31150 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a  se the cursor. *
31160 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
31170 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
31180 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
31190 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c  Csr, iRoot, iDb,
311a0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
311b0 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
311c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
311d0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
311e0 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
311f0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
31200 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31210 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
31220 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
31230 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
31240 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
31250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31260 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
31270 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
31280 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69         explainSi
31290 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65  mpleCount(pParse
312a0 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a  , pTab, pBest);.
312b0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
312c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
312d0 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
312e0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
312f0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
31300 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
31310 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
31320 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20   forms:.        
31330 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
31340 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
31350 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
31360 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
31370 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
31380 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31390 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
313a0 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
313b0 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
313c0 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
313d0 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ts.        ** as
313e0 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
313f0 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
31400 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
31410 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
31420 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e      ** If where.
31430 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f  c is able to pro
31440 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72  duce results sor
31450 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  ted in this orde
31460 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  r, then.        
31470 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
31480 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
31490 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
314a0 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
314b0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
314c0 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
314d0 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
314e0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
314f0 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  p is .        **
31500 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
31510 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
31520 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
31530 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
31540 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
31550 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
31560 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
31570 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31580 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
31590 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
315a0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
315b0 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
315c0 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  htly.        ** 
315d0 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20  modify behavior 
315e0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
315f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31600 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
31610 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
31620 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
31630 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
31640 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
31650 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
31660 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
31670 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
31680 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
31690 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
316a0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
316b0 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
316c0 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
316d0 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
316e0 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
316f0 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
31700 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
31710 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
31720 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
31730 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
31740 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
31750 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
31760 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
31770 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
31780 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
31790 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
317a0 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
317b0 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
317c0 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
317d0 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
317e0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
317f0 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
31800 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
31810 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
31820 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a  ORMAL;.        .
31830 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31840 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
31850 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
31860 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  ( flag==0 );.   
31870 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76       if( p->pHav
31880 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ing==0 ){.      
31890 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61      flag = minMa
318a0 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f  xQuery(&sAggInfo
318b0 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20  , &pMinMax);.   
318c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
318d0 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c  ssert( flag==0 |
318e0 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26  | (pMinMax!=0 &&
318f0 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
31900 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  =1) );..        
31910 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
31920 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
31930 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
31940 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20  up(db, pMinMax, 
31950 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  0);.          pD
31960 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20  el = pMinMax;.  
31970 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31980 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
31990 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d 30 20 29   || pMinMax!=0 )
319a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
319b0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
319c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
319d0 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
319e0 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
319f0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
31a00 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
31a10 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
31a20 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
31a30 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
31a40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31a50 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68    .        /* Th
31a60 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
31a70 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
31a80 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
31a90 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
31aa0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
31ab0 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
31ac0 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
31ad0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
31ae0 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  w.        ** of 
31af0 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20  output..        
31b00 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74  */.        reset
31b10 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
31b20 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
31b30 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
31b40 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
31b50 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
31b60 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
31b70 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a  nMax,0,flag,0);.
31b80 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e          if( pWIn
31b90 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
31ba0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
31bb0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
31bc0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  l);.          go
31bd0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
31be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31bf0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
31c00 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
31c10 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  Info);.        a
31c20 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d  ssert( pMinMax==
31c30 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 || pMinMax->nE
31c40 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  xpr==1 );.      
31c50 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
31c60 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
31c70 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  fo)>0 ){.       
31c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
31c90 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57 68 65  to(v, sqlite3Whe
31ca0 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
31cb0 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20  nfo));.         
31cc0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
31cd0 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22   "%s() by index"
31ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31cf0 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f    (flag==WHERE_O
31d00 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22  RDERBY_MIN?"min"
31d10 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20  :"max")));.     
31d20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
31d30 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
31d40 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69  nfo);.        fi
31d50 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
31d60 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
31d70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Info);.      }..
31d80 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
31d90 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
31da0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
31db0 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
31dc0 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c  ng, addrEnd, SQL
31dd0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
31de0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
31df0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
31e00 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c  , p->pEList, -1,
31e10 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
31e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
31e30 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  est, addrEnd, ad
31e40 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71  drEnd);.      sq
31e50 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
31e60 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
31e70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
31e80 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
31e90 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
31ea0 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
31eb0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
31ec0 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69  */..  if( sDisti
31ed0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57  nct.eTnctType==W
31ee0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
31ef0 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65  ORDERED ){.    e
31f00 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
31f10 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
31f20 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  T");.  }..  /* I
31f30 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
31f40 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
31f50 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
31f60 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
31f70 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
31f80 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
31f90 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
31fa0 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
31fb0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
31fc0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
31fd0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
31fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 53                sS
31ff0 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22  ort.nOBSat>0 ? "
32000 52 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52  RIGHT PART OF OR
32010 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52 20 42  DER BY":"ORDER B
32020 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  Y");.    generat
32030 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
32040 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c  , p, &sSort, pEL
32050 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73  ist->nExpr, pDes
32060 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  t);.  }..  /* Ju
32070 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
32080 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a  this query.  */.
32090 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
320a0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e  olveLabel(v, iEn
320b0 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45  d);..  /* The SE
320c0 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f  LECT has been co
320d0 64 65 64 2e 20 49 66 20 74 68 65 72 65 20 69 73  ded. If there is
320e0 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
320f0 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65   Parse structure
32100 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 72  ,.  ** set the r
32110 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 31 2e  eturn code to 1.
32120 20 4f 74 68 65 72 77 69 73 65 20 30 2e 20 2a 2f   Otherwise 0. */
32130 0a 20 20 72 63 20 3d 20 28 70 50 61 72 73 65 2d  .  rc = (pParse-
32140 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20  >nErr>0);..  /* 
32150 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
32160 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
32170 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
32180 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
32190 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
321a0 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
321b0 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
321c0 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e  t_end:.  explain
321d0 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
321e0 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
321f0 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
32200 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
32210 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
32220 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53  results of the S
32230 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20  ELECT are to be 
32240 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
32250 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32260 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74   && pDest->eDest
32270 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
32280 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
32290 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
322a0 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
322b0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
322c0 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
322d0 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
322e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
322f0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
32300 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
32310 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43  _ENABLED.  SELEC
32320 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
32330 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73 69  p,("end processi
32340 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72 73  ng\n"));.  pPars
32350 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74  e->nSelectIndent
32360 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  --;.#endif.  ret
32370 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.