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

Artifact 5ae632f5f20a753409b6ae78b4299571bda32199:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e  its */.};.#defin
0840: 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  e SORTFLAG_UseSo
0850: 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20  rter  0x01   /* 
0860: 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69  Use SorterOpen i
0870: 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70  nstead of OpenEp
0880: 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a  hemeral */../*.*
0890: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65  * Delete all the
08a0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65   content of a Se
08b0: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20  lect structure. 
08c0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20   Deallocate the 
08d0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73  structure.** its
08e0: 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65  elf only if bFre
08f0: 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  e is true..*/.st
0900: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53  atic void clearS
0910: 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  elect(sqlite3 *d
0920: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
0930: 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c  t bFree){.  whil
0940: 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65  e( p ){.    Sele
0950: 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
0960: 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69  pPrior;.    sqli
0970: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0980: 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e(db, p->pEList)
0990: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
09a0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
09b0: 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  ->pSrc);.    sql
09c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
09d0: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
09e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
09f0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0a00: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
0a10: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0a20: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  (db, p->pHaving)
0a30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
0a40: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
0a50: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
0a60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0a70: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
0a80: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
0a90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0aa0: 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >pOffset);.    s
0ab0: 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65  qlite3WithDelete
0ac0: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
0ad0: 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
0ae0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
0af0: 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 50  , p);.    p = pP
0b00: 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65 20  rior;.    bFree 
0b10: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
0b20: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53  * Initialize a S
0b30: 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
0b40: 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
0b50: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
0b60: 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70  it(SelectDest *p
0b70: 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c  Dest, int eDest,
0b80: 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70   int iParm){.  p
0b90: 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75  Dest->eDest = (u
0ba0: 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74  8)eDest;.  pDest
0bb0: 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72  ->iSDParm = iPar
0bc0: 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53  m;.  pDest->affS
0bd0: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
0be0: 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  ->iSdst = 0;.  p
0bf0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b  Dest->nSdst = 0;
0c00: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
0c10: 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74  ate a new Select
0c20: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
0c30: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
0c40: 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63  to that.** struc
0c50: 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20  ture..*/.Select 
0c60: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65  *sqlite3SelectNe
0c70: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
0c80: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
0c90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
0ca0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
0cb0: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
0cc0: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
0cd0: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
0ce0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
0cf0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
0d00: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
0d10: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
0d20: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
0d30: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
0d40: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
0d50: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0d60: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
0d70: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
0d80: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
0d90: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
0da0: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
0db0: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
0dc0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
0dd0: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
0de0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
0df0: 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20 20   u16 selFlags,  
0e00: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70         /* Flag p
0e10: 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20  arameters, such 
0e20: 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a  as SF_Distinct *
0e30: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
0e40: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d  ,         /* LIM
0e50: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
0e60: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
0e70: 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65  /.  Expr *pOffse
0e80: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  t         /* OFF
0e90: 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  SET value.  NULL
0ea0: 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74   means no offset
0eb0: 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
0ec0: 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
0ed0: 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74  standin;.  sqlit
0ee0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0ef0: 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
0f00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
0f10: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
0f20: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
0f30: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
0f40: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
0f50: 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20  led );.    pNew 
0f60: 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a  = &standin;.  }.
0f70: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
0f80: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
0f90: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
0fa0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
0fb0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
0fc0: 54 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29 29 3b  TK_ASTERISK,0));
0fd0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0fe0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0ff0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
1000: 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 73 65  LECT;.  pNew->se
1010: 6c 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c 61 67  lFlags = selFlag
1020: 73 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  s;.  pNew->iLimi
1030: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  t = 0;.  pNew->i
1040: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 23 69 66 20  Offset = 0;.#if 
1050: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1060: 4c 45 44 0a 20 20 70 4e 65 77 2d 3e 7a 53 65 6c  LED.  pNew->zSel
1070: 4e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e  Name[0] = 0;.#en
1080: 64 69 66 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  dif.  pNew->addr
1090: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
10a0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
10b0: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
10c0: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
10d0: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
10e0: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
10f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1100: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
1110: 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  Src));.  pNew->p
1120: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e  Src = pSrc;.  pN
1130: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ew->pWhere = pWh
1140: 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  ere;.  pNew->pGr
1150: 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
1160: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
1170: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70  g = pHaving;.  p
1180: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
1190: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77  pOrderBy;.  pNew
11a0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
11b0: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pNew->pNext = 0;
11c0: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
11d0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77  = pLimit;.  pNew
11e0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
11f0: 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69  set;.  pNew->pWi
1200: 74 68 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  th = 0;.  assert
1210: 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  ( pOffset==0 || 
1220: 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50 61  pLimit!=0 || pPa
1230: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 64  rse->nErr>0 || d
1240: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
1250: 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  =0 );.  if( db->
1260: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b  mallocFailed ) {
1270: 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74  .    clearSelect
1280: 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21  (db, pNew, pNew!
1290: 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20  =&standin);.    
12a0: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pNew = 0;.  }els
12b0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
12c0: 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20  New->pSrc!=0 || 
12d0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
12e0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
12f0: 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29  pNew!=&standin )
1300: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
1310: 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  .}..#if SELECTTR
1320: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
1330: 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
1340: 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  f a Select objec
1350: 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
1360: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53  3SelectSetName(S
1370: 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20  elect *p, const 
1380: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1390: 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29  if( p && zName )
13a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
13b0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
13c0: 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a  >zSelName), p->z
13d0: 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  SelName, "%s", z
13e0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Name);.  }.}.#en
13f0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  dif.../*.** Dele
1400: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
1410: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
1420: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
1430: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
1440: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1450: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1460: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
1470: 0a 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64  .  clearSelect(d
1480: 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  b, p, 1);.}../*.
1490: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
14a0: 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
14b0: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
14c0: 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70  tement in a comp
14d0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
14e0: 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68  Select *findRigh
14f0: 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29  tmost(Select *p)
1500: 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e  {.  while( p->pN
1510: 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65  ext ) p = p->pNe
1520: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  xt;.  return p;.
1530: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31  }../*.** Given 1
1540: 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72   to 3 identifier
1550: 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65 20  s preceding the 
1560: 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65  JOIN keyword, de
1570: 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74  termine the.** t
1580: 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65  ype of join.  Re
1590: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
15a0: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78  constant that ex
15b0: 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70  presses that typ
15c0: 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66  e.** in terms of
15d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
15e0: 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a  it values:.**.**
15f0: 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a       JT_INNER.**
1600: 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a       JT_CROSS.**
1610: 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a       JT_OUTER.**
1620: 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a       JT_NATURAL.
1630: 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a  **     JT_LEFT.*
1640: 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a  *     JT_RIGHT.*
1650: 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65  *.** A full oute
1660: 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f  r join is the co
1670: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f  mbination of JT_
1680: 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48  LEFT and JT_RIGH
1690: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  T..**.** If an i
16a0: 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70  llegal or unsupp
16b0: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20  orted join type 
16c0: 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74  is seen, then st
16d0: 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  ill return.** a 
16e0: 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70  join type, but p
16f0: 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  ut an error in t
1700: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
1710: 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
1720: 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73  te3JoinType(Pars
1730: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
1740: 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c   *pA, Token *pB,
1750: 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69   Token *pC){.  i
1760: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  nt jointype = 0;
1770: 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b  .  Token *apAll[
1780: 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a  3];.  Token *p;.
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33    0123456789 123
17c0: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
17d0: 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63   123 */.  static
17e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
17f0: 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61  Text[] = "natura
1800: 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c  leftouterightful
1810: 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20  linnercross";.  
1820: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1830: 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20  uct {.    u8 i; 
1840: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
1850: 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74  ing of keyword t
1860: 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b  ext in zKeyText[
1870: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61  ] */.    u8 nCha
1880: 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20  r;    /* Length 
1890: 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69  of the keyword i
18a0: 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  n characters */.
18b0: 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20      u8 code;    
18c0: 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61   /* Join type ma
18d0: 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f  sk */.  } aKeywo
18e0: 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  rd[] = {.    /* 
18f0: 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20  natural */ { 0, 
1900: 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20   7, JT_NATURAL  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1920: 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20  .    /* left    
1930: 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c  */ { 6,  4, JT_L
1940: 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20  EFT|JT_OUTER    
1950: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1960: 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c  outer   */ { 10,
1970: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20   5, JT_OUTER    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1990: 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20  .    /* right   
19a0: 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52  */ { 14, 5, JT_R
19b0: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  IGHT|JT_OUTER   
19c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
19d0: 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c  full    */ { 19,
19e0: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
19f0: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
1a00: 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20  .    /* inner   
1a10: 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49  */ { 23, 5, JT_I
1a20: 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NNER            
1a30: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1a40: 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c  cross   */ { 28,
1a50: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
1a60: 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c  CROSS         },
1a70: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
1a80: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
1a90: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
1aa0: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
1ab0: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
1ac0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
1ad0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
1ae0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
1af0: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
1b00: 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b  e(aKeyword); j++
1b10: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1b20: 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e  n==aKeyword[j].n
1b30: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
1b40: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
1b50: 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20  mp((char*)p->z, 
1b60: 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f  &zKeyText[aKeywo
1b70: 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d  rd[j].i], p->n)=
1b80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
1b90: 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f  intype |= aKeywo
1ba0: 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  rd[j].code;.    
1bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1bc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
1bd0: 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a  tcase( j==0 || j
1be0: 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a  ==1 || j==2 || j
1bf0: 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a  ==3 || j==4 || j
1c00: 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20  ==5 || j==6 );. 
1c10: 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53     if( j>=ArrayS
1c20: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b  ize(aKeyword) ){
1c30: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1c40: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
1c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c60: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
1c70: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
1c80: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
1c90: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
1ca0: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
1cb0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
1cc0: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
1cd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d  onst char *zSp =
1ce0: 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74   " ";.    assert
1cf0: 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pB!=0 );.    i
1d00: 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b  f( pC==0 ){ zSp+
1d10: 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33  +; }.    sqlite3
1d20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d30: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73   "unknown or uns
1d40: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
1d50: 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54  pe: ".       "%T
1d60: 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42   %T%s%T", pA, pB
1d70: 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20  , zSp, pC);.    
1d80: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1d90: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
1da0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1db0: 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20  OUTER)!=0 .     
1dc0: 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65      && (jointype
1dd0: 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   & (JT_LEFT|JT_R
1de0: 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20  IGHT))!=JT_LEFT 
1df0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1e00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1e10: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
1e20: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1e30: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1e40: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1e50: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1e60: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1e70: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e90: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1ea0: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
1eb0: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
1ec0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
1ed0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
1ee0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
1ef0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
1f00: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
1f10: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
1f20: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1f30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1f40: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1f50: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1f60: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1f70: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1f80: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1f90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
1fb0: 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74 61  h the first N ta
1fc0: 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72  bles in pSrc, fr
1fd0: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1fe0: 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a  , looking for a.
1ff0: 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68 61  ** table that ha
2000: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  s a column named
2010: 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57   zCol.  .**.** W
2020: 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a  hen found, set *
2030: 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c  piTab and *piCol
2040: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e   to the table in
2050: 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69  dex and column i
2060: 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  ndex.** of the m
2070: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61  atching column a
2080: 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a  nd return TRUE..
2090: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75  **.** If not fou
20a0: 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  nd, return FALSE
20b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20c0: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
20d0: 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  dex(.  SrcList *
20e0: 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41  pSrc,       /* A
20f0: 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74  rray of tables t
2100: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
2110: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
2120: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2130: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e  tables in pSrc->
2140: 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  a[] to search */
2150: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2160: 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Col,    /* Name 
2170: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65  of the column we
2180: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
2190: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62   */.  int *piTab
21a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ,          /* Wr
21b0: 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72  ite index of pSr
21c0: 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20  c->a[] here */. 
21d0: 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20   int *piCol     
21e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69        /* Write i
21f0: 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b  ndex of pSrc->a[
2200: 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43  *piTab].pTab->aC
2210: 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ol[] here */.){.
2220: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2230: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
2240: 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
2250: 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  s in pSrc */.  i
2260: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
2270: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2280: 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20  column matching 
2290: 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  zCol */..  asser
22a0: 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28  t( (piTab==0)==(
22b0: 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a  piCol==0) );  /*
22c0: 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72   Both or neither
22d0: 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66   are NULL */.  f
22e0: 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b  or(i=0; i<N; i++
22f0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f  ){.    iCol = co
2300: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e  lumnIndex(pSrc->
2310: 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29  a[i].pTab, zCol)
2320: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
2330: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2340: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  iTab ){.        
2350: 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20  *piTab = i;.    
2360: 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f      *piCol = iCo
2370: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
2380: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
23a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23b0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
23c0: 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70  to add terms imp
23d0: 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e  lied by JOIN syn
23e0: 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  tax to the.** WH
23f0: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
2400: 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43  ssion of a SELEC
2410: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65  T statement. The
2420: 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68   new term, which
2430: 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74  .** is ANDed wit
2440: 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 57  h the existing W
2450: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20  HERE clause, is 
2460: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
2470: 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31  **    (tab1.col1
2480: 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a   = tab2.col2).**
2490: 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20 69  .** where tab1 i
24a0: 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74 61  s the iSrc'th ta
24b0: 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70  ble in SrcList p
24c0: 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73 20  Src and tab2 is 
24d0: 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29  the .** (iSrc+1)
24e0: 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31  'th. Column col1
24f0: 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c   is column iColL
2500: 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64  eft of tab1, and
2510: 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75   col2 is.** colu
2520: 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20  mn iColRight of 
2530: 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tab2..*/.static 
2540: 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72  void addWhereTer
2550: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
2560: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2570: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
2580: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
2590: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
25c0: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
25d0: 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20  .  int iLeft,   
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
2600: 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f  irst table to jo
2610: 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  in in pSrc */.  
2620: 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20  int iColLeft,   
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
2650: 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c  mn in first tabl
2660: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68  e */.  int iRigh
2670: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2680: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2690: 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  of second table 
26a0: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
26b0: 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20   iColRight,     
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
26e0: 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  in second table 
26f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72  */.  int isOuter
2700: 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Join,           
2710: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2720: 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52  this is an OUTER
2730: 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20   join */.  Expr 
2740: 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20 20  **ppWhere       
2750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2760: 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45 20  /OUT: The WHERE 
2770: 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f  clause to add to
2780: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
2790: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
27a0: 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a  b;.  Expr *pE1;.
27b0: 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45    Expr *pE2;.  E
27c0: 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73  xpr *pEq;..  ass
27d0: 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68  ert( iLeft<iRigh
27e0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
27f0: 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74  Src->nSrc>iRight
2800: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2810: 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61  rc->a[iLeft].pTa
2820: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
2830: 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70  Src->a[iRight].p
2840: 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20  Tab );..  pE1 = 
2850: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
2860: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
2870: 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66  , iLeft, iColLef
2880: 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69  t);.  pE2 = sqli
2890: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
28a0: 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52  xpr(db, pSrc, iR
28b0: 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29  ight, iColRight)
28c0: 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74  ;..  pEq = sqlit
28d0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
28e0: 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 2c  TK_EQ, pE1, pE2,
28f0: 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26   0);.  if( pEq &
2900: 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b  & isOuterJoin ){
2910: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
2920: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f  erty(pEq, EP_Fro
2930: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
2940: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2950: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b  erty(pEq, EP_Tok
2960: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2970: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
2980: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 71  tVVAProperty(pEq
2990: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
29a0: 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a      pEq->iRightJ
29b0: 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29  oinTable = (i16)
29c0: 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d  pE2->iTable;.  }
29d0: 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71  .  *ppWhere = sq
29e0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
29f0: 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b   *ppWhere, pEq);
2a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2a10: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2a20: 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65  operty on all te
2a30: 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  rms of the given
2a40: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
2a50: 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72  And set the Expr
2a60: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2a70: 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65   to iTable for e
2a80: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
2a90: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
2aa0: 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f  **.** The EP_Fro
2ab0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69  mJoin property i
2ac0: 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20  s used on terms 
2ad0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
2ae0: 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20   to tell.** the 
2af0: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
2b00: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
2b10: 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20   that this term 
2b20: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  is part of the.*
2b30: 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69  * join restricti
2b40: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  on specified in 
2b50: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2b60: 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61  clause and not a
2b70: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
2b80: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45  more general WHE
2b90: 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73  RE clause.  Thes
2ba0: 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65  e terms are move
2bb0: 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a  d over to the.**
2bc0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75   WHERE clause du
2bd0: 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73  ring join proces
2be0: 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64  sing but we need
2bf0: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
2c00: 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e  t they.** origin
2c10: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
2c20: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
2c30: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
2c40: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2c50: 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63  ells the WHERE c
2c60: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2c70: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70   that the.** exp
2c80: 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20  ression depends 
2c90: 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a  on table iRightJ
2ca0: 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66  oinTable even if
2cb0: 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e   that table is n
2cc0: 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79  ot.** explicitly
2cd0: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2ce0: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  e expression.  T
2cf0: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
2d00: 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72  is needed.** for
2d10: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
2d20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
2d30: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
2d40: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
2d50: 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35  =t2.b AND t1.x=5
2d60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65  .**.** The where
2d70: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
2d80: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2d90: 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d  ing of the t1.x=
2da0: 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20  5.** term until 
2db0: 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f  after the t2 loo
2dc0: 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  p of the join.  
2dd0: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a  In that way, a.*
2de0: 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69  * NULL t2 row wi
2df0: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77  ll be inserted w
2e00: 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e  henever t1.x!=5.
2e10: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a    If we do not.*
2e20: 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  * defer the hand
2e30: 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20  ling of t1.x=5, 
2e40: 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  it will be proce
2e50: 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ssed immediately
2e60: 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31  .** after the t1
2e70: 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77   loop and rows w
2e80: 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c  ith t1.x!=5 will
2e90: 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e   never appear in
2ea0: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20  .** the output, 
2eb0: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  which is incorre
2ec0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2ed0: 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45  id setJoinExpr(E
2ee0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
2ef0: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
2f00: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2f10: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
2f20: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
2f30: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2f40: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
2f50: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2f60: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2f70: 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  VAProperty(p, EP
2f80: 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
2f90: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
2fa0: 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65  le = (i16)iTable
2fb0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
2fc0: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20  =TK_FUNCTION && 
2fd0: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
2fe0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2ff0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78   for(i=0; i<p->x
3000: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  .pList->nExpr; i
3010: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ++){.        set
3020: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c  JoinExpr(p->x.pL
3030: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
3040: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   iTable);.      
3050: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a  }.    }.    setJ
3060: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
3070: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
3080: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
3090: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
30a0: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
30b0: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
30c0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
30d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
30e0: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
30f0: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
3100: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
3110: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
3120: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
3130: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
3140: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
3150: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
3160: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
3170: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
3180: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
3190: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
31a0: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
31b0: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
31c0: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
31d0: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
31e0: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
31f0: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
3200: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
3210: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
3220: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
3230: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
3240: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
3250: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
3260: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
3270: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
3280: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
3290: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
32a0: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
32b0: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
32c0: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
32d0: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
32e0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
32f0: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
3300: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
3310: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
3320: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
3330: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
3340: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
3350: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
3360: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
3370: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
3380: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3390: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
33a0: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
33b0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
33c0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
33d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
33e0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
33f0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3400: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3410: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3420: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3430: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3440: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
3450: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
3460: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
3470: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
3480: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
3490: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
34a0: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
34b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
34c0: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
34d0: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
34e0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
34f0: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
3500: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
3510: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
3520: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
3530: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
3540: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
3550: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
3560: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
3570: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
3580: 3d 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f  = (pRight->fg.jo
3590: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
35a0: 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  R)!=0;..    /* W
35b0: 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20  hen the NATURAL 
35c0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
35d0: 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c  nt, add WHERE cl
35e0: 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20  ause terms for. 
35f0: 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75     ** every colu
3600: 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  mn that the two 
3610: 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63  tables have in c
3620: 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ommon..    */.  
3630: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67    if( pRight->fg
3640: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
3650: 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20  ATURAL ){.      
3660: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
3670: 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  || pRight->pUsin
3680: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
3690: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
36a0: 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20  rse, "a NATURAL 
36b0: 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76  join may not hav
36c0: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
36d0: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
36e0: 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20  lause", 0);.    
36f0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3700: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
3710: 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62  j=0; j<pRightTab
3720: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
3730: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
3740: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
3750: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69  column in the ri
3760: 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ght table */.   
3770: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
3780: 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20      /* Matching 
3790: 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  left table */.  
37a0: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
37b0: 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67  ol;  /* Matching
37c0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c   column in the l
37d0: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  eft table */..  
37e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52        zName = pR
37f0: 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  ightTab->aCol[j]
3800: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3810: 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  if( tableAndColu
3820: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3830: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3840: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a  , &iLeftCol) ){.
3850: 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65            addWhe
3860: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3870: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3880: 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20  tCol, i+1, j,.  
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70       isOuter, &p
38b0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
38c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
38d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
38e0: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
38f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
3900: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
3910: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3920: 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69  ight->pOn && pRi
3930: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3940: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3950: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
3960: 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f  nnot have both O
3970: 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20  N and USING ".  
3980: 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69        "clauses i
3990: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22  n the same join"
39a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
39b0: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
39c0: 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75   Add the ON clau
39d0: 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
39e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
39f0: 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  e, connected by.
3a00: 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70      ** an AND op
3a10: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  erator..    */. 
3a20: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3a30: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
3a40: 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69  isOuter ) setJoi
3a50: 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f  nExpr(pRight->pO
3a60: 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73  n, pRight->iCurs
3a70: 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57  or);.      p->pW
3a80: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
3a90: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3aa0: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69  , p->pWhere, pRi
3ab0: 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  ght->pOn);.     
3ac0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30   pRight->pOn = 0
3ad0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3ae0: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
3af0: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
3b00: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
3b10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
3b20: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
3b30: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
3b40: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
3b50: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
3b60: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
3b70: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
3b80: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
3b90: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
3ba0: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
3bb0: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
3bc0: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
3bd0: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
3be0: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
3bf0: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
3c00: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
3c10: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
3c20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
3c30: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
3c40: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
3c50: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
3c60: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
3c70: 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  ( pRight->pUsing
3c80: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
3c90: 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74   *pList = pRight
3ca0: 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20  ->pUsing;.      
3cb0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74  for(j=0; j<pList
3cc0: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
3cd0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
3ce0: 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
3cf0: 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65   the term in the
3d00: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f   USING clause */
3d10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3d20: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ft;       /* Tab
3d30: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77  le on the left w
3d40: 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  ith matching col
3d50: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
3d60: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
3d70: 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ;    /* Column n
3d80: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
3d90: 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  g column on the 
3da0: 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  left */.        
3db0: 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20  int iRightCol;  
3dc0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
3dd0: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
3de0: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68  lumn on the righ
3df0: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  t */..        zN
3e00: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a  ame = pList->a[j
3e10: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
3e20: 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c   iRightCol = col
3e30: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
3e40: 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab, zName);.    
3e50: 20 20 20 20 69 66 28 20 69 52 69 67 68 74 43 6f      if( iRightCo
3e60: 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  l<0.         || 
3e70: 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49  !tableAndColumnI
3e80: 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20  ndex(pSrc, i+1, 
3e90: 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26  zName, &iLeft, &
3ea0: 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20  iLeftCol).      
3eb0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
3ec0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3ed0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a  Parse, "cannot j
3ee0: 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  oin using column
3ef0: 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20   %s - column ". 
3f00: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20             "not 
3f10: 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20  present in both 
3f20: 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b  tables", zName);
3f30: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
3f40: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
3f50: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
3f60: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63  erm(pParse, pSrc
3f70: 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f  , iLeft, iLeftCo
3f80: 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f  l, i+1, iRightCo
3f90: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
3fa0: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
3fb0: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
3fc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3fd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
3fe0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
3ff0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65  nce */.static Ke
4000: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
4010: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
4020: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4030: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
4040: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
4050: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
4060: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
4070: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
4080: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
4090: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
40a0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
40b0: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
40c0: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
40d0: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
40e0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
40f0: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
4100: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
4110: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  /.);../*.** Gene
4120: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
4130: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
4140: 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73  ord in registers
4150: 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f   regData.** thro
4160: 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74  ugh regData+nDat
4170: 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72  a-1 onto the sor
4180: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
4190: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
41a0: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
41b0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
41c0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
41d0: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
41e0: 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt,        /* In
41f0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4200: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
4210: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
4220: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
4230: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
4240: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
4250: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20  .  int regData, 
4260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4270: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
4280: 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73  ing data to be s
4290: 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  orted */.  int r
42a0: 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20  egOrigData,     
42b0: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
42c0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
42d0: 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20   before packing 
42e0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4300: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
4310: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
4320: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
4330: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
4340: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
4350: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
4360: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
4370: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
4380: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
43b0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
43c0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
43d0: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
43e0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
43f0: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4400: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4410: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4420: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4430: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
4440: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
4450: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
4460: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
4470: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
4480: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
4490: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
44a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
44b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
44e0: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
44f0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4500: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4510: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4520: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4530: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
4540: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
4550: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
4560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4570: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
4580: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
4590: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
45c0: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
45d0: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
45e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69  r */.  int iLimi
45f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
4610: 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  IT counter */.. 
4620: 20 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30   assert( bSeq==0
4630: 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20   || bSeq==1 );. 
4640: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
4650: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
4660: 67 4f 72 69 67 44 61 74 61 20 29 3b 0a 20 20 69  gOrigData );.  i
4670: 66 28 20 6e 50 72 65 66 69 78 52 65 67 20 29 7b  f( nPrefixReg ){
4680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72  .    assert( nPr
4690: 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62  efixReg==nExpr+b
46a0: 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42 61  Seq );.    regBa
46b0: 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20 6e  se = regData - n
46c0: 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d  Expr - bSeq;.  }
46d0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73  else{.    regBas
46e0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
46f0: 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65   + 1;.    pParse
4700: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b  ->nMem += nBase;
4710: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4720: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d  Select->iOffset=
4730: 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69  =0 || pSelect->i
4740: 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c  Limit!=0 );.  iL
4750: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
4760: 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65 63  iOffset ? pSelec
4770: 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70  t->iOffset+1 : p
4780: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a  Select->iLimit;.
4790: 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f    pSort->labelDo
47a0: 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ne = sqlite3Vdbe
47b0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
47c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
47d0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
47e0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
47f0: 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72 69   regBase, regOri
4800: 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20  gData,.         
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
4830: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
4840: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
4850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4860: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
4870: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
4880: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
4890: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
48a0: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
48b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
48c0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
48d0: 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42  e, regData, regB
48e0: 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20  ase+nExpr+bSeq, 
48f0: 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71  nData);.  }.  sq
4900: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4910: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4920: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
4930: 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20  , nBase-nOBSat, 
4940: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
4950: 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ( nOBSat>0 ){.  
4960: 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79    int regPrevKey
4970: 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74  ;   /* The first
4980: 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20   nOBSat columns 
4990: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
49a0: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
49b0: 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ddrFirst;    /* 
49c0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
49d0: 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a  P_IfNot opcode *
49e0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d  /.    int addrJm
49f0: 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
4a00: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d  ss of the OP_Jum
4a10: 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  p opcode */.    
4a20: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
4a30: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74    /* Opcode that
4a40: 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65   opens the sorte
4a50: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  r */.    int nKe
4a60: 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
4a70: 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20  mber of sorting 
4a80: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63  key columns, inc
4a90: 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e  luding OP_Sequen
4aa0: 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  ce */.    KeyInf
4ab0: 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f  o *pKI;     /* O
4ac0: 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20  riginal KeyInfo 
4ad0: 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61  on the sorter ta
4ae0: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50  ble */..    regP
4af0: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
4b00: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
4b10: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
4b20: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
4b30: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
4b40: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62  Sort->nOBSat + b
4b50: 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65  Seq;.    if( bSe
4b60: 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46  q ){.      addrF
4b70: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
4b80: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
4b90: 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  fNot, regBase+nE
4ba0: 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65  xpr); .    }else
4bb0: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
4bc0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
4bd0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp1(v, OP_Sequ
4be0: 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d  enceTest, pSort-
4bf0: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
4c00: 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  }.    VdbeCovera
4c10: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4c20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
4c30: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50  OP_Compare, regP
4c40: 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c  revKey, regBase,
4c50: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
4c60: 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  .    pOp = sqlit
4c70: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
4c80: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
4c90: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dex);.    if( pP
4ca0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
4cb0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
4cc0: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e  .    pOp->p2 = n
4cd0: 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20  Key + nData;.   
4ce0: 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70   pKI = pOp->p4.p
4cf0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  KeyInfo;.    mem
4d00: 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72  set(pKI->aSortOr
4d10: 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69  der, 0, pKI->nFi
4d20: 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f  eld); /* Makes O
4d30: 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74 65 73  P_Jump below tes
4d40: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c  table */.    sql
4d50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4d60: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
4d70: 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  KI, P4_KEYINFO);
4d80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
4d90: 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b  KI->nXField>2 );
4da0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
4db0: 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
4dc0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
4dd0: 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  se, pSort->pOrde
4de0: 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20  rBy, nOBSat,.   
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46          pKI->nXF
4e20: 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64  ield-1);.    add
4e30: 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rJmp = sqlite3Vd
4e40: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4e50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4e60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
4e70: 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30  mp, addrJmp+1, 0
4e80: 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64  , addrJmp+1); Vd
4e90: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4ea0: 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42     pSort->labelB
4eb0: 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64  kOut = sqlite3Vd
4ec0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4ed0: 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65      pSort->regRe
4ee0: 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
4ef0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
4f00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4f10: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
4f20: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
4f30: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
4f40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
4f60: 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e  tSorter, pSort->
4f70: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  iECursor);.    i
4f80: 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  f( iLimit ){.   
4f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4fa0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
4fb0: 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d  , iLimit, pSort-
4fc0: 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20  >labelDone);.   
4fd0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4fe0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
4ff0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5000: 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b  e(v, addrFirst);
5010: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5020: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
5030: 20 72 65 67 42 61 73 65 2c 20 72 65 67 50 72 65   regBase, regPre
5040: 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  vKey, pSort->nOB
5050: 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Sat);.    sqlite
5060: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
5070: 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20   addrJmp);.  }. 
5080: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
5090: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
50a0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
50b0: 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72    op = OP_Sorter
50c0: 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b  Insert;.  }else{
50d0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78  .    op = OP_Idx
50e0: 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71  Insert;.  }.  sq
50f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5100: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
5110: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
5120: 64 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  d);.  if( iLimit
5130: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
5140: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
5150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5160: 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  , OP_IfNotZero, 
5170: 69 4c 69 6d 69 74 2c 20 30 2c 20 31 29 3b 20 56  iLimit, 0, 1); V
5180: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5190: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
51a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp1(v, OP_Last
51b0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
51c0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
51d0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
51e0: 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69  Delete, pSort->i
51f0: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
5200: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5210: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  e(v, addr);.  }.
5220: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
5230: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
5240: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
5250: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
5260: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
5270: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
5280: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
5290: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
52a0: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
52b0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
52c0: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
52d0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
52e0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
52f0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5300: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
5310: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
5320: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
5330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5340: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
5350: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
5360: 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65  ue, 1); VdbeCove
5370: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
5380: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
5390: 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  FSET"));.  }.}..
53a0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
53b0: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
53c0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
53d0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
53e0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
53f0: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
5400: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
5410: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
5420: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
5430: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
5440: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
5450: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
5460: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
5470: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
5480: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
5490: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
54a0: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
54b0: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
54c0: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
54d0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
54e0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
54f0: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
5500: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
5510: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
5520: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
5530: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
5540: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
5550: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
5560: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
5570: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
5580: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
5590: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
55a0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
55b0: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
55c0: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
55d0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
55e0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
55f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
5600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5610: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
5620: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
5630: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5640: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
5650: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
5660: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
5670: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
5680: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5690: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
56a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
56b0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
56c0: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
56d0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
56e0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
56f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5700: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5710: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
5720: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5730: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5740: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b  sert, iTab, r1);
5750: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
5760: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5770: 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   r1);.}..#ifndef
5780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5790: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
57a0: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
57b0: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
57c0: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
57d0: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
57e0: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
57f0: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
5800: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
5810: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
5820: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
5830: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
5840: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
5850: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
5860: 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63  error used to oc
5870: 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70  cur.** in multip
5880: 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65  le places.  (The
5890: 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75   error only occu
58a0: 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20  rs in one place 
58b0: 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72  now, but we.** r
58c0: 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75  etain the subrou
58d0: 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  tine to minimize
58e0: 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e   code disruption
58f0: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
5900: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
5910: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
5920: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5930: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  ,       /* Parse
5940: 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53   context. */.  S
5950: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
5960: 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69  ,   /* Destinati
5970: 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73  on of SELECT res
5980: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ults */.  int nE
5990: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
59a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
59b0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  lt columns retur
59c0: 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f  ned by SELECT */
59d0: 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  .){.  int eDest 
59e0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
59f0: 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26    if( nExpr>1 &&
5a00: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
5a10: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
5a20: 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  et) ){.    sqlit
5a30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5a40: 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
5a50: 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
5a60: 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
5a70: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
5a80: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
5a90: 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ssion");.    ret
5aa0: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
5ab0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5ac0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
5ad0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
5ae0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
5af0: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
5b00: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
5b10: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
5b20: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
5b30: 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ab is negative, 
5b40: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
5b50: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
5b60: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
5b70: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
5b80: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
5b90: 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20 69  ow.  If srcTab i
5ba0: 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  s.** zero or mor
5bb0: 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  e, then data is 
5bc0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
5bd0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
5be0: 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74   used only .** t
5bf0: 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c  o get number col
5c00: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74  umns and the dat
5c10: 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 63  atype for each c
5c20: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
5c30: 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65   void selectInne
5c40: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
5c50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
5c60: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
5c70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
5c80: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
5c90: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
5ca0: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
5cb0: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
5cc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5cd0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
5ce0: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
5cf0: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
5d00: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5d20: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
5d30: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  his table */.  S
5d40: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
5d50: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
5d60: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
5d70: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52  ow to process OR
5d80: 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74  DER BY */.  Dist
5d90: 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e  inctCtx *pDistin
5da0: 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55  ct, /* If not NU
5db0: 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20  LL, info on how 
5dc0: 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49  to process DISTI
5dd0: 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  NCT */.  SelectD
5de0: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
5df0: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
5e00: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
5e10: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  s */.  int iCont
5e20: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
5e30: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
5e40: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
5e50: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
5e60: 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
5e70: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
5e80: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
5e90: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
5ea0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
5eb0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5ec0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
5ed0: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
5ee0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5ef0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5f00: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
5f10: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
5f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5f30: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
5f40: 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  y holding result
5f50: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44   set */.  int eD
5f60: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
5f70: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
5f80: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
5f90: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
5fa0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
5fb0: 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67  rm; /* First arg
5fc0: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
5fd0: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
5fe0: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
5ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6000: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
6010: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
6020: 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20  PrefixReg = 0;  
6030: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6040: 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
6050: 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65  ers before regRe
6060: 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sult */..  asser
6070: 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74  t( v );.  assert
6080: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
6090: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70   hasDistinct = p
60a0: 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74  Distinct ? pDist
60b0: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
60c0: 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  : WHERE_DISTINCT
60d0: 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f  _NOOP;.  if( pSo
60e0: 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72  rt && pSort->pOr
60f0: 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74  derBy==0 ) pSort
6100: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72   = 0;.  if( pSor
6110: 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  t==0 && !hasDist
6120: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
6130: 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30  rt( iContinue!=0
6140: 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   );.    codeOffs
6150: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
6160: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
6170: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
6180: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
6190: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75  ns..  */.  nResu
61a0: 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  ltCol = pEList->
61b0: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
61c0: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
61d0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
61e0: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
61f0: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
6200: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
6210: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
6220: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6230: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6240: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6250: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6260: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
6270: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
6280: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
6290: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
62a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
62b0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
62c0: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
62d0: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
62e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
62f0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
6300: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
6310: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
6320: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6330: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6340: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6350: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6360: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
6370: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
6380: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
6390: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
63a0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
63b0: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
63c0: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
63d0: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
63e0: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
63f0: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
6400: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
6410: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
6420: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6430: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6440: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6450: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
6460: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
6470: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6480: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
6490: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
64a0: 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20  ol;.  regResult 
64b0: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
64c0: 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20    if( srcTab>=0 
64d0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
64e0: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
64f0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
6500: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6510: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
6520: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
6530: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
6540: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
6550: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
6560: 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  e));.    }.  }el
6570: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
6580: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
6590: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
65a0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
65b0: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
65c0: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
65d0: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
65e0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
65f0: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
6600: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
6610: 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20   u8 ecelFlags;. 
6620: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
6630: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
6640: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
6650: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
6660: 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63 65 6c  ne ){.      ecel
6670: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 45  Flags = SQLITE_E
6680: 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c  CEL_DUP;.    }el
6690: 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c  se{.      ecelFl
66a0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ags = 0;.    }. 
66b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
66c0: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
66d0: 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65  e, pEList, regRe
66e0: 73 75 6c 74 2c 20 30 2c 20 65 63 65 6c 46 6c 61  sult, 0, ecelFla
66f0: 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  gs);.  }..  /* I
6700: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
6710: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
6720: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
6730: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
6740: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
6750: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
6760: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
6770: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
6780: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
6790: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
67a0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
67b0: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
67c0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
67d0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
67e0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
67f0: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
6800: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
6810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
6820: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
6830: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
6840: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
6850: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
6860: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
6870: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
6880: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
6890: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
68a0: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
68b0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
68c0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
68d0: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
68e0: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
68f0: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
6900: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
6910: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6920: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
6930: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
6940: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
6950: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
6960: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
6970: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
6980: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
6990: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
69a0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
69b0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
69c0: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
69d0: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
69e0: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
69f0: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
6a00: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
6a10: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
6a20: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
6a30: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
6a40: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
6a50: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
6a60: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
6a70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6a80: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
6a90: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
6aa0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
6ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
6ac0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
6ad0: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
6ae0: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
6af0: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
6b00: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
6b10: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
6b20: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
6b30: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
6b40: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6b50: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
6b60: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
6b70: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
6b80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6b90: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6ba0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
6bb0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
6bc0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6bd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6be0: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
6bf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
6c00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6c10: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
6c20: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
6c30: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
6c40: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
6c50: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
6c60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6c70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6c80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
6c90: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
6ca0: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
6cb0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
6cc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6cd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
6ce0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6cf0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
6d00: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
6d10: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
6d20: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
6d30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6d40: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
6d50: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
6d60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6d70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6d80: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
6d90: 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  p || pParse->db-
6da0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6dc0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6dd0: 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74  _Copy, regResult
6de0: 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75  , regPrev, nResu
6df0: 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ltCol-1);.      
6e00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6e10: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  ..      case WHE
6e20: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
6e30: 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
6e40: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
6e50: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
6e60: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
6e70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6e80: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
6e90: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
6ea0: 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63  assert( pDistinc
6eb0: 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  t->eTnctType==WH
6ec0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
6ed0: 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20  RDERED );.      
6ee0: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
6ef0: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
6f00: 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74  ->tabTnct, iCont
6f10: 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  inue, nResultCol
6f20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6f30: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
6f40: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
6f50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6f60: 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30      if( pSort==0
6f70: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
6f80: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
6f90: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
6fa0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
6fb0: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
6fc0: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
6fd0: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
6fe0: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
6ff0: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
7000: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
7010: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
7020: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
7030: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7040: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
7050: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
7060: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
7070: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7080: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
7090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
70a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
70b0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
70c0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
70d0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
70e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
70f0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
7100: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
7110: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7120: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7130: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
7140: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
7150: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
7160: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
7170: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
7180: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
7190: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
71a0: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
71b0: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
71c0: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
71d0: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
71e0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
71f0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
7200: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
7210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7220: 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65  p3(v, OP_IdxDele
7230: 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65  te, iParm, regRe
7240: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7250: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7260: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
7270: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
7280: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
7290: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
72a0: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
72b0: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
72c0: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
72d0: 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20  ase SRT_Fifo:.  
72e0: 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 46    case SRT_DistF
72f0: 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ifo:.    case SR
7300: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
7310: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
7320: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
7330: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7340: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 72  ange(pParse, nPr
7350: 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20  efixReg+1);.    
7360: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7370: 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t==SRT_Table );.
7380: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7390: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
73a0: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Tab );.      tes
73b0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
73c0: 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20  T_Fifo );.      
73d0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
73e0: 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b  =SRT_DistFifo );
73f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7400: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7410: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7420: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7430: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29  , r1+nPrefixReg)
7440: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
7450: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20  _OMIT_CTE.      
7460: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
7470: 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20  istFifo ){.     
7480: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
7490: 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74  tination is Dist
74a0: 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f  Fifo, then curso
74b0: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
74c0: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
74d0: 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  n an ephemeral i
74e0: 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75 72  ndex. If the cur
74f0: 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65  rent row is alre
7500: 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20  ady present.    
7510: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
7520: 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  dex, do not writ
7530: 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70  e it to the outp
7540: 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20  ut. If not, add 
7550: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
7560: 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68  urrent row to th
7570: 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63  e index and proc
7580: 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e 67  eed with writing
7590: 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20   it to the.     
75a0: 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62     ** output tab
75b0: 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a  le as well.  */.
75c0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
75d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
75e0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34  rrentAddr(v) + 4
75f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7600: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
7610: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
7620: 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30  m+1, addr, r1, 0
7630: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
7640: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7660: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
7670: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
7680: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  r1);.        ass
7690: 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b  ert( pSort==0 );
76a0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
76b0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
76c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
76d0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
76e0: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e  , pSort, p, r1+n
76f0: 50 72 65 66 69 78 52 65 67 2c 72 65 67 52 65 73  PrefixReg,regRes
7700: 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52 65 67  ult,1,nPrefixReg
7710: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7720: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
7730: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7740: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
7750: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7760: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
7770: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
7780: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7790: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
77a0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
77b0: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
77c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
77d0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
77e0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
77f0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7800: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7810: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
7820: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7830: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7840: 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67  , r1, nPrefixReg
7850: 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +1);.      break
7860: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
7870: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
7880: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
7890: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
78a0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
78b0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
78c0: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
78d0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
78e0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
78f0: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
7900: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
7910: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
7920: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
7930: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
7940: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
7950: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
7960: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
7970: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
7980: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
7990: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
79a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
79b0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
79c0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
79d0: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
79e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
79f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
7a00: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
7a10: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
7a20: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
7a30: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
7a40: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
7a50: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
7a60: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
7a70: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
7a80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
7a90: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
7aa0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
7ab0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
7ac0: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
7ad0: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
7ae0: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
7af0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
7b00: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7b10: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7b20: 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74  esult, regResult
7b30: 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29  , 1, nPrefixReg)
7b40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7b50: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
7b60: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
7b70: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
7b80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7b90: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
7ba0: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
7bb0: 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61  ,1,r1, &pDest->a
7bc0: 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  ffSdst, 1);.    
7bd0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7be0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
7bf0: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
7c00: 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  sult, 1);.      
7c10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7c20: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
7c30: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
7c40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7c50: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
7c60: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
7c70: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7c80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
7c90: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
7ca0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7cb0: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
7cc0: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
7cd0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7ce0: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
7cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7d00: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7d10: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
7d20: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
7d30: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
7d40: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
7d50: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
7d60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7d70: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
7d80: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
7d90: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
7da0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
7db0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
7dc0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
7dd0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
7de0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
7df0: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
7e00: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
7e10: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
7e20: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
7e30: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
7e40: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
7e50: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
7e60: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
7e70: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
7e80: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
7e90: 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ult, regResult, 
7ea0: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  1, nPrefixReg);.
7eb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7ec0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
7ed0: 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b  Result==iParm );
7ee0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
7ef0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
7f00: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
7f10: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7f30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
7f40: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
7f50: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7f60: 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20  RY */..    case 
7f70: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20  SRT_Coroutine:  
7f80: 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74       /* Send dat
7f90: 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e  a to a co-routin
7fa0: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52  e */.    case SR
7fb0: 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20  T_Output: {     
7fc0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
7fd0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
7fe0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7ff0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
8000: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8010: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
8020: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69  utput );.      i
8030: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8040: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
8050: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
8060: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
8070: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8080: 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  ltCol,.         
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
80a0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
80b0: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
80c0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
80d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
80e0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
80f0: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
8100: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
8110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8130: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
8140: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  w, regResult, nR
8150: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
8160: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
8170: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
8180: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
8190: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
81a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
81b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
81c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
81d0: 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69  T_CTE.    /* Wri
81e0: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  te the results i
81f0: 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71  nto a priority q
8200: 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64  ueue that is ord
8210: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a  er according to.
8220: 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f      ** pDest->pO
8230: 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e  rderBy (in pSO).
8240: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
8250: 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74   (in iParm) is t
8260: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e  he cursor for an
8270: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  .    ** index wi
8280: 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20  th pSO->nExpr+2 
8290: 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20  columns.  Build 
82a0: 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20  a key using pSO 
82b0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20  for the first.  
82c0: 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20    ** pSO->nExpr 
82d0: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61  columns, then ma
82e0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73  ke sure all keys
82f0: 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61   are unique by a
8300: 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66  dding a.    ** f
8310: 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65  inal OP_Sequence
8320: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61   column.  The la
8330: 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  st column is the
8340: 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f   record as a blo
8350: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
8360: 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  se SRT_DistQueue
8370: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51  :.    case SRT_Q
8380: 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ueue: {.      in
8390: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  t nKey;.      in
83a0: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20  t r1, r2, r3;.  
83b0: 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74      int addrTest
83c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
83d0: 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20  List *pSO;.     
83e0: 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f   pSO = pDest->pO
83f0: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73  rderBy;.      as
8400: 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20  sert( pSO );.   
8410: 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e     nKey = pSO->n
8420: 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d  Expr;.      r1 =
8430: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
8440: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
8450: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
8460: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
8470: 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  e, nKey+2);.    
8480: 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31    r3 = r2+nKey+1
8490: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
84a0: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
84b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
84c0: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
84d0: 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c 20  n is DistQueue, 
84e0: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
84f0: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
8500: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65        ** on a se
8510: 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69  cond ephemeral i
8520: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
8530: 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79  all values every
8540: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20   previously.    
8550: 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
8560: 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20  the queue. */.  
8570: 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20 3d        addrTest =
8580: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8590: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
85a0: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a  d, iParm+1, 0, .
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85d0: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
85e0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
85f0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
8600: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
8610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8620: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
8630: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
8640: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8650: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28  , r3);.      if(
8660: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
8670: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
8680: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8690: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
86a0: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29  rt, iParm+1, r3)
86b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
86c0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
86d0: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
86e0: 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a  ESULT);.      }.
86f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8700: 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nKey; i++){.   
8710: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8720: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
8730: 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8750: 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61  gResult + pSO->a
8760: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
8770: 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20  Col - 1,.       
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20     r2+i);.      
87a0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
87b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
87c0: 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c  Sequence, iParm,
87d0: 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20   r2+nKey);.     
87e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
87f0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
8800: 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c  ord, r2, nKey+2,
8810: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
8820: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8830: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
8840: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
8850: 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20   if( addrTest ) 
8860: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
8870: 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29  ere(v, addrTest)
8880: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
8890: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
88a0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
88b0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
88c0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
88d0: 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20   r2, nKey+2);.  
88e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
88f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8900: 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a  E_OMIT_CTE */...
8910: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
8920: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
8930: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
8940: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
8950: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
8960: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8970: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
8980: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
8990: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
89a0: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
89b0: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
89c0: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
89d0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
89e0: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
89f0: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
8a00: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
8a10: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
8a20: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
8a30: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
8a40: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
8a50: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
8a60: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
8a70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a80: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
8a90: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
8aa0: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
8ab0: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
8ac0: 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c  eached.  Except,
8ad0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69   if.  ** there i
8ae0: 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77  s a sorter, in w
8af0: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f  hich case the so
8b00: 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  rter has already
8b10: 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68   limited.  ** th
8b20: 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e  e output for us.
8b30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72  .  */.  if( pSor
8b40: 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69  t==0 && p->iLimi
8b50: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
8b60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8b70: 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
8b80: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
8b90: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8ba0: 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  v);.  }.}../*.**
8bb0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49   Allocate a KeyI
8bc0: 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69  nfo object suffi
8bd0: 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64  cient for an ind
8be0: 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75  ex of N key colu
8bf0: 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74  mns and.** X ext
8c00: 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b  ra columns..*/.K
8c10: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
8c20: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69  eyInfoAlloc(sqli
8c30: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20  te3 *db, int N, 
8c40: 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45  int X){.  int nE
8c50: 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69  xtra = (N+X)*(si
8c60: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
8c70: 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20  );.  KeyInfo *p 
8c80: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
8c90: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
8ca0: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
8cb0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
8cc0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
8cd0: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
8ce0: 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28     p->nField = (
8cf0: 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58  u16)N;.    p->nX
8d00: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a  Field = (u16)X;.
8d10: 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43      p->enc = ENC
8d20: 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  (db);.    p->db 
8d30: 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = db;.    p->nRe
8d40: 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65  f = 1;.    memse
8d50: 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74  t(&p[1], 0, nExt
8d60: 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ra);.  }else{.  
8d70: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
8d80: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ed = 1;.  }.  re
8d90: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
8da0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65   Deallocate a Ke
8db0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
8dc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49  void sqlite3KeyI
8dd0: 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f  nfoUnref(KeyInfo
8de0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
8df0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8e00: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d  nRef>0 );.    p-
8e10: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
8e20: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71   p->nRef==0 ) sq
8e30: 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
8e40: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8e50: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
8e60: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
8e70: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
8e80: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
8e90: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
8ea0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
8eb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
8ec0: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
8ed0: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
8ee0: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
8ef0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
8f00: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
8f10: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
8f20: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
8f30: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
8f40: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
8f50: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
8f60: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
8f70: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
8f80: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
8f90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8fa0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
8fb0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
8fc0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
8fd0: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
8fe0: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
8ff0: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
9000: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
9010: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9020: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
9030: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
9040: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
9050: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
9060: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
9070: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
9080: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
9090: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
90a0: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
90b0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
90c0: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
90d0: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
90e0: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
90f0: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
9100: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
9110: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
9120: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
9130: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
9140: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
9150: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
9160: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
9170: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
9180: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
9190: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
91a0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
91b0: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
91c0: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
91d0: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
91e0: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
91f0: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
9200: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
9210: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
9220: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
9230: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
9240: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
9250: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
9260: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
9270: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
9280: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
9290: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
92a0: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
92b0: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
92c0: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
92d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
92e0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
92f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9300: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
9310: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
9320: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9330: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
9340: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
9350: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
9360: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
9370: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
9380: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
9390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
93a0: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
93b0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
93c0: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
93d0: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
93e0: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
93f0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9400: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
9410: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9420: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
9430: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
9440: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
9450: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
9460: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
9470: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
9480: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
9490: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
94a0: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
94b0: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
94c0: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
94d0: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
94e0: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
94f0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
9500: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
9510: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
9520: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
9530: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
9540: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
9550: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
9560: 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
9570: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  fltColl;.      p
9580: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53  Info->aColl[i-iS
9590: 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  tart] = pColl;. 
95a0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
95b0: 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d  tOrder[i-iStart]
95c0: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
95d0: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
95e0: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
95f0: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  ../*.** Name of 
9600: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
9610: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
9620: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
9630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9640: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
9650: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
9660: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
9670: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
9680: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
9690: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
96a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
96b0: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
96c0: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
96d0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
96e0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
96f0: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
9700: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9710: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
9720: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
9730: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
9740: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
9750: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9760: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
9770: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
9780: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
9790: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
97a0: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
97b0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
97c0: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
97d0: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
97e0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
97f0: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
9800: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
9810: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
9820: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
9830: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
9840: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
9850: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
9860: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
9870: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
9880: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
9890: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
98a0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
98b0: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
98c0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
98d0: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
98e0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
98f0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
9900: 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70  zUsage){.  if( p
9910: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
9920: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
9930: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9940: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
9950: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
9960: 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55  f(pParse->db, "U
9970: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
9980: 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b  OR %s", zUsage);
9990: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
99a0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
99b0: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
99c0: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
99d0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
99e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
99f0: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
9a00: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
9a10: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
9a20: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
9a30: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
9a40: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
9a50: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
9a60: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
9a70: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
9a80: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
9a90: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
9aa0: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
9ab0: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
9ac0: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
9ad0: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
9ae0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
9af0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
9b00: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
9b10: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
9b20: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
9b30: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
9b40: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
9b50: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
9b60: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
9b70: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
9b80: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
9b90: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
9ba0: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
9bb0: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
9bc0: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
9bd0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
9be0: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ,z).#endif..#if 
9bf0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9c00: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26  OMIT_EXPLAIN) &&
9c10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9c20: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
9c30: 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c  ELECT)./*.** Unl
9c40: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
9c50: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
9c60: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
9c70: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
9c80: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
9c90: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
9ca0: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
9cb0: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
9cc0: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
9cd0: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
9ce0: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65  aption is of one
9cf0: 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d   of the two form
9d00: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50  s:.**.**   "COMP
9d10: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
9d20: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
9d30: 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d   (op)".**   "COM
9d40: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
9d50: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
9d60: 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  2 USING TEMP B-T
9d70: 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20  REE (op)".**.** 
9d80: 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20  where iSub1 and 
9d90: 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e  iSub2 are the in
9da0: 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73  tegers passed as
9db0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
9dc0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  ng.** function p
9dd0: 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f  arameters, and o
9de0: 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65  p is the text re
9df0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
9e00: 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  the parameter.**
9e10: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
9e20: 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  e. The parameter
9e30: 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e   "op" must be on
9e40: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
9e50: 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f  K_EXCEPT,.** TK_
9e60: 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f  INTERSECT or TK_
9e70: 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66  ALL. The first f
9e80: 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61  orm is used if a
9e90: 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20  rgument bUseTmp 
9ea0: 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72  is .** false, or
9eb0: 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   the second form
9ec0: 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a   if it is true..
9ed0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
9ee0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
9ef0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9f00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9f10: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
9f20: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
9f50: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
9f60: 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20  EXCEPT etc. */. 
9f70: 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20   int iSub1,     
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
9fa0: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  1 */.  int iSub2
9fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9fc0: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
9fd0: 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74  ry id 2 */.  int
9fe0: 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20   bUseTmp        
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a000: 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74  True if a temp t
a010: 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f  able was used */
a020: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  .){.  assert( op
a030: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70  ==TK_UNION || op
a040: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
a050: 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
a060: 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b  || op==TK_ALL );
a070: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
a080: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
a090: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a0a0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
a0b0: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
a0c0: 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20  e3MPrintf(.     
a0d0: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22     pParse->db, "
a0e0: 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52  COMPOUND SUBQUER
a0f0: 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73  IES %d AND %d %s
a100: 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53  (%s)", iSub1, iS
a110: 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73  ub2,.        bUs
a120: 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50  eTmp?"USING TEMP
a130: 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65   B-TREE ":"", se
a140: 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20  lectOpName(op). 
a150: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
a160: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a170: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
a180: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
a190: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
a1a0: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
a1b0: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
a1c0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
a1d0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
a1e0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
a1f0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
a200: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c  inComposite(v,w,
a210: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
a220: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
a230: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
a240: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
a250: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
a260: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
a270: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
a280: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
a290: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
a2a0: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
a2b0: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
a2c0: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
a2d0: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
a2e0: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
a2f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
a300: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
a310: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
a320: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
a330: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
a340: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
a350: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
a360: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a370: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
a380: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
a390: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
a3a0: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
a3b0: 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ort,   /* Inform
a3c0: 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44  ation on the ORD
a3d0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
a3e0: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
a3f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a400: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
a410: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
a420: 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65   *pDest /* Write
a430: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
a440: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
a450: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a460: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a480: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
a490: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
a4a0: 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f   addrBreak = pSo
a4b0: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20  rt->labelDone;  
a4c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
a4d0: 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c  p here to exit l
a4e0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
a4f0: 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  rContinue = sqli
a500: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
a510: 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65  (v);  /* Jump he
a520: 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c  re for next cycl
a530: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  e */.  int addr;
a540: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
a550: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
a560: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
a570: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
a580: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
a590: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
a5a0: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
a5b0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
a5c0: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
a5d0: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
a5e0: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
a5f0: 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20  nt iSortTab;    
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a610: 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20  * Sorter cursor 
a620: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
a630: 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b    int nSortData;
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61    /* Trailing va
a660: 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f  lues to read fro
a670: 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  m sorter */.  in
a680: 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b  t i;.  int bSeq;
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
a6b0: 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  f sorter record 
a6c0: 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f  includes seq. no
a6d0: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
a6e0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
a6f0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72  N_COMMENTS.  str
a700: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a710: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
a720: 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66  EList->a;.#endif
a730: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ..  assert( addr
a740: 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28  Break<0 );.  if(
a750: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a760: 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
a770: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a780: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
a790: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
a7a0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
a7b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
a7c0: 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  to(v, addrBreak)
a7d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a7e0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
a7f0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a800: 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20  ut);.  }.  iTab 
a810: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
a820: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
a830: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
a840: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
a850: 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77  ne ){.    regRow
a860: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52  id = 0;.    regR
a870: 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  ow = pDest->iSds
a880: 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  t;.    nSortData
a890: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
a8a0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
a8b0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
a8c0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a8d0: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
a8e0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a8f0: 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74  arse);.    nSort
a900: 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Data = 1;.  }.  
a910: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
a920: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
a930: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
a940: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
a950: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
a960: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
a970: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
a980: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
a990: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
a9a0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
a9b0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
a9c0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
a9d0: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
a9e0: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
a9f0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
aa00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
aa10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
aa20: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
aa30: 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f   iSortTab, regSo
aa40: 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53  rtOut, nKey+1+nS
aa50: 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ortData);.    if
aa60: 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c  ( addrOnce ) sql
aa70: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
aa80: 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
aa90: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
aaa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aab0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
aac0: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
aad0: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
aae0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
aaf0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
ab00: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
ab10: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
ab20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ab30: 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54  P_SorterData, iT
ab40: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
ab50: 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62  iSortTab);.    b
ab60: 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Seq = 0;.  }else
ab70: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  {.    addr = 1 +
ab80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab90: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
aba0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
abb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
abc0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
abd0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
abe0: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
abf0: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54     iSortTab = iT
ac00: 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31  ab;.    bSeq = 1
ac10: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
ac20: 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b   i<nSortData; i+
ac30: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
ac40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ac50: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
ac60: 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72  , nKey+bSeq+i, r
ac70: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64  egRow+i);.    Vd
ac80: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
ac90: 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  s", aOutEx[i].zN
aca0: 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e  ame ? aOutEx[i].
acb0: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
acc0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20  ].zSpan));.  }. 
acd0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
ace0: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  {.    case SRT_E
acf0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
ad00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad10: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
ad20: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
ad30: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
ad40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ad50: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
ad60: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
ad70: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
ad80: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
ad90: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
ada0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
adb0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
adc0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
add0: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
ade0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
adf0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
ae00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ae10: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
ae20: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
ae30: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
ae40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ae50: 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74 2d           &pDest-
ae60: 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20  >affSdst, 1);.  
ae70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ae80: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ae90: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ge(pParse, regRo
aea0: 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  w, 1);.      sql
aeb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aec0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
aed0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
aee0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
aef0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
af00: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
af10: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
af20: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
af30: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
af40: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69  Parse, regRow, i
af50: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
af60: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
af70: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
af80: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
af90: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
afa0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
afb0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
afc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
afd0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
afe0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
aff0: 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20  outine ); .     
b000: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
b010: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
b020: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b030: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
b040: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66  tine );.      if
b050: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
b060: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  put ){.        s
b070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b080: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
b090: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
b0a0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
b0b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
b0c0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
b0d0: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e  (pParse, pDest->
b0e0: 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  iSdst, nColumn);
b0f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b110: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
b120: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
b130: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
b140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b150: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f  .  }.  if( regRo
b160: 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  wid ){.    sqlit
b170: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
b180: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29  (pParse, regRow)
b190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
b1a0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
b1b0: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  se, regRowid);. 
b1c0: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74   }.  /* The bott
b1d0: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
b1e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
b1f0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
b200: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
b210: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
b220: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
b230: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
b240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b250: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
b260: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
b270: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
b280: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
b290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b2a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
b2b0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
b2c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b2d0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72  }.  if( pSort->r
b2e0: 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74  egReturn ) sqlit
b2f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b300: 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  OP_Return, pSort
b310: 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
b320: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
b330: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
b340: 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reak);.}../*.** 
b350: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
b360: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
b370: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
b380: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
b390: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
b3a0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
b3b0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
b3c0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
b3d0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
b3e0: 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20  .** Also try to 
b3f0: 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a  estimate the siz
b400: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
b410: 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  d value and retu
b420: 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  rn that.** resul
b430: 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e  t in *pEstWidth.
b440: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
b450: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
b460: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
b470: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
b480: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
b490: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
b4a0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
b4b0: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
b4c0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
b4d0: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
b4e0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
b4f0: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
b500: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
b510: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
b520: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
b530: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
b540: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
b550: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
b560: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
b570: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
b580: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
b590: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
b5a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b5b0: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
b5c0: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
b5d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
b5e0: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
b5f0: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
b600: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
b610: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
b620: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
b630: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
b640: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
b650: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
b660: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
b670: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
b680: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
b690: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
b6a0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
b6b0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
b6c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b6d0: 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20  ne has either 3 
b6e0: 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20  or 6 parameters 
b6f0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
b700: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
b710: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
b720: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b730: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
b740: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f  tion is used..*/
b750: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b760: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b770: 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63  ADATA.# define c
b780: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
b790: 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70  D,E,F) columnTyp
b7a0: 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c  eImpl(A,B,C,D,E,
b7b0: 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  F).#else /* if !
b7c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
b7d0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b7e0: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
b7f0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
b800: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
b810: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29  nTypeImpl(A,B,F)
b820: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63  .#endif.static c
b830: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
b840: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
b850: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
b860: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 23    Expr *pExpr,.#
b870: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b880: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
b890: 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ATA.  const char
b8a0: 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63   **pzOrigDb,.  c
b8b0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
b8c0: 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  igTab,.  const c
b8d0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c  har **pzOrigCol,
b8e0: 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a 70 45  .#endif.  u8 *pE
b8f0: 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61  stWidth.){.  cha
b900: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
b910: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75   0;.  int j;.  u
b920: 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a  8 estWidth = 1;.
b930: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b940: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b950: 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e 73  DATA.  char cons
b960: 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  t *zOrigDb = 0;.
b970: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
b980: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  rigTab = 0;.  ch
b990: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43  ar const *zOrigC
b9a0: 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ol = 0;.#endif..
b9b0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21    assert( pExpr!
b9c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b9d0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
b9e0: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   );.  switch( pE
b9f0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
ba00: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
ba10: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
ba20: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  OLUMN: {.      /
ba30: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
ba40: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f   is a column. Lo
ba50: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74  cate the table t
ba60: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69  he column is bei
ba70: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72  ng.      ** extr
ba80: 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61  acted from in Na
ba90: 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69  meContext.pSrcLi
baa0: 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d  st. This table m
bab0: 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20  ay be real.     
bac0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62   ** database tab
bad0: 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  le or a subquery
bae0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
baf0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
bb00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
bb10: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
bb20: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
bb30: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
bb40: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30    Select *pS = 0
bb50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
bb60: 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75   Select the colu
bb70: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
bb80: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  from */.      in
bb90: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
bba0: 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64  iColumn;  /* Ind
bbb0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
bbc0: 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65  pTab */.      te
bbd0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
bbe0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
bbf0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
bc00: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
bc10: 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
bc20: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
bc30: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  !pTab ){.       
bc40: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
bc50: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
bc60: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
bc70: 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j=0;j<pTabList->
bc80: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
bc90: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
bca0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b  pExpr->iTable;j+
bcb0: 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +);.        if( 
bcc0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
bcd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
bce0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
bcf0: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
bd00: 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73      pS = pTabLis
bd10: 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b  t->a[j].pSelect;
bd20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
bd30: 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20            pNC = 
bd40: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
bd50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
bd60: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
bd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
bd80: 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65  t one time, code
bd90: 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54   such as "SELECT
bda0: 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61   new.x" within a
bdb0: 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20   trigger would. 
bdc0: 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
bdd0: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74  this condition t
bde0: 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68  o run.  Since th
bdf0: 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74  en, we have rest
be00: 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20  ructured how.   
be10: 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
be20: 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
be30: 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f  d and so this co
be40: 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f  ndition is no lo
be50: 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  nger .        **
be60: 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76   possible. Howev
be70: 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c  er, it can still
be80: 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61   be true for sta
be90: 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20  tements like.   
bea0: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
beb0: 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a  owing:.        *
bec0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43  *.        **   C
bed0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63  REATE TABLE t1(c
bee0: 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20  ol INTEGER);.   
bef0: 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
bf00: 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29   (SELECT t1.col)
bf10: 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20   FROM FROM t1;. 
bf20: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
bf30: 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e    ** when column
bf40: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
bf50: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
bf60: 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74  on "t1.col" in t
bf70: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  he .        ** s
bf80: 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68  ub-select. In th
bf90: 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65  is case, set the
bfa0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20   column type to 
bfb0: 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20  NULL, even.     
bfc0: 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20     ** though it 
bfd0: 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65  should really be
bfe0: 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20   "INTEGER"..    
bff0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
c000: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
c010: 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20  problem, as the 
c020: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22  column type of "
c030: 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72  t1.col" is never
c040: 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64  .        ** used
c050: 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  . When columnTyp
c060: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
c070: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
c080: 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45  .        ** "(SE
c090: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74  LECT t1.col)", t
c0a0: 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20  he correct type 
c0b0: 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65  is returned (see
c0c0: 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20   the TK_SELECT. 
c0d0: 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68         ** branch
c0e0: 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
c0f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c100: 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
c110: 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d  ( pTab && pExpr-
c120: 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20  >pTab==pTab );. 
c130: 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20       if( pS ){. 
c140: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74         /* The "t
c150: 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c  able" is actuall
c160: 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  y a sub-select o
c170: 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20  r a view in the 
c180: 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20  FROM clause.    
c190: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45      ** of the SE
c1a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
c1b0: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
c1c0: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20  ration type and 
c1d0: 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a  origin.        *
c1e0: 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  * data for the r
c1f0: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
c200: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
c210: 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ct..        */. 
c220: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
c230: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
c240: 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<pS->pEList->nE
c250: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
c260: 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20    /* If iCol is 
c270: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
c280: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
c290: 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65  ion requests the
c2a0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
c2b0: 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73  wid of the sub-s
c2c0: 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54  elect or view. T
c2d0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
c2e0: 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20  s legal (see .  
c2f0: 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20          ** test 
c300: 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20  case misc2.2.2) 
c310: 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c  - it always eval
c320: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20  uates to NULL.. 
c330: 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
c340: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 41 4c 57        ** The ALW
c350: 41 59 53 28 29 20 69 73 20 62 65 63 61 75 73 65  AYS() is because
c360: 20 69 43 6f 6c 3e 3d 70 53 2d 3e 70 45 4c 69 73   iCol>=pS->pELis
c370: 74 2d 3e 6e 45 78 70 72 20 77 69 6c 6c 20 68 61  t->nExpr will ha
c380: 76 65 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  ve been.        
c390: 20 20 2a 2a 20 63 61 75 67 68 74 20 61 6c 72 65    ** caught alre
c3a0: 61 64 79 20 62 79 20 6e 61 6d 65 20 72 65 73 6f  ady by name reso
c3b0: 6c 75 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  lution..        
c3c0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e    */.          N
c3d0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
c3e0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
c3f0: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
c400: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20  a[iCol].pExpr;. 
c410: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72           sNC.pSr
c420: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
c430: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
c440: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
c450: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
c460: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
c470: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
c480: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
c490: 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26  NC, p,&zOrigDb,&
c4a0: 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43  zOrigTab,&zOrigC
c4b0: 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20  ol, &estWidth); 
c4c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c4d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d   }else if( pTab-
c4e0: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
c4f0: 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61      /* A real ta
c500: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ble */.        a
c510: 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20  ssert( !pS );.  
c520: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
c530: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
c540: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61  iPKey;.        a
c550: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
c560: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
c570: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
c580: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
c590: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c5a0: 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20 20  ETADATA.        
c5b0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
c5c0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c5d0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
c5e0: 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20       zOrigCol = 
c5f0: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20  "rowid";.       
c600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c610: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
c620: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
c630: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
c640: 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  gCol = pTab->aCo
c650: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
c660: 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64 74           estWidt
c670: 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  h = pTab->aCol[i
c680: 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20  Col].szEst;.    
c690: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
c6a0: 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  rigTab = pTab->z
c6b0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
c6c0: 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b  ( pNC->pParse ){
c6d0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
c6e0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
c6f0: 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70  maToIndex(pNC->p
c700: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
c710: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
c720: 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70       zOrigDb = p
c730: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
c740: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
c750: 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a          }.#else.
c760: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
c770: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
c780: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
c790: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
c7a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
c7b0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
c7c0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
c7d0: 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d        estWidth =
c7e0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c7f0: 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20  ].szEst;.       
c800: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
c810: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
c820: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
c830: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
c840: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
c850: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
c860: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
c870: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
c880: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
c890: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
c8a0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
c8b0: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
c8c0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
c8d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
c8e0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
c8f0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
c900: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
c910: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
c920: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
c930: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
c940: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
c950: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
c960: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
c970: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
c980: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
c990: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
c9a0: 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  );.      sNC.pSr
c9b0: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
c9c0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
c9d0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
c9e0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
c9f0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
ca00: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
ca10: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
ca20: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
ca30: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
ca40: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 62 72  idth); .      br
ca50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
ca60: 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  f.  }..#ifdef SQ
ca70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
ca80: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20  MN_METADATA  .  
ca90: 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a  if( pzOrigDb ){.
caa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
cab0: 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43  igTab && pzOrigC
cac0: 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  ol );.    *pzOri
cad0: 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20  gDb = zOrigDb;. 
cae0: 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20     *pzOrigTab = 
caf0: 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70  zOrigTab;.    *p
cb00: 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67  zOrigCol = zOrig
cb10: 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Col;.  }.#endif.
cb20: 20 20 69 66 28 20 70 45 73 74 57 69 64 74 68 20    if( pEstWidth 
cb30: 29 20 2a 70 45 73 74 57 69 64 74 68 20 3d 20 65  ) *pEstWidth = e
cb40: 73 74 57 69 64 74 68 3b 0a 20 20 72 65 74 75 72  stWidth;.  retur
cb50: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
cb60: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
cb70: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
cb80: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
cb90: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
cba0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
cbb0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
cbc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
cbd0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
cbe0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
cbf0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
cc00: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
cc10: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
cc20: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
cc30: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
cc40: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
cc50: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
cc60: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
cc70: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e  t set */.){.#ifn
cc80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cc90: 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20  DECLTYPE.  Vdbe 
cca0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
ccb0: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  be;.  int i;.  N
ccc0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
ccd0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
cce0: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43   pTabList;.  sNC
ccf0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
cd00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
cd10: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
cd20: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
cd30: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
cd40: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
cd50: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66  char *zType;.#if
cd60: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cd70: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
cd80: 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  A.    const char
cd90: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
cda0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cdb0: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
cdc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
cdd0: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a  igCol = 0;.    z
cde0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
cdf0: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
ce00: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
ce10: 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a  &zOrigCol, 0);..
ce20: 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20      /* The vdbe 
ce30: 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77  must make its ow
ce40: 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  n copy of the co
ce50: 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74  lumn-type and ot
ce60: 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  her .    ** colu
ce70: 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69  mn specific stri
ce80: 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ngs, in case the
ce90: 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74   schema is reset
cea0: 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20   before this.   
ceb0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68   ** virtual mach
cec0: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
ced0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
cee0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
cef0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
cf00: 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62  ATABASE, zOrigDb
cf10: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
cf20: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
cf30: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
cf40: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42  , i, COLNAME_TAB
cf50: 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51  LE, zOrigTab, SQ
cf60: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
cf70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cf80: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
cf90: 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c   COLNAME_COLUMN,
cfa0: 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54   zOrigCol, SQLIT
cfb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65  E_TRANSIENT);.#e
cfc0: 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  lse.    zType = 
cfd0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
cfe0: 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   p, 0, 0, 0, 0);
cff0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
d000: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d010: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d020: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
d030: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d040: 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  T);.  }.#endif /
d050: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
d060: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29  E_OMIT_DECLTYPE)
d070: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   */.}../*.** Gen
d080: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
d090: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
d0a0: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
d0b0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
d0c0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
d0d0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
d0e0: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
d0f0: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
d100: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
d110: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
d120: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
d130: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
d140: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d150: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
d160: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
d170: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
d180: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
d190: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d1a0: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
d1b0: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
d1c0: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
d1d0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
d1e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d1f0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
d200: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
d210: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
d220: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
d230: 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  Names;..#ifndef 
d240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
d250: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
d260: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
d270: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
d280: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
d290: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
d2a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
d2b0: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
d2c0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
d2d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d2e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
d2f0: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
d300: 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 21  ssert( pTabList!
d310: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
d320: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
d330: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
d340: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d350: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
d360: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
d370: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
d380: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
d390: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
d3a0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
d3b0: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
d3c0: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
d3d0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
d3e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
d3f0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
d400: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
d410: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
d420: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
d430: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
d440: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
d450: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
d460: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
d470: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  zName;.      sql
d480: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d490: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d4a0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
d4b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
d4c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
d4d0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
d4e0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  || p->op==TK_AGG
d4f0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
d500: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
d510: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
d520: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
d530: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
d540: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41     for(j=0; ALWA
d550: 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  YS(j<pTabList->n
d560: 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Src); j++){.    
d570: 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
d580: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d  ->a[j].iCursor==
d590: 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61  p->iTable ) brea
d5a0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d5b0: 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c   assert( j<pTabL
d5c0: 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20  ist->nSrc );.   
d5d0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
d5e0: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
d5f0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d600: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
d610: 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
d620: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
d630: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
d640: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
d650: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
d660: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
d670: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
d680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d690: 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
d6a0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
d6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d6c0: 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26  ( !shortNames &&
d6d0: 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20   !fullNames ){. 
d6e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d6f0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d700: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d710: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71   .            sq
d720: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
d730: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  , pEList->a[i].z
d740: 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59  Span), SQLITE_DY
d750: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
d760: 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65  lse if( fullName
d770: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  s ){.        cha
d780: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
d790: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
d7a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
d7b0: 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
d7c0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  zName, zCol);.  
d7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d7e0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d7f0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d800: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59  zName, SQLITE_DY
d810: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
d820: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
d830: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d840: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d850: 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c  _NAME, zCol, SQL
d860: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d870: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d880: 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  e{.      const c
d890: 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d  har *z = pEList-
d8a0: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
d8b0: 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71     z = z==0 ? sq
d8c0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
d8d0: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
d8e0: 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72  ) : sqlite3DbStr
d8f0: 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  Dup(db, z);.    
d900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d910: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d920: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53  LNAME_NAME, z, S
d930: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
d940: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
d950: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
d960: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
d970: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
d980: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
d990: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68  ression list (wh
d9a0: 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68  ich is really th
d9b0: 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
d9c0: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f  sions.** that fo
d9d0: 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  rm the result se
d9e0: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  t of a SELECT st
d9f0: 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65  atement) compute
da00: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
da10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
da20: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f   a table that wo
da30: 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70  uld hold the exp
da40: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
da50: 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e  .** All column n
da60: 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69  ames will be uni
da70: 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  que..**.** Only 
da80: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
da90: 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20   are computed.  
daa0: 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f  Column.zType, Co
dab0: 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61  lumn.zColl,.** a
dac0: 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
dad0: 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65  of Column are ze
dae0: 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  roed..**.** Retu
daf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
db00: 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d  success.  If a m
db10: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
db20: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
db30: 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20  * store NULL in 
db40: 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20  *paCol and 0 in 
db50: 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72  *pnCol and retur
db60: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
db70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
db80: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
db90: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
dba0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
dbb0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
dbc0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
dbd0: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
dbe0: 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77  Expr list from w
dbf0: 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63  hich to derive c
dc00: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
dc10: 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   i16 *pnCol,    
dc20: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
dc30: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
dc40: 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a  columns here */.
dc50: 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c    Column **paCol
dc60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
dc70: 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  te the new colum
dc80: 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29  n list here */.)
dc90: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
dca0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
dcb0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
dcc0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
dcd0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
dce0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
dcf0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33  counters */.  u3
dd00: 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  2 cnt;          
dd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
dd20: 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65  ex added to make
dd30: 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65   the name unique
dd40: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
dd50: 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20  ol, *pCol;      
dd60: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
dd70: 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c   over result col
dd80: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  umns */.  int nC
dd90: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
dda0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ddb0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
ddc0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
ddd0: 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20    Expr *p;      
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ddf0: 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
de00: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
de10: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
de20: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
de30: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
de40: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  n name */.  int 
de50: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
de60: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
de70: 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65  of name in zName
de80: 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b  [] */.  Hash ht;
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
deb0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  e of column name
dec0: 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48  s */..  sqlite3H
ded0: 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20  ashInit(&ht);.  
dee0: 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20  if( pEList ){.  
def0: 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d    nCol = pEList-
df00: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c  >nExpr;.    aCol
df10: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
df20: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
df30: 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29  f(aCol[0])*nCol)
df40: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
df50: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  aCol==0 );.  }el
df60: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30  se{.    nCol = 0
df70: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a  ;.    aCol = 0;.
df80: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43    }.  assert( nC
df90: 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b  ol==(i16)nCol );
dfa0: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
dfb0: 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f  ;.  *paCol = aCo
dfc0: 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  l;..  for(i=0, p
dfd0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
dfe0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
dff0: 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c  ailed; i++, pCol
e000: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20  ++){.    /* Get 
e010: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
e020: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
e030: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
e040: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
e050: 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d  pCollate(pEList-
e060: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
e070: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
e080: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
e090: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
e0a0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
e0b0: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
e0c0: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
e0d0: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
e0e0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65  e name */.    }e
e0f0: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
e100: 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20  *pColExpr = p;  
e110: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
e120: 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65  n that is the re
e130: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
e140: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
e150: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f  *pTab;         /
e160: 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74  * Table associat
e170: 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70  ed with this exp
e180: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
e190: 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72   while( pColExpr
e1a0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
e1b0: 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72          pColExpr
e1c0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69   = pColExpr->pRi
e1d0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
e1e0: 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30  ert( pColExpr!=0
e1f0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
e200: 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e    if( pColExpr->
e210: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
e220: 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72   ALWAYS(pColExpr
e230: 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
e240: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
e250: 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c  umns use the col
e260: 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f  umn name name */
e270: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
e280: 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43  l = pColExpr->iC
e290: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
e2a0: 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Tab = pColExpr->
e2b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66  pTab;.        if
e2c0: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
e2d0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
e2e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69         zName = i
e2f0: 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61  Col>=0 ? pTab->a
e300: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20  Col[iCol].zName 
e310: 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  : "rowid";.     
e320: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45   }else if( pColE
e330: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
e340: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
e350: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
e360: 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f  ty(pColExpr, EP_
e370: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
e380: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f       zName = pCo
e390: 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  lExpr->u.zToken;
e3a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e3b0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
e3c0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
e3d0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
e3e0: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
e3f0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ame */.        z
e400: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
e410: 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
e420: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61   }.    }.    zNa
e430: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
e440: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 7a 4e  ntf(db, "%s", zN
e450: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  ame);..    /* Ma
e460: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
e470: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
e480: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
e490: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
e4a0: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20     ** append an 
e4b0: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
e4c0: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
e4d0: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
e4e0: 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20     */.    cnt = 
e4f0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4e  0;.    while( zN
e500: 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
e510: 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d  shFind(&ht, zNam
e520: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  e)!=0 ){.      n
e530: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
e540: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
e550: 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30       if( nName>0
e560: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e570: 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26  j=nName-1; j>0 &
e580: 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  & sqlite3Isdigit
e590: 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29  (zName[j]); j--)
e5a0: 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  {}.        if( z
e5b0: 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e  Name[j]==':' ) n
e5c0: 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20  Name = j;.      
e5d0: 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  }.      zName = 
e5e0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
e5f0: 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e  b, "%.*z:%u", nN
e600: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e  ame, zName, ++cn
e610: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e  t);.      if( cn
e620: 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72 61  t>3 ) sqlite3_ra
e630: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
e640: 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20  cnt), &cnt);.   
e650: 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
e660: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
e670: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f  sqlite3ColumnPro
e680: 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28  pertiesFromName(
e690: 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66  0, pCol);.    if
e6a0: 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74  ( zName && sqlit
e6b0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68 74  e3HashInsert(&ht
e6c0: 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d  , zName, pCol)==
e6d0: 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 64 62  pCol ){.      db
e6e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
e6f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
e700: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
e710: 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
e720: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e730: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
e740: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
e750: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e760: 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
e770: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e780: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
e790: 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
e7a0: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
e7b0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
e7c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
e7d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e7e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
e7f0: 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
e800: 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
e810: 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
e820: 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
e830: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e840: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
e850: 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
e860: 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
e870: 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
e880: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
e890: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
e8a0: 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
e8b0: 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
e8c0: 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
e8d0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
e8e0: 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
e8f0: 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
e900: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
e910: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
e920: 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
e930: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
e940: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
e950: 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
e960: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
e970: 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  oid selectAddCol
e980: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
e990: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
e9a0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
e9b0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
e9c0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
e9d0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
e9e0: 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  dd column type i
e9f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
ea00: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  is table */.  Se
ea10: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
ea20: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
ea30: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
ea40: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
ea50: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
ea60: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ea70: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
ea80: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
ea90: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
eaa0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
eab0: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
eac0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
ead0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34  t_item *a;.  u64
eae0: 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61   szAll = 0;..  a
eaf0: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d  ssert( pSelect!=
eb00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
eb10: 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
eb20: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29  s & SF_Resolved)
eb30: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
eb40: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65   pTab->nCol==pSe
eb50: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
eb60: 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
eb70: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
eb80: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
eb90: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  d ) return;.  me
eba0: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
ebb0: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
ebc0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
ebd0: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20  lect->pSrc;.  a 
ebe0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
ebf0: 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  t->a;.  for(i=0,
ec00: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
ec10: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
ec20: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
ec30: 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72    p = a[i].pExpr
ec40: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  ;.    if( pCol->
ec50: 7a 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zType==0 ){.    
ec60: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
ec70: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ec80: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  db, .           
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
eca0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
ecb0: 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a  0,0,0, &pCol->sz
ecc0: 45 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Est));.    }.   
ecd0: 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e   szAll += pCol->
ece0: 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d  szEst;.    pCol-
ecf0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
ed00: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
ed10: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
ed20: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
ed30: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
ed40: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
ed50: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
ed60: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
ed70: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
ed80: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
ed90: 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  ol->zColl==0 ){.
eda0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
edb0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
edc0: 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
edd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
ede0: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
edf0: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
ee00: 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f  t(szAll*4);.}../
ee10: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
ee20: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
ee30: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
ee40: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
ee50: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
ee60: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
ee70: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
ee80: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
ee90: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
eea0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
eeb0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
eec0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
eed0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
eee0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
eef0: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
ef00: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
ef10: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
ef20: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
ef30: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
ef40: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
ef50: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
ef60: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
ef70: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
ef80: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
ef90: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
efa0: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
efb0: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
efc0: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
efd0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
efe0: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
eff0: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
f000: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
f010: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
f020: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
f030: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
f040: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
f050: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
f060: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
f070: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
f080: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
f090: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
f0a0: 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
f0b0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
f0c0: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d  aside.bEnabled==
f0d0: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  0 );.  pTab->nRe
f0e0: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
f0f0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62  Name = 0;.  pTab
f100: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
f110: 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
f120: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
f130: 30 34 38 35 37 36 29 20 29 3b 0a 20 20 73 71 6c  048576) );.  sql
f140: 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
f150: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
f160: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
f170: 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
f180: 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65  Tab->aCol);.  se
f190: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
f1a0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
f1b0: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
f1c0: 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
f1d0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
f1e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f1f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
f200: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
f210: 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
f220: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
f230: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
f240: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
f250: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
f260: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
f270: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
f280: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
f290: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
f2a0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
f2b0: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
f2c0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
f2d0: 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
f2e0: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
f2f0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
f300: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f310: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
f320: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f330: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
f340: 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 20  reate(pParse);. 
f350: 20 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74     if( v ) sqlit
f360: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
f370: 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 20 20 69 66  OP_Init);.    if
f380: 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  ( pParse->pTople
f390: 76 65 6c 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f  vel==0.     && O
f3a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
f3b0: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
f3c0: 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
f3d0: 6e 73 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nst).    ){.    
f3e0: 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
f3f0: 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20  tFactor = 1;.   
f400: 20 7d 0a 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   }..  }.  return
f410: 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   v;.}.../*.** Co
f420: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
f430: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
f440: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
f450: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
f460: 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  * pLimit and pOf
f470: 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73  fset expressions
f480: 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  .  pLimit and pO
f490: 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65  ffset hold the e
f4a0: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
f4b0: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
f4c0: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
f4d0: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
f4e0: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
f4f0: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
f500: 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73   Or NULL if thos
f510: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
f520: 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61  mitted. iLimit a
f530: 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61  nd iOffset .** a
f540: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
f550: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
f560: 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
f570: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
f580: 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ute .** the limi
f590: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
f5a0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
f5b0: 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
f5c0: 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d  t, then .** iLim
f5d0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
f5e0: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
f5f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f600: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
f610: 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64  es of iLimit and
f620: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
f630: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
f640: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
f650: 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70   by pLimit and p
f660: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
f670: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
f680: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
f690: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
f6a0: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
f6b0: 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70  lues (zero).** p
f6c0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
f6d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
f6e0: 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74 20  .** The iOffset 
f6f0: 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74 20  register (if it 
f700: 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74 69  exists) is initi
f710: 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61  alized to the va
f720: 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46  lue.** of the OF
f730: 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d 69  FSET.  The iLimi
f740: 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  t register is in
f750: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d  itialized to LIM
f760: 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a 2a  IT.  Register.**
f770: 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69 6e   iOffset+1 is in
f780: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d  itialized to LIM
f790: 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  IT+OFFSET..**.**
f7a0: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
f7b0: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
f7c0: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
f7d0: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
f7e0: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
f7f0: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
f800: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
f810: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
f820: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
f830: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
f840: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
f850: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
f860: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
f870: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
f880: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
f890: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
f8a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
f8b0: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
f8c0: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
f8d0: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
f8e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
f8f0: 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  et;.  int n;.  i
f900: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72  f( p->iLimit ) r
f910: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20  eturn;..  /* .  
f920: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
f930: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
f940: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
f950: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76  ome.  ** controv
f960: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
f970: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
f980: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
f990: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
f9a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f9b0: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
f9c0: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
f9d0: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
f9e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
f9f0: 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
fa00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
fa10: 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  ffset==0 || p->p
fa20: 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66  Limit!=0 );.  if
fa30: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
fa40: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69     p->iLimit = i
fa50: 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65  Limit = ++pParse
fa60: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20  ->nMem;.    v = 
fa70: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
fa80: 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65  Parse);.    asse
fa90: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20  rt( v!=0 );.    
faa0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
fab0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d  sInteger(p->pLim
fac0: 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  it, &n) ){.     
fad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fae0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
faf0: 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  , n, iLimit);.  
fb00: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
fb10: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
fb20: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  er"));.      if(
fb30: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
fb40: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
fb50: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
fb60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d     }else if( n>=
fb70: 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
fb80: 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20  ow>(u64)n ){.   
fb90: 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
fba0: 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  ow = n;.      }.
fbb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fbc0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fbd0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
fbe0: 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  it, iLimit);.   
fbf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fc00: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
fc10: 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56  eInt, iLimit); V
fc20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fc30: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
fc40: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
fc50: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
fc60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fc70: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c  (v, OP_IfNot, iL
fc80: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
fc90: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fca0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
fcb0: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
fcc0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
fcd0: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
fce0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
fcf0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
fd00: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
fd10: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
fd20: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
fd30: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fd40: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fd50: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
fd60: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
fd70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fd80: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
fd90: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
fda0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
fdb0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fdc0: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
fdd0: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
fde0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fdf0: 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20  OP_OffsetLimit, 
fe00: 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b  iLimit, iOffset+
fe10: 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  1, iOffset);.   
fe20: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fe30: 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
fe40: 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  "));.    }.  }.}
fe50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fe60: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
fe70: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
fe80: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
fe90: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
fea0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
feb0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
fec0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
fed0: 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
fee0: 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
fef0: 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
ff00: 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
ff10: 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
ff20: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
ff30: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
ff40: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
ff50: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
ff60: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
ff70: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
ff80: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
ff90: 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
ffa0: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
ffb0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
ffc0: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
ffd0: 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
ffe0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
fff0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
10000 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
10010 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
10020 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
10030 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
10040 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
10050 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
10060 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
10070 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
10080 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  }.  assert( iCol
10090 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c  >=0 );.  /* iCol
100a0 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68   must be less th
100b0 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  an p->pEList->nE
100c0 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20  xpr.  Otherwise 
100d0 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20  an error would. 
100e0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68   ** have been th
100f0 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65  rown during name
10100 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20   resolution and 
10110 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76  we would not hav
10120 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68  e gotten.  ** th
10130 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20  is far */.  if( 
10140 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59  pRet==0 && ALWAY
10150 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  S(iCol<p->pEList
10160 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
10170 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
10180 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
10190 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
101a0 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
101b0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
101c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
101d0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
101e0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
101f0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
10200 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
10210 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44  T.** with an ORD
10220 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68  ER BY clause. Th
10230 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
10240 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e  cates and return
10250 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73  s a KeyInfo.** s
10260 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c  tructure suitabl
10270 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69  e for implementi
10280 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  ng the ORDER BY.
10290 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
102a0 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
102b0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
102c0 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
102d0 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  oc. The calling.
102e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
102f0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
10300 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69  nsuring that thi
10310 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
10320 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
10330 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  ed..*/.static Ke
10340 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65  yInfo *multiSele
10350 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
10360 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10370 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e  Select *p, int n
10380 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69  Extra){.  ExprLi
10390 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
103a0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
103b0 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t nOrderBy = p->
103c0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
103d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
103e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b   pParse->db;.  K
103f0 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73  eyInfo *pRet = s
10400 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
10410 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b  oc(db, nOrderBy+
10420 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66  nExtra, 1);.  if
10430 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( pRet ){.    in
10440 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
10450 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
10460 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
10470 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
10480 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42  pItem = &pOrderB
10490 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45  y->a[i];.      E
104a0 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74  xpr *pTerm = pIt
104b0 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
104c0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
104d0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ..      if( pTer
104e0 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  m->flags & EP_Co
104f0 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
10500 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
10510 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
10520 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  se, pTerm);.    
10530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10540 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
10550 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
10560 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e  se, p, pItem->u.
10570 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29  x.iOrderByCol-1)
10580 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
10590 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
105a0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
105b0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
105c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20  ->a[i].pExpr =. 
105d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
105e0 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
105f0 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65  ring(pParse, pTe
10600 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  rm, pColl->zName
10610 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10620 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10630 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
10640 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20  le(pRet) );.    
10650 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d    pRet->aColl[i]
10660 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
10670 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pRet->aSortOrder
10680 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
10690 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
106a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
106b0 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
106c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
106d0 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _CTE./*.** This 
106e0 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
106f0 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63  s VDBE code to c
10700 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65  ompute the conte
10710 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43  nt of a WITH REC
10720 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20  URSIVE.** query 
10730 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
10740 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d  **   <recursive-
10750 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75  table> AS (<setu
10760 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b  p-query> UNION [
10770 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d  ALL] <recursive-
10780 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20  query>).**      
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f     \___________/
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
107c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
107d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
107e0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
107f0 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
10800 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a             p.**.
10810 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65  **.** There is e
10820 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72  xactly one refer
10830 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75  ence to the recu
10840 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74  rsive-table in t
10850 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  he FROM clause.*
10860 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71  * of recursive-q
10870 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74  uery, marked wit
10880 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61  h the SrcList->a
10890 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  [].fg.isRecursiv
108a0 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  e flag..**.** Th
108b0 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75  e setup-query ru
108c0 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72  ns once to gener
108d0 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73  ate an initial s
108e0 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  et of rows that 
108f0 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65  go.** into a Que
10900 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20  ue table.  Rows 
10910 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
10920 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62  om the Queue tab
10930 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65  le one by.** one
10940 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72  .  Each row extr
10950 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
10960 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44   is output to pD
10970 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73  est.  Then the s
10980 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74  ingle.** extract
10990 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74  ed row (now in t
109a0 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c  he iCurrent tabl
109b0 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  e) becomes the c
109c0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  ontent of the.**
109d0 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
109e0 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65   for a recursive
109f0 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65  -query run.  The
10a00 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72   output of the r
10a10 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a  ecursive-query.*
10a20 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20  * is added back 
10a30 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
10a40 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74  able.  Then anot
10a50 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61  her row is extra
10a60 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a  cted from Queue.
10a70 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ** and the itera
10a80 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75  tion continues u
10a90 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74  ntil the Queue t
10aa0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
10ab0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70  *.** If the comp
10ac0 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61  ound query opera
10ad0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65  tor is UNION the
10ae0 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72  n no duplicate r
10af0 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20  ows are ever.** 
10b00 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
10b10 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
10b20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61  The iDistinct ta
10b30 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79  ble keeps a copy
10b40 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20   of all rows.** 
10b50 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62  that have ever b
10b60 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
10b70 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73  o Queue and caus
10b80 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f  es duplicates to
10b90 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64   be.** discarded
10ba0 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  .  If the operat
10bb0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c  or is UNION ALL,
10bc0 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73   then duplicates
10bd0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
10be0 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72   .** If the quer
10bf0 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42  y has an ORDER B
10c00 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20  Y, then entries 
10c10 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62  in the Queue tab
10c20 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a  le are kept in.*
10c30 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  * ORDER BY order
10c40 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65   and the first e
10c50 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65  ntry is extracte
10c60 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65  d for each cycle
10c70 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e  .  Without.** an
10c80 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51   ORDER BY, the Q
10c90 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75  ueue table is ju
10ca0 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a  st a FIFO..**.**
10cb0 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   If a LIMIT clau
10cc0 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20  se is provided, 
10cd0 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69  then the iterati
10ce0 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c  on stops after L
10cf0 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76  IMIT rows.** hav
10d00 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f  e been output to
10d10 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54   pDest.  A LIMIT
10d20 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74   of zero means t
10d30 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73  o output no rows
10d40 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69   and a.** negati
10d50 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74  ve LIMIT means t
10d60 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77  o output all row
10d70 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
10d80 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63  also an OFFSET c
10d90 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20  lause.** with a 
10da0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20  positive value, 
10db0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f  then the first O
10dc0 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72  FFSET outputs ar
10dd0 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68  e discarded rath
10de0 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67  er.** than being
10df0 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20   sent to pDest. 
10e00 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74   The LIMIT count
10e10 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
10e20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53  until after OFFS
10e30 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20  ET.** rows have 
10e40 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  been skipped..*/
10e50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
10e60 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
10e70 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65  veQuery(.  Parse
10e80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10e90 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10ea0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10eb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
10ec0 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20  * The recursive 
10ed0 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64  SELECT to be cod
10ee0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
10ef0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
10f00 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
10f10 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
10f20 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
10f30 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
10f40 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
10f50 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72   clause of the r
10f60 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
10f70 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  /.  int nCol = p
10f80 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
10f90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
10fa0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
10fb0 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f  cursive table */
10fc0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10fd0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
10fe0 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
10ff0 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
11000 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
11010 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75  .  Select *pSetu
11020 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20  p = p->pPrior;  
11030 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75   /* The setup qu
11040 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ery */.  int add
11050 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
11060 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
11070 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
11080 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  nt addrCont, add
11090 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20  rBreak;      /* 
110a0 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45  CONTINUE and BRE
110b0 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  AK addresses */.
110c0 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
110d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
110e0 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74  /* The Current t
110f0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
11100 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  gCurrent;       
11110 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
11120 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72  ter holding Curr
11130 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
11140 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20  nt iQueue;      
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11160 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  The Queue table 
11170 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e  */.  int iDistin
11180 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ct = 0;         
11190 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
111a0 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69  unique results i
111b0 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74  f UNION */.  int
111c0 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66   eDest = SRT_Fif
111d0 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  o;         /* Ho
111e0 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75  w to write to Qu
111f0 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  eue */.  SelectD
11200 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20  est destQueue;  
11210 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
11220 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20  Dest targetting 
11230 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
11240 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11270 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
112a0 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  code */.  ExprLi
112b0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
112c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
112d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
112e0 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
112f0 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20  , *pOffset;     
11300 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54    /* Saved LIMIT
11310 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20   and OFFSET */. 
11320 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72   int regLimit, r
11330 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  egOffset;      /
11340 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64  * Registers used
11350 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   by LIMIT and OF
11360 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  FSET */..  /* Ob
11370 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  tain authorizati
11380 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72  on to do a recur
11390 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
113a0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
113b0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
113c0 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30  ITE_RECURSIVE, 0
113d0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
113e0 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
113f0 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
11400 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66  FSET clauses, if
11410 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20   they exist */. 
11420 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
11430 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11440 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
11450 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
11460 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65  arse, p, addrBre
11470 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20  ak);.  pLimit = 
11480 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66  p->pLimit;.  pOf
11490 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
114a0 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20  t;.  regLimit = 
114b0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67  p->iLimit;.  reg
114c0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
114d0 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  set;.  p->pLimit
114e0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20   = p->pOffset = 
114f0 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  0;.  p->iLimit =
11500 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
11510 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
11520 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a  >pOrderBy;..  /*
11530 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73   Locate the curs
11540 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
11550 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
11560 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57  /.  for(i=0; ALW
11570 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63  AYS(i<pSrc->nSrc
11580 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
11590 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69   pSrc->a[i].fg.i
115a0 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
115b0 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70      iCurrent = p
115c0 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
115d0 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;.      break;.
115e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
115f0 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
11600 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65   numbers for Que
11610 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  ue and Distinct.
11620 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    The cursor num
11630 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ber for.  ** the
11640 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20   Distinct table 
11650 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
11660 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
11670 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a   Queue in order.
11680 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54    ** for the SRT
11690 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52  _DistFifo and SR
116a0 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73 74  T_DistQueue dest
116b0 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b  inations to work
116c0 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20  . */.  iQueue = 
116d0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
116e0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
116f0 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65  UNION ){.    eDe
11700 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
11710 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20  SRT_DistQueue : 
11720 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20  SRT_DistFifo;.  
11730 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50    iDistinct = pP
11740 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
11750 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74  }else{.    eDest
11760 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
11770 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69  T_Queue : SRT_Fi
11780 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  fo;.  }.  sqlite
11790 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
117a0 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65 73  &destQueue, eDes
117b0 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f  t, iQueue);..  /
117c0 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
117d0 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20  rs for Current, 
117e0 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69  Queue, and Disti
117f0 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72  nct. */.  regCur
11800 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  rent = ++pParse-
11810 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
11820 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11830 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75  _OpenPseudo, iCu
11840 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e  rrent, regCurren
11850 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20  t, nCol);.  if( 
11860 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11870 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
11880 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  o = multiSelectO
11890 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
118a0 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20  arse, p, 1);.   
118b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
118c0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
118d0 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
118e0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
118f0 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
11900 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11910 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
11920 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65  KEYINFO);.    de
11930 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79  stQueue.pOrderBy
11940 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d   = pOrderBy;.  }
11950 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11960 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11970 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
11980 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a   iQueue, nCol);.
11990 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e    }.  VdbeCommen
119a0 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61 62  t((v, "Queue tab
119b0 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69  le"));.  if( iDi
119c0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d  stinct ){.    p-
119d0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
119e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
119f0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
11a00 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69  phemeral, iDisti
11a10 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  nct, 0);.    p->
11a20 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
11a30 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
11a40 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74  }..  /* Detach t
11a50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11a60 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70  se from the comp
11a70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
11a80 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
11a90 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  ;..  /* Store th
11aa0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
11ab0 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20   setup-query in 
11ac0 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74  Queue. */.  pSet
11ad0 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  up->pNext = 0;. 
11ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
11af0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74  ect(pParse, pSet
11b00 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b  up, &destQueue);
11b10 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
11b20 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29   = p;.  if( rc )
11b30 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63   goto end_of_rec
11b40 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20  ursive_query;.. 
11b50 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78   /* Find the nex
11b60 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65  t row in the Que
11b70 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  ue and output th
11b80 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72  at row */.  addr
11b90 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
11ba0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
11bb0 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64  wind, iQueue, ad
11bc0 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
11bd0 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
11be0 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65   Transfer the ne
11bf0 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20  xt row in Queue 
11c00 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20  over to Current 
11c10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11c20 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
11c30 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b  lRow, iCurrent);
11c40 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c   /* To reset col
11c50 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69  umn cache */.  i
11c60 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
11c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11c80 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
11c90 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  n, iQueue, pOrde
11ca0 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
11cb0 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c  gCurrent);.  }el
11cc0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
11cd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11ce0 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c  RowData, iQueue,
11cf0 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
11d00 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
11d10 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
11d20 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  te, iQueue);..  
11d30 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69  /* Output the si
11d40 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
11d50 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e  ent */.  addrCon
11d60 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
11d70 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
11d80 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67  odeOffset(v, reg
11d90 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
11da0 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
11db0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
11dc0 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72  p->pEList, iCurr
11dd0 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c  ent,.      0, 0,
11de0 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74   pDest, addrCont
11df0 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
11e00 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a  if( regLimit ){.
11e10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11e20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
11e30 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d  JumpZero, regLim
11e40 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  it, addrBreak);.
11e50 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
11e60 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
11e70 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11e80 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b  el(v, addrCont);
11e90 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74  ..  /* Execute t
11ea0 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c  he recursive SEL
11eb0 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73  ECT taking the s
11ec0 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
11ed0 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65  rent as.  ** the
11ee0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72   value for the r
11ef0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20  ecursive-table. 
11f00 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
11f10 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a  s in the Queue..
11f20 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
11f30 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
11f40 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c  egate ){.    sql
11f50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11f60 72 73 65 2c 20 22 72 65 63 75 72 73 69 76 65 20  rse, "recursive 
11f70 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
11f80 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  s not supported"
11f90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11fa0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
11fb0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
11fc0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
11fd0 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73  tQueue);.    ass
11fe0 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
11ff0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  0 );.    p->pPri
12000 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d  or = pSetup;.  }
12010 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
12020 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
12030 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
12040 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
12050 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
12060 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
12070 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
12080 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
12090 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  ..end_of_recursi
120a0 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69  ve_query:.  sqli
120b0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
120c0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  e(pParse->db, p-
120d0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d  >pOrderBy);.  p-
120e0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
120f0 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  erBy;.  p->pLimi
12100 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d  t = pLimit;.  p-
12110 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
12120 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  et;.  return;.}.
12130 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12140 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a  _OMIT_CTE */../*
12150 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
12160 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces */.static in
12170 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
12180 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
12190 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
121a0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
121b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
121c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
121d0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
121e0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
121f0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12200 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12210 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12220 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12230 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61   */.);../*.** Ha
12240 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c  ndle the special
12250 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f   case of a compo
12260 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
12270 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
12280 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75  a.** VALUES clau
12290 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67  se.  By handling
122a0 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69   this as a speci
122b0 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69  al case, we avoi
122c0 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73  d deep.** recurs
122d0 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f  ion, and thus do
122e0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66   not need to enf
122f0 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f  orce the SQLITE_
12300 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
12310 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41  ELECT.** on a VA
12320 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  LUES clause..**.
12330 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 53  ** Because the S
12340 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69  elect object ori
12350 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56  ginates from a V
12360 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a  ALUES clause:.**
12370 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f     (1) It has no
12380 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54   LIMIT or OFFSET
12390 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65  .**   (2) All te
123a0 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c  rms are UNION AL
123b0 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65  L.**   (3) There
123c0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
123d0 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63  clause.*/.static
123e0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
123f0 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20  Values(.  Parse 
12400 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12410 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12420 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12430 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
12440 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
12450 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
12460 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
12470 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
12480 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
12490 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
124a0 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ts */.){.  Selec
124b0 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74  t *pPrior;.  int
124c0 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74   nRow = 1;.  int
124d0 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   rc = 0;.  asser
124e0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
124f0 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
12500 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
12510 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
12520 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
12530 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
12540 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
12550 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
12560 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
12570 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
12580 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20  >pLimit==0 );.  
12590 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
125a0 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  fset==0 );.    a
125b0 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
125c0 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  =0 || p->pEList-
125d0 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74  >nExpr==p->pNext
125e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
125f0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50  );.    if( p->pP
12600 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  rior==0 ) break;
12610 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12620 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70  pPrior->pNext==p
12630 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   );.    p = p->p
12640 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b  Prior;.    nRow+
12650 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a  +;.  }while(1);.
12660 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
12670 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
12680 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72  rior;.    p->pPr
12690 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ior = 0;.    rc 
126a0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
126b0 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
126c0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
126d0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69   = pPrior;.    i
126e0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
126f0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
12700 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d   = nRow;.    p =
12710 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
12720 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12730 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12740 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
12750 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
12760 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
12770 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
12780 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
12790 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
127a0 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
127b0 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
127c0 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
127d0 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
127e0 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
127f0 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
12800 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
12810 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
12820 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
12830 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
12840 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
12850 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
12860 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
12870 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
12880 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
12890 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
128a0 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
128b0 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
128c0 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
128d0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
128e0 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
128f0 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
12900 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
12910 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
12920 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
12930 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
12940 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
12950 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
12960 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
12970 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
12980 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
12990 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
129a0 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
129b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
129c0 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
129d0 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
129e0 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
129f0 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
12a00 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
12a20 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
12a30 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
12a40 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
12a50 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
12a60 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
12a70 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
12a80 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
12a90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12aa0 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
12ab0 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
12ac0 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
12ad0 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
12ae0 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
12af0 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
12b00 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
12b10 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
12b20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
12b30 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
12b40 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
12b50 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
12b60 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
12b70 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
12b80 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
12b90 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
12ba0 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
12bb0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12bc0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12bd0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12be0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
12bf0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
12c00 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
12c10 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12c20 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12c30 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12c40 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12c50 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
12c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
12c70 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
12c80 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
12c90 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
12ca0 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
12cb0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
12cc0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
12cd0 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
12ce0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
12cf0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
12d00 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
12d10 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
12d20 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20  t dest;      /* 
12d30 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61  Alternative data
12d40 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
12d50 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74    Select *pDelet
12d60 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e  e = 0;  /* Chain
12d70 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63   of simple selec
12d80 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ts to delete */.
12d90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
12da0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12db0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12dc0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12dd0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
12de0 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20  int iSub1 = 0;  
12df0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
12e00 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
12e10 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
12e20 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  2 = 0;        /*
12e30 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
12e40 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
12e50 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
12e60 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
12e70 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
12e80 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
12e90 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
12ea0 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
12eb0 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
12ec0 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
12ed0 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
12ee0 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
12ef0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12f00 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20   p && p->pPrior 
12f10 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66  );  /* Calling f
12f20 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65  unction guarante
12f30 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a  es this much */.
12f40 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
12f50 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
12f60 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e  rsive)==0 || p->
12f70 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d  op==TK_ALL || p-
12f80 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
12f90 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
12fa0 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
12fb0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74  ->pPrior;.  dest
12fc0 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
12fd0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
12fe0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
12ff0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13000 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
13010 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
13020 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
13030 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
13040 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
13050 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
13060 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
13070 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
13080 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
13090 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
130a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
130b0 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
130c0 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
130d0 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
130e0 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
130f0 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
13100 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
13110 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
13120 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
13130 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13140 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
13150 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
13160 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
13170 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
13180 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
13190 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
131a0 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
131b0 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
131c0 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
131d0 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
131e0 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
131f0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
13200 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13210 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
13220 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
13230 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70  st.iSDParm, p->p
13240 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
13250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
13260 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
13270 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
13280 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
13290 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
132a0 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  * Special handli
132b0 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ng for a compoun
132c0 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
132d0 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41  iginates as a VA
132e0 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a  LUES clause..  *
132f0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
13300 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
13310 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lue ){.    rc = 
13320 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
13330 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  s(pParse, p, &de
13340 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  st);.    goto mu
13350 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
13360 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
13370 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
13380 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
13390 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
133a0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
133b0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
133c0 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
133d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
133e0 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
133f0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73  >pEList );.  ass
13400 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
13410 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70  nExpr==pPrior->p
13420 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
13430 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13440 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70  OMIT_CTE.  if( p
13450 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
13460 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
13470 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
13480 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72  ursiveQuery(pPar
13490 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
134a0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
134b0 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
134c0 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
134d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
134e0 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
134f0 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
13500 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
13510 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
13520 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
13530 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
13540 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  st);.  }else..  
13550 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13560 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
13570 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
13580 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
13590 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
135a0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
135b0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
135c0 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
135d0 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
135e0 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
135f0 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
13600 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69     pPrior->iLimi
13610 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
13620 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66       pPrior->iOf
13630 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
13640 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
13650 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
13660 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  mit;.      pPrio
13670 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->pOffset = p->
13680 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65  pOffset;.      e
13690 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
136a0 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
136b0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
136c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
136d0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
136e0 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b   pPrior, &dest);
136f0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
13700 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
13710 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
13720 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
13730 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
13740 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
13750 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
13760 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
13770 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
13780 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
13790 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
137a0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
137b0 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
137c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  t ){.        add
137d0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
137e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
137f0 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56  t, p->iLimit); V
13800 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13810 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
13820 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
13830 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
13840 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  ched"));.       
13850 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20   if( p->iOffset 
13860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13870 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13880 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
13890 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
138b0 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66  >iLimit, p->iOff
138c0 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65  set+1, p->iOffse
138d0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
138e0 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c      }.      expl
138f0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
13900 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
13910 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
13920 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
13930 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
13940 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74   &dest);.      t
13950 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
13960 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
13970 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
13980 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
13990 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
139a0 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
139b0 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
139c0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
139d0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
139e0 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  it.       && sql
139f0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
13a00 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
13a10 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20  , &nLimit).     
13a20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26    && nLimit>0 &&
13a30 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
13a40 20 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20   (u64)nLimit .  
13a50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
13a60 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
13a70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
13a80 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
13a90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13aa0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
13ab0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
13ac0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13ad0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
13ae0 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
13af0 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
13b00 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
13b10 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
13b20 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
13b30 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
13b40 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
13b50 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
13b60 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
13b70 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
13b80 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
13b90 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
13ba0 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
13bb0 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
13bc0 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
13bd0 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
13be0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
13bf0 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
13c00 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
13c10 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
13c20 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
13c30 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
13c40 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
13c50 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
13c60 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
13c70 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
13c80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
13c90 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
13ca0 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
13cb0 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
13cc0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
13cd0 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
13ce0 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
13cf0 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
13d00 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
13d10 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
13d20 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
13d30 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
13d40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13d50 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
13d60 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
13d70 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
13d80 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
13d90 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13da0 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
13db0 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
13dc0 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
13dd0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
13de0 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
13df0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
13e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
13e10 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
13e20 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
13e30 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13e40 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
13e50 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
13e60 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
13e70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13e80 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
13e90 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
13ea0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13eb0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
13ec0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
13ed0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13ee0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
13ef0 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
13f00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13f10 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
13f20 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
13f30 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
13f40 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
13f50 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
13f60 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
13f70 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
13f80 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
13f90 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13fa0 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
13fb0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
13fc0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13fd0 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
13fe0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
13ff0 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
14000 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
14010 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
14020 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
14030 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
14040 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  Tab);.      expl
14050 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14060 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
14070 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14080 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14090 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
140a0 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
140b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
140c0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
140d0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
140e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
140f0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
14100 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
14110 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
14120 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
14130 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
14140 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
14150 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
14160 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
14170 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
14180 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
14190 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
141a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
141b0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
141c0 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
141d0 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
141e0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
141f0 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
14200 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
14210 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
14220 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
14230 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78  t = op;.      ex
14240 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
14250 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
14260 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
14270 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14280 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14290 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
142a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
142b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
142c0 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
142d0 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
142e0 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
142f0 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
14300 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
14310 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
14320 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
14330 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
14340 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
14350 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
14360 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
14370 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
14380 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
14390 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
143a0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
143b0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
143c0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
143d0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
143e0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e  =TK_UNION ) p->n
143f0 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
14400 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
14410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14420 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
14430 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
14440 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
14450 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
14460 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
14470 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
14480 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
14490 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  fset = 0;..     
144a0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
144b0 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
144c0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
144d0 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
144e0 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
144f0 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
14500 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
14510 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
14520 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50  onTab==dest.iSDP
14530 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73  arm || dest.eDes
14540 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20  t!=priorOp );.  
14550 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
14560 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st!=priorOp ){. 
14570 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
14580 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
14590 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
145a0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
145b0 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
145c0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
145d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  t ){.          S
145e0 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
145f0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
14600 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
14610 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
14620 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
14630 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
14640 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
14650 73 65 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63  se, pFirst->pSrc
14660 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
14670 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14680 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
14690 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
146a0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
146b0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
146c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
146d0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
146e0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
146f0 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
14700 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14710 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14720 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
14730 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  ab, iBreak); Vdb
14740 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14750 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
14760 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
14770 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
14780 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
14790 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
147a0 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
147b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
147c0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
147d0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
147e0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
147f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
14800 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
14810 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14820 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14830 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
14840 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
14850 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14870 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
14880 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
14890 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
148a0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
148b0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
148c0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
148d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
148e0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  ult: assert( p->
148f0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
14900 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
14910 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
14920 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
14930 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
14940 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
14950 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
14960 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
14970 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
14980 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
14990 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
149a0 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
149b0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
149c0 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
149d0 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
149e0 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
149f0 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
14a00 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
14a10 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
14a20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
14a30 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
14a40 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
14a50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
14a60 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
14a70 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
14a80 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14a90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14aa0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
14ab0 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
14ac0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14ad0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14ae0 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
14af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14b00 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
14b10 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
14b20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14b30 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
14b40 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
14b50 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
14b60 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
14b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14b80 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
14b90 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
14ba0 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
14bb0 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
14bc0 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
14bd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
14be0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14bf0 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
14c00 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
14c10 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
14c20 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14c30 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
14c40 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
14c50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14c60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14c70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
14c80 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
14c90 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
14ca0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14cb0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
14cc0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
14cd0 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
14ce0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
14cf0 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
14d00 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
14d10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14d20 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14d30 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
14d40 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
14d50 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
14d60 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
14d70 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
14d80 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
14d90 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
14da0 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
14db0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
14dc0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
14dd0 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
14de0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
14df0 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
14e00 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
14e10 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d  sectdest.iSDParm
14e20 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
14e30 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14e40 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
14e50 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14e60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14e70 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14e80 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
14e90 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
14ea0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14eb0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
14ec0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
14ed0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14ee0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
14ef0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
14f00 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
14f10 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
14f20 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
14f30 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
14f40 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
14f50 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
14f60 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
14f70 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
14f80 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14f90 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
14fa0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
14fb0 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
14fc0 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
14fd0 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
14fe0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
14ff0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15000 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15010 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
15020 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
15030 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
15040 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
15050 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
15060 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
15070 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
15080 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
15090 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
150a0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
150b0 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20  , pFirst->pSrc, 
150c0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
150d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
150e0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
150f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15100 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
15110 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15120 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
15130 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
15140 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
15150 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
15160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15170 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
15180 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  b1, iBreak); Vdb
15190 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
151a0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
151b0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
151c0 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
151d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
151e0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  dOp2(v, OP_RowKe
151f0 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  y, tab1, r1);.  
15200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15210 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
15220 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
15230 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56 64  Cont, r1, 0); Vd
15240 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15250 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
15260 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
15270 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65  e, r1);.      se
15280 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
15290 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
152a0 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20  st, tab1,.      
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
152d0 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
152e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
152f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
15300 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
15310 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15320 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
15330 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
15340 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
15350 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15360 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
15370 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
15380 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15390 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
153a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
153b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
153c0 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
153d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
153e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c     }.  }..  expl
153f0 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
15400 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
15410 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21  1, iSub2, p->op!
15420 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20  =TK_ALL);..  /* 
15430 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
15440 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
15450 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
15460 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
15470 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
15480 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
15490 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
154a0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
154b0 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
154c0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
154d0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
154e0 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
154f0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
15500 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
15510 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
15520 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
15530 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
15540 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
15550 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
15560 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
15570 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
15580 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
15590 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
155a0 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
155b0 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
155c0 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
155d0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
155e0 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
155f0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
15620 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
15630 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
15640 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15650 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
15660 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
15670 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
15680 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
15690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
156a0 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
156b0 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
156c0 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
156d0 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
156e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
156f0 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
15700 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
15710 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
15720 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
15730 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15740 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
15750 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
15760 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
15770 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f  xt==0 );.    nCo
15780 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
15790 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
157a0 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
157b0 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f  nfoAlloc(db, nCo
157c0 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  l, 1);.    if( !
157d0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
157e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
157f0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
15800 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
15820 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
15830 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
15840 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
15850 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
15860 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
15870 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
15880 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
15890 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
158a0 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
158b0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
158c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
158d0 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
158e0 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
158f0 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
15900 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
15910 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
15920 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
15930 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
15940 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
15950 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
15960 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
15970 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
15980 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
15990 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
159a0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
159b0 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
159c0 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
159d0 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
159e0 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
159f0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
15a00 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
15a10 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
15a20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
15a30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15a40 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
15a50 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
15a60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15a70 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
15a80 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
15a90 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
15aa0 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ac0 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
15ad0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
15ae0 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
15af0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
15b00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79  }.    sqlite3Key
15b10 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
15b20 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
15b30 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
15b40 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
15b50 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
15b60 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
15b70 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
15b80 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
15b90 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
15ba0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
15bb0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
15bc0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
15bd0 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d  /../*.** Error m
15be0 65 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20  essage for when 
15bf0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  two or more term
15c00 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  s of a compound 
15c10 73 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66  select have diff
15c20 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65  erent.** size re
15c30 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f  sult sets..*/.vo
15c40 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
15c50 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72  WrongNumTermsErr
15c60 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
15c70 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
15c80 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
15c90 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
15ca0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15cb0 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20  sg(pParse, "all 
15cc0 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65  VALUES must have
15cd0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
15ce0 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d   of terms");.  }
15cf0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
15d00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15d10 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
15d20 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
15d30 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
15d40 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
15d50 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
15d60 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
15d70 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
15d80 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  op));.  }.}../*.
15d90 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
15da0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
15db0 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
15dc0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
15dd0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
15de0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
15df0 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
15e00 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
15e10 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68   pIn->iSdst.  Th
15e20 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e  ere are.** pIn->
15e30 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f  nSdst columns to
15e40 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
15e50 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
15e60 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
15e70 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
15e80 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
15e90 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
15ea0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
15eb0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
15ec0 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
15ed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
15ee0 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
15ef0 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
15f00 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
15f10 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
15f20 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
15f30 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
15f40 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
15f50 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
15f60 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
15f70 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
15f80 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
15f90 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
15fa0 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
15fb0 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
15fc0 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
15fd0 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
15fe0 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
15ff0 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
16000 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
16010 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
16020 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
16030 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
16040 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
16050 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
16060 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
16070 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
16080 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
16090 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
160a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
160b0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
160c0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
160d0 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
160e0 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
160f0 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
16100 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
16110 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
16120 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
16130 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
16140 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
16150 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
16160 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
16170 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
16180 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
16190 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
161a0 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
161b0 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
161c0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
161d0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
161e0 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
161f0 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
16200 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ry */.  int iBre
16210 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
16220 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
16230 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
16240 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
16250 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
16260 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
16270 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
16280 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
16290 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
162a0 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
162b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
162c0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
162d0 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
162e0 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
162f0 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
16300 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
16310 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
16320 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
16330 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  2;.    addr1 = s
16340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16350 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
16360 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65  gPrev); VdbeCove
16370 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64  rage(v);.    add
16380 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
16390 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
163a0 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  pare, pIn->iSdst
163b0 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
163c0 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20  ->nSdst,.       
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
163f0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
16400 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
16410 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
16420 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16430 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b   OP_Jump, addr2+
16440 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64  2, iContinue, ad
16450 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65  dr2+2); VdbeCove
16460 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
16470 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16480 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
16490 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
164a0 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49  3(v, OP_Copy, pI
164b0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
164c0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d  v+1, pIn->nSdst-
164d0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
164e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
164f0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
16500 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
16510 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
16520 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
16530 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
16540 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46  ess the first OF
16550 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
16560 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
16570 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
16580 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
16590 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
165a0 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  inue);..  assert
165b0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  ( pDest->eDest!=
165c0 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20  SRT_Exists );.  
165d0 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
165e0 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
165f0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  );.  switch( pDe
16600 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
16610 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
16620 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
16630 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
16640 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16650 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
16660 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
16670 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16680 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16690 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
166a0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
166b0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
166c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
166d0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
166e0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
166f0 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
16700 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16710 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
16720 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
16730 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
16740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16750 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
16760 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
16770 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
16780 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16790 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
167a0 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
167b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
167c0 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
167d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
167e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
167f0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
16800 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
16810 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16820 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
16830 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
16840 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
16850 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
16860 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
16870 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
16880 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
16890 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
168a0 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
168b0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
168c0 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
168d0 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
168e0 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
168f0 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
16900 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
16910 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16920 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
16930 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
16940 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
16950 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20  dst = .         
16960 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
16970 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
16980 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
16990 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
169a0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
169b0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
169c0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
169d0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
169e0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
169f0 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31  In->iSdst, 1, r1
16a00 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73  , &pDest->affSds
16a10 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t,1);.      sqli
16a20 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
16a30 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
16a40 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  e, pIn->iSdst, 1
16a50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16a60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16a70 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73  _IdxInsert, pDes
16a80 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b  t->iSDParm, r1);
16a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16aa0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16ab0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
16ac0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
16ad0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16ae0 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
16af0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
16b00 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
16b10 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
16b20 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
16b30 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
16b40 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
16b50 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
16b60 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
16b70 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
16b80 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
16b90 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16ba0 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
16bb0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20  rse->nErr>0 );  
16bc0 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
16bd0 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst!=1 );.     
16be0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16bf0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
16c00 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
16c10 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
16c20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
16c30 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
16c40 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
16c50 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
16c60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
16c70 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
16c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16c90 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
16ca0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
16cb0 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
16cc0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16cd0 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
16ce0 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
16cf0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
16d00 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
16d10 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16d20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
16d30 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
16d40 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
16d50 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
16d60 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
16d70 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
16d80 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16d90 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
16da0 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
16db0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16dc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
16dd0 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
16de0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
16df0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16e00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16e10 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16e20 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
16e30 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
16e40 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
16e50 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
16e60 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
16e70 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
16e80 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
16e90 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
16ea0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16eb0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
16ec0 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
16ed0 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
16ee0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
16ef0 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
16f00 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
16f10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
16f20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
16f30 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
16f40 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
16f50 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
16f60 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
16f70 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
16f80 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
16f90 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
16fa0 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
16fb0 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
16fc0 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
16fd0 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
16fe0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16ff0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
17000 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
17010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17020 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
17030 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
17040 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17050 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17060 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
17070 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
17080 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17090 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
170a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
170b0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
170c0 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
170d0 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
170e0 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
170f0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
17100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17110 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
17120 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  umpZero, p->iLim
17130 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
17140 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17150 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
17160 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
17170 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
17180 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17190 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
171a0 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
171b0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
171c0 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
171d0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
171e0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
171f0 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
17200 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
17210 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
17220 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
17230 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
17240 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
17250 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
17260 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
17270 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
17280 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
17290 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
172a0 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
172b0 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
172c0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
172d0 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
172e0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
172f0 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
17300 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
17310 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
17320 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
17330 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
17340 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
17350 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
17360 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
17370 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
17380 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
17390 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
173a0 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
173b0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
173c0 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
173d0 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
173e0 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
173f0 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
17400 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
17410 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
17420 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
17430 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
17440 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
17450 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
17460 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
17470 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
17480 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
17490 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
174a0 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
174b0 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
174c0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
174d0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
174e0 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
174f0 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
17500 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
17510 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
17520 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
17530 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
17540 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
17550 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
17560 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
17570 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
17580 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
17590 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
175a0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
175b0 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
175c0 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
175d0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
175e0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
175f0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
17600 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
17610 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
17620 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
17630 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
17640 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
17650 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
17660 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
17670 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
17680 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
17690 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
176a0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
176b0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
176c0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
176d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
176e0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
176f0 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
17700 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
17710 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
17720 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
17730 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
17740 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
17750 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
17760 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
17770 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
17780 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
17790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
177a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
177b0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
177c0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
177d0 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
177e0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
177f0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
17800 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17810 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
17820 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
17830 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
17840 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
17850 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
17860 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
17870 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
17880 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17890 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
178a0 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
178b0 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
178c0 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
178d0 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
178e0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
178f0 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
17900 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
17910 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
17920 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
17930 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
17940 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
17950 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
17960 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
17970 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
17980 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
17990 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
179a0 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
179b0 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
179c0 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
179d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
179e0 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
179f0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
17a00 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
17a10 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
17a20 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
17a30 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
17a40 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
17a50 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
17a60 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
17a70 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
17a80 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
17a90 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
17aa0 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
17ab0 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
17ac0 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
17ad0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
17ae0 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
17af0 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
17b00 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
17b10 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
17b20 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
17b30 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
17b40 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
17b50 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
17b60 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
17b70 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
17b80 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
17b90 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
17ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
17bb0 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
17bc0 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
17bd0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
17be0 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
17bf0 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
17c00 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
17c10 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
17c20 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
17c30 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
17c40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
17c50 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
17c60 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
17c70 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
17c80 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
17c90 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
17ca0 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
17cb0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17cc0 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
17cd0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17ce0 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
17cf0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
17d00 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
17d10 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
17d20 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
17d30 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
17d40 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
17d50 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
17d60 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
17d70 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
17d80 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
17d90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
17da0 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
17db0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
17dc0 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
17dd0 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
17de0 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
17df0 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
17e00 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
17e10 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
17e20 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
17e30 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
17e40 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
17e50 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
17e60 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
17e70 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
17e80 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
17e90 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
17ea0 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
17eb0 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
17ec0 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
17ed0 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
17ee0 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
17ef0 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
17f00 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
17f10 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
17f20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
17f30 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
17f40 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
17f50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17f60 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
17f70 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
17f80 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
17f90 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
17fa0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
17fb0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
17fc0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
17fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17fe0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
17ff0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
18000 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
18010 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
18020 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
18030 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
18040 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
18050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18060 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
18070 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
18080 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
18090 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
180a0 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
180b0 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
180d0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
180e0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
180f0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
18100 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
18110 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
18120 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
18130 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
18140 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
18150 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
18160 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
18170 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18180 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18190 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
181a0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
181b0 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
181c0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
181d0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
181e0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
181f0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
18200 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18210 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
18220 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18230 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
18240 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18250 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
18260 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18270 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
18280 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18290 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
182a0 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
182b0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
182c0 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
182d0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
182e0 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
182f0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
18300 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
18310 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
18320 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
18330 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
18340 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
18350 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
18360 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
18370 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
18380 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18390 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
183a0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
183b0 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
183c0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
183d0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f  .  int addrEofA_
183e0 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65  noB;     /* Alte
183f0 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69  rnate addrEofA i
18400 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  f B is uninitial
18410 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ized */.  int ad
18420 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
18430 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18440 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
18450 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
18460 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
18470 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18480 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
18490 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
184a0 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
184b0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
184c0 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
184d0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
184e0 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
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 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
18510 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
18520 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
18530 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
18540 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
18550 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
18560 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
18570 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
18580 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
18590 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
185a0 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
185b0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
185c0 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
185d0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
185e0 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
185f0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
18600 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
18610 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
18620 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
18630 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
18640 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
18650 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
18660 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
18670 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
18680 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
18690 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
186a0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
186b0 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
186c0 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
186d0 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
186e0 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
186f0 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
18700 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
18710 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
18720 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
18730 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
18740 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
18750 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
18760 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
18770 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
18780 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
18790 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
187a0 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
187b0 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
187c0 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
187d0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
187e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
187f0 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
18800 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
18810 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18820 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18830 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
18840 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
18850 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18860 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
18870 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
18880 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18890 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
188a0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
188b0 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
188c0 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
188d0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
188e0 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
188f0 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
18900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
18910 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
18920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
18930 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
18940 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
18950 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
18960 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
18970 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
18980 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
18990 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
189a0 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
189b0 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
189c0 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
189d0 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
189e0 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
189f0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
18a00 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
18a10 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
18a20 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
18a30 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
18a40 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
18a50 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
18a60 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
18a70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18a80 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
18a90 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
18aa0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18ab0 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
18ac0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
18ad0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
18ae0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
18af0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
18b00 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
18b10 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
18b20 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
18b30 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
18b40 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
18b50 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
18b60 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
18b70 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
18b80 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
18b90 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
18ba0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
18bb0 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
18bc0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
18bd0 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
18be0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
18bf0 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
18c00 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
18c10 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
18c20 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
18c30 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
18c40 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
18c50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
18c60 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
18c70 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
18c80 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18c90 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18ca0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
18cb0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
18cc0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
18cd0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
18ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18cf0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
18d00 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
18d10 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
18d20 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
18d30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
18d40 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
18d50 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
18d60 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
18d70 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
18d80 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
18d90 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
18da0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18db0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18dc0 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
18dd0 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
18de0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
18df0 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
18e00 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
18e10 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
18e20 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
18e30 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
18e40 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
18e50 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
18e60 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
18e70 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
18e80 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
18e90 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
18ea0 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
18eb0 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
18ec0 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
18ed0 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
18ee0 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
18ef0 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
18f00 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
18f10 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
18f20 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
18f30 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
18f40 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
18f50 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
18f60 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
18f70 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
18f80 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
18f90 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
18fa0 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
18fb0 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
18fc0 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
18fd0 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
18fe0 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
18ff0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
19000 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
19010 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
19020 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42  of(int)*(nOrderB
19030 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61  y + 1));.  if( a
19040 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
19050 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
19060 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
19070 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f  aPermute[0] = nO
19080 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28  rderBy;.    for(
19090 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=1, pItem=pOrde
190a0 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65  rBy->a; i<=nOrde
190b0 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
190c0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
190d0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
190e0 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
190f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
19100 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
19110 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
19120 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
19130 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
19140 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
19150 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol - 1;.    }.  
19160 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75    pKeyMerge = mu
19170 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
19180 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
19190 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p, 1);.  }else{.
191a0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
191b0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
191c0 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
191d0 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
191e0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
191f0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
19200 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
19210 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
19220 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
19230 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
19240 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41  rBy, 0);..  /* A
19250 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20  llocate a range 
19260 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  of temporary reg
19270 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b  isters and the K
19280 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20  eyInfo needed.  
19290 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63  ** for the logic
192a0 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75   that removes du
192b0 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72  plicate result r
192c0 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ows when the.  *
192d0 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  * operator is UN
192e0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
192f0 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e  INTERSECT (but n
19300 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20  ot UNION ALL).. 
19310 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
19320 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50  _ALL ){.    regP
19330 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rev = 0;.  }else
19340 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  {.    int nExpr 
19350 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
19360 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
19370 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20  nOrderBy>=nExpr 
19380 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
19390 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72  led );.    regPr
193a0 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
193b0 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
193c0 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31  >nMem += nExpr+1
193d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
193e0 65 5a 65 72 6f 52 65 67 69 73 74 65 72 28 76 2c  eZeroRegister(v,
193f0 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
19400 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
19410 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
19420 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
19430 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
19440 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
19450 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
19460 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
19470 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
19480 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
19490 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
194a0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
194b0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
194c0 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
194d0 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
194e0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
194f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
19500 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
19510 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
19520 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
19530 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
19540 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
19550 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
19560 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
19570 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
19580 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
19590 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
195a0 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
195b0 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
195c0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
195d0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
195e0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
195f0 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
19600 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
19610 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
19620 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
19630 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
19640 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
19650 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
19660 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
19670 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
19680 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
19690 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
196a0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
196b0 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
196c0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
196d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
196e0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
196f0 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
19700 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
19710 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
19740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19750 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
19760 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
19770 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
19780 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
19790 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
197a0 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
197b0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
197c0 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
197d0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
197e0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
197f0 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
19800 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
19810 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
19820 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19830 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
19840 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19850 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
19860 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
19870 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
19880 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
19890 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
198a0 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
198b0 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
198c0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
198d0 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
198e0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
198f0 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
19900 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
19910 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
19920 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
19930 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
19940 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
19950 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
19960 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
19970 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  ..  */.  addrSel
19980 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
19990 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
199a0 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20   + 1;.  addr1 = 
199b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
199c0 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
199d0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c  utine, regAddrA,
199e0 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29   0, addrSelectA)
199f0 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
19a00 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54  (v, "left SELECT
19a10 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
19a20 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
19a30 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  A;.  explainSetI
19a40 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
19a50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
19a60 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
19a70 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
19a80 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
19a90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19aa0 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
19ab0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
19ac0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
19ad0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
19ae0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
19af0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
19b00 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
19b10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
19b20 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
19b30 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
19b40 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
19b50 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
19b60 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19b70 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
19b80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19b90 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
19ba0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
19bb0 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42  , 0, addrSelectB
19bc0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
19bd0 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45  ((v, "right SELE
19be0 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
19bf0 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
19c00 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
19c10 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
19c20 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
19c30 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
19c40 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c  et = 0;  .  expl
19c50 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
19c60 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
19c70 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
19c80 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
19c90 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
19ca0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
19cb0 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
19cc0 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
19cd0 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
19ce0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
19cf0 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72  _EndCoroutine, r
19d00 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
19d10 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19d20 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
19d30 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
19d40 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a  ow of the A.  **
19d50 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
19d60 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
19d70 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
19d80 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
19d90 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19da0 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
19db0 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64  e for A"));.  ad
19dc0 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74  drOutA = generat
19dd0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
19de0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
19df0 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
19e00 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67  estA, pDest, reg
19e10 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20  OutA,.          
19e20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
19e30 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
19e40 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65  d);.  .  /* Gene
19e50 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
19e60 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
19e70 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
19e80 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c  f the B.  ** sel
19e90 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
19ea0 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
19eb0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
19ec0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  t..  */.  if( op
19ed0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
19ee0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
19ef0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
19f00 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
19f10 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20  ine for B"));.  
19f20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e    addrOutB = gen
19f30 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
19f40 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19f60 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c  , &destB, pDest,
19f70 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20   regOutB,.      
19f80 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
19f90 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
19fa0 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71  elEnd);.  }.  sq
19fb0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
19fc0 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f  f(pKeyDup);..  /
19fd0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
19fe0 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
19ff0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1a000 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20  from select A.  
1a010 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1a020 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1a030 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69  n select B remai
1a040 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1a050 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
1a060 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1a070 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
1a080 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20  _noB = addrEofA 
1a090 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65  = labelEnd;.  }e
1a0a0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1a0b0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a0c0 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  eof-A subroutine
1a0d0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1a0e0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
1a0f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1a100 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
1a110 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45  OutB);.    addrE
1a120 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65  ofA_noB = sqlite
1a130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a140 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1a150 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a180 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1a190 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1a1a0 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  dbeGoto(v, addrE
1a1b0 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65  ofA);.    p->nSe
1a1c0 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
1a1d0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
1a1e0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a1f0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1a200 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
1a210 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
1a220 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
1a230 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
1a240 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
1a250 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
1a260 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
1a270 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1a280 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
1a290 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  A;.    if( p->nS
1a2a0 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f  electRow > pPrio
1a2b0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
1a2c0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1a2d0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1a2e0 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  ow;.  }else{  . 
1a2f0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1a300 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
1a310 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1a320 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
1a330 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a340 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1a350 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1a360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a370 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a380 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65  , regAddrA, labe
1a390 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  lEnd); VdbeCover
1a3a0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1a3b0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1a3c0 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
1a3d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a3e0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1a3f0 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
1a400 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1a410 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
1a420 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1a430 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
1a440 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a450 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1a460 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1a470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a480 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1a490 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1a4a0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1a4b0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1a4c0 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1a4d0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  mpr);..  /* Gene
1a4e0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1a4f0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1a500 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20  A==B.  */.  if( 
1a510 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1a520 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1a530 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69  rAltB;.  }else i
1a540 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
1a550 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ECT ){.    addrA
1a560 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1a570 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a      addrAltB++;.
1a580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
1a590 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a5a0 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74   "A-eq-B subrout
1a5b0 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1a5c0 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74  AeqB =.    sqlit
1a5d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a5e0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a5f0 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
1a600 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1a620 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  oto(v, labelCmpr
1a630 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1a640 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1a650 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1a660 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A>B.  */.  Vdbe
1a670 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1a680 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-gt-B subrouti
1a690 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74  ne"));.  addrAgt
1a6a0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1a6b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1a6c0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1a6d0 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
1a6e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1a6f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a700 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
1a710 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20  ddrOutB);.  }.  
1a720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a730 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1a740 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66  egAddrB, addrEof
1a750 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1a760 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1a770 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1a780 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
1a790 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
1a7a0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
1a7b0 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
1a7c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1a7d0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
1a7e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a7f0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1a800 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1a810 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f  ofA_noB); VdbeCo
1a820 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1a830 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a840 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1a850 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  ddrB, addrEofB);
1a860 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a870 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;..  /* Implemen
1a880 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65  t the main merge
1a890 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
1a8a0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1a8b0 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70  abel(v, labelCmp
1a8c0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
1a8d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65  eAddOp4(v, OP_Pe
1a8e0 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  rmutation, 0, 0,
1a8f0 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d   0, (char*)aPerm
1a900 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59  ute, P4_INTARRAY
1a910 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a920 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
1a930 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73  pare, destA.iSds
1a940 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20  t, destB.iSdst, 
1a950 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  nOrderBy,.      
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a970 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65     (char*)pKeyMe
1a980 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  rge, P4_KEYINFO)
1a990 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1a9a0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
1a9b0 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71  G_PERMUTE);.  sq
1a9c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a9d0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
1a9e0 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
1a9f0 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43  addrAgtB); VdbeC
1aa00 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1aa10 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
1aa20 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
1aa30 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
1aa40 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1aa50 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1aa60 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1aa70 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  lEnd);..  /* Set
1aa80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
1aa90 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20  utput columns.  
1aaa0 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
1aab0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
1aac0 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  t ){.    Select 
1aad0 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72  *pFirst = pPrior
1aae0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69  ;.    while( pFi
1aaf0 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
1ab00 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
1ab10 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72  Prior;.    gener
1ab20 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
1ab30 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e 70  Parse, pFirst->p
1ab40 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  Src, pFirst->pEL
1ab50 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
1ab60 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63  Reassembly the c
1ab70 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f  ompound query so
1ab80 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
1ab90 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79   freed correctly
1aba0 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  .  ** by the cal
1abb0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
1abc0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
1abd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
1abe0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1abf0 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a  p->pPrior);.  }.
1ac00 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
1ac10 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  rior;.  pPrior->
1ac20 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a  pNext = p;..  /*
1ac30 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20  ** TBD:  Insert 
1ac40 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  subroutine calls
1ac50 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72   to close cursor
1ac60 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a  s on incomplete.
1ac70 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65    **** subquerie
1ac80 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69  s ****/.  explai
1ac90 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
1aca0 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
1acb0 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65   iSub2, 0);.  re
1acc0 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
1acd0 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  r!=0;.}.#endif..
1ace0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1acf0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1ad00 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1ad10 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1ad20 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c  ./* Forward Decl
1ad30 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  arations */.stat
1ad40 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
1ad50 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20  rList(sqlite3*, 
1ad60 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20  ExprList*, int, 
1ad70 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
1ad80 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
1ad90 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65  ect(sqlite3*, Se
1ada0 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
1adb0 72 4c 69 73 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  rList*, int);../
1adc0 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
1add0 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
1ade0 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
1adf0 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1ae00 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
1ae10 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
1ae20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
1ae30 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
1ae40 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
1ae50 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
1ae60 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
1ae70 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
1ae80 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
1ae90 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
1aea0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
1aeb0 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
1aec0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
1aed0 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
1aee0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
1aef0 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
1af00 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
1af10 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
1af20 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1af30 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
1af40 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
1af50 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
1af60 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
1af70 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
1af80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1af90 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
1afa0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
1afb0 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
1afc0 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
1afd0 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
1afe0 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
1aff0 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
1b000 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1b010 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
1b020 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
1b030 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74  bstExpr(.  sqlit
1b040 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
1b050 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
1b060 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63  errors to this c
1b070 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
1b080 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1b090 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68     /* Expr in wh
1b0a0 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ich substitution
1b0b0 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74   occurs */.  int
1b0c0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1b0d0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1b0e0 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
1b0f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1b100 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75  t    /* Substitu
1b110 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  te expressions *
1b120 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
1b130 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1b140 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1b150 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
1b160 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
1b170 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
1b180 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1b190 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1b1a0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1b1b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
1b1c0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
1b1d0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
1b1e0 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
1b1f0 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
1b200 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
1b210 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1b220 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
1b230 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
1b240 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1b250 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  xprDup(db, pELis
1b260 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
1b270 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  umn].pExpr, 0);.
1b280 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b290 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
1b2a0 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20  r);.      pExpr 
1b2b0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
1b2c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72  }else{.    pExpr
1b2d0 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1b2e0 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
1b2f0 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
1b300 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72  List);.    pExpr
1b310 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
1b320 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
1b330 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
1b340 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
1b350 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1b360 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1b370 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
1b380 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
1b390 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
1b3a0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c   iTable, pEList,
1b3b0 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
1b3c0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1b3d0 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ist(db, pExpr->x
1b3e0 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  .pList, iTable, 
1b3f0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1b400 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
1b410 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  r;.}.static void
1b420 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a   substExprList(.
1b430 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1b440 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1b450 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
1b460 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ere */.  ExprLis
1b470 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
1b480 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e   List to scan an
1b490 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  d in which to ma
1b4a0 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a  ke substitutes *
1b4b0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1b4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1b4d0 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
1b4e0 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
1b4f0 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a  t *pEList     /*
1b500 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75   Substitute valu
1b510 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
1b520 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1b530 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1b540 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1b550 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1b560 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1b570 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  r = substExpr(db
1b580 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
1b590 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
1b5a0 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
1b5b0 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
1b5c0 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
1b5d0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
1b5e0 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
1b5f0 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ors here */.  Se
1b600 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1b610 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
1b620 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
1b630 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1b640 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tions */.  int i
1b650 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
1b660 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72  /* Table to be r
1b670 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70  eplaced */.  Exp
1b680 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
1b690 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
1b6a0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
1b6b0 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  doPrior         
1b6c0 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74   /* Do substitut
1b6d0 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20  es on p->pPrior 
1b6e0 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  too */.){.  SrcL
1b6f0 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1b700 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1b710 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1b720 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1b730 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73  urn;.  do{.    s
1b740 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b750 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
1b760 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b770 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1b780 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
1b790 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b7a0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1b7b0 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
1b7c0 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
1b7d0 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  st);.    p->pHav
1b7e0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1b7f0 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
1b800 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b810 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
1b820 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b830 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
1b840 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
1b850 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
1b860 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21     assert( pSrc!
1b870 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 );.    for(i=
1b880 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65  pSrc->nSrc, pIte
1b890 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20  m=pSrc->a; i>0; 
1b8a0 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
1b8b0 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1b8c0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
1b8d0 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
1b8e0 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ist, 1);.      i
1b8f0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  f( pItem->fg.isT
1b900 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  abFunc ){.      
1b910 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1b920 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46  db, pItem->u1.pF
1b930 75 6e 63 41 72 67 2c 20 69 54 61 62 6c 65 2c 20  uncArg, iTable, 
1b940 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
1b950 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1b960 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d   doPrior && (p =
1b970 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29   p->pPrior)!=0 )
1b980 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
1b990 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b9a0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1b9b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b9c0 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
1b9d0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1b9e0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1b9f0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1ba00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1ba10 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1ba20 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
1ba30 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
1ba40 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s as a performan
1ba50 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
1ba60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ba70 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
1ba80 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
1ba90 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
1baa0 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a  ening occurs..**
1bab0 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
1bac0 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
1bad0 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
1bae0 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1baf0 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
1bb00 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
1bb10 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
1bb20 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1bb30 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
1bb40 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
1bb50 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
1bb60 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
1bb70 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
1bb80 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
1bb90 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
1bba0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1bbb0 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1bbc0 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
1bbd0 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
1bbe0 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
1bbf0 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
1bc00 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
1bc10 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
1bc20 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
1bc30 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
1bc40 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1bc50 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
1bc60 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
1bc70 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
1bc80 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
1bc90 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
1bca0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1bcb0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1bcc0 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
1bcd0 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
1bce0 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
1bcf0 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
1bd00 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1bd10 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
1bd20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1bd30 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
1bd40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1bd50 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1bd60 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  is simplificatio
1bd70 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1bd80 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1bd90 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1bda0 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1bdb0 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1bdc0 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1bdd0 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1bde0 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1bdf0 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1be00 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1be10 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1be20 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
1be30 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
1be40 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1be50 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1be60 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
1be70 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1be80 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1be90 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
1bea0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
1beb0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1bec0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1bed0 74 65 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f  te or (2a) the o
1bee0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1bef0 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  t a join.**     
1bf00 20 20 20 61 6e 64 20 28 32 62 29 20 74 68 65 20     and (2b) the 
1bf10 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1bf20 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65 72   not use subquer
1bf30 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ies other than t
1bf40 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  he one.**       
1bf50 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1bf60 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20  query that is a 
1bf70 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c  candidate for fl
1bf80 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69  attening.  (2b i
1bf90 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20  s.**        due 
1bfa0 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37  to ticket [2f717
1bfb0 30 64 37 33 62 66 39 61 62 66 38 30 5d 20 66 72  0d73bf9abf80] fr
1bfc0 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a  om 2015-02-09.).
1bfd0 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
1bfe0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1bff0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1c000 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
1c010 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20  er join.**      
1c020 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69    (Originally ti
1c030 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65  cket #306.  Stre
1c040 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b  ngthened by tick
1c050 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20  et #3300).**.** 
1c060 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75    (4)  The subqu
1c070 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
1c080 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  NCT..**.**  (**)
1c090 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72    At one point r
1c0a0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20  estrictions (4) 
1c0b0 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64 20  and (5) defined 
1c0c0 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54  a subset of DIST
1c0d0 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73  INCT.**        s
1c0e0 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74 20  ub-queries that 
1c0f0 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66 72  were excluded fr
1c100 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  om this optimiza
1c110 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f  tion. Restrictio
1c120 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29  n .**        (4)
1c130 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20   has since been 
1c140 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c  expanded to excl
1c150 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54  ude all DISTINCT
1c160 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a   subqueries..**.
1c170 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
1c180 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c190 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
1c1a0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1c1b0 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
1c1c0 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
1c1d0 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
1c1e0 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
1c1f0 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a  M clause.  TODO:
1c200 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73    For subqueries
1c210 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20   without.**     
1c220 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65     A FROM clause
1c230 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e  , consider addin
1c240 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77  g a FROM close w
1c250 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1c260 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1c270 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1c280 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1c290 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1c2a0 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1c2b0 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1c2c0 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
1c2d0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c2e0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c2f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1c300 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
1c310 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
1c320 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c330 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1c340 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1c350 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
1c360 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
1c370 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73  **.**  (**)  Res
1c380 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61  triction (10) wa
1c390 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1c3a0 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d  he code on 2005-
1c3b0 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20  02-05 but we.** 
1c3c0 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c         accidentl
1c3d0 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f  y carried the co
1c3e0 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e  mment forward un
1c3f0 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20  til 2014-09-15. 
1c400 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   Original.**    
1c410 20 20 20 20 74 65 78 74 3a 20 22 54 68 65 20 73      text: "The s
1c420 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c430 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
1c440 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1c450 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 64 6f  ry .**        do
1c460 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1c470 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1c480 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1c490 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c4a0 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
1c4b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c4c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1c4d0 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
1c4e0 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
1c4f0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
1c500 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
1c510 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
1c520 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
1c530 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
1c540 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
1c550 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
1c560 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
1c570 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1c580 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  oth use LIMIT..*
1c590 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
1c5a0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c5b0 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
1c5c0 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
1c5d0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1c5e0 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
1c5f0 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
1c600 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
1c610 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
1c620 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  ave a LIMIT clau
1c630 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53  se..**        (S
1c640 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20  ee ticket #2339 
1c650 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38  and ticket [02a8
1c660 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20  e81d44])..**.** 
1c670 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72   (16)  The outer
1c680 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e   query is not an
1c690 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
1c6a0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a  e subquery does.
1c6b0 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f  **        not co
1c6c0 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20  ntain ORDER BY. 
1c6d0 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
1c6e0 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
1c6f0 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
1c700 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
1c710 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
1c720 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
1c730 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
1c740 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79  )  The sub-query
1c750 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75   is not a compou
1c760 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74  nd select, or it
1c770 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
1c780 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1c790 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20  und clause made 
1c7a0 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e  up entirely of n
1c7b0 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
1c7c0 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20  ries, and .**   
1c7d0 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20       the parent 
1c7e0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1c7f0 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69        * is not i
1c800 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20  tself part of a 
1c810 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1c820 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1c830 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1c840 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71  te or DISTINCT q
1c850 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  uery, and.**    
1c860 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
1c870 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   join.**.**     
1c880 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
1c890 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
1c8a0 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
1c8b0 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
1c8c0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
1c8d0 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
1c8e0 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
1c8f0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
1c900 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
1c910 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1c920 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  T clauses.  The 
1c930 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  subquery cannot 
1c940 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  use any compound
1c950 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
1c960 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55  tor other than U
1c970 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65  NION ALL because
1c980 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
1c990 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1c9a0 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65    operators have
1c9b0 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54   an implied DIST
1c9c0 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69  INCT which is di
1c9d0 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20  sallowed by.**  
1c9e0 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f        restrictio
1c9f0 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  n (4)..**.**    
1ca00 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63      Also, each c
1ca10 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20  omponent of the 
1ca20 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72  sub-query must r
1ca30 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e  eturn the same n
1ca40 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
1ca50 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
1ca60 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61  s. This is actua
1ca70 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e  lly a requiremen
1ca80 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75  t for any compou
1ca90 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  nd.**        SEL
1caa0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ECT statement, b
1cab0 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20  ut all the code 
1cac0 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b  here does is mak
1cad0 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a  e sure that no.*
1cae0 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69  *        such (i
1caf0 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72  llegal) sub-quer
1cb00 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20  y is flattened. 
1cb10 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
1cb20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20  detect the.**   
1cb30 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f       syntax erro
1cb40 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  r and return a d
1cb50 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e  etailed message.
1cb60 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66  .**.**  (18)  If
1cb70 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1cb80 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1cb90 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65  ect, then all te
1cba0 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  rms of the.**   
1cbb0 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c       ORDER by cl
1cbc0 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65  ause of the pare
1cbd0 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c  nt must be simpl
1cbe0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1cbf0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  .**        colum
1cc00 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ns of the sub-qu
1cc10 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29  ery..**.**  (19)
1cc20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1cc30 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1cc40 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1cc50 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
1cc60 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
1cc70 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
1cc80 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
1cc90 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1cca0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1ccb0 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
1ccc0 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
1ccd0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1cce0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
1ccf0 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
1cd00 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
1cd10 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
1cd20 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
1cd30 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
1cd40 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1cd50 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
1cd60 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
1cd70 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
1cd80 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1cd90 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
1cda0 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
1cdb0 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
1cdc0 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
1cdd0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
1cde0 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
1cdf0 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  21)  The subquer
1ce00 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1ce10 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1ce20 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
1ce30 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
1ce40 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20  T.  (See ticket 
1ce50 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a  [752e1646fc])..*
1ce60 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20  *.**  (22)  The 
1ce70 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1ce80 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
1ce90 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68  .**.**  (23)  Th
1cea0 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20  e parent is not 
1ceb0 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c  a recursive CTE,
1cec0 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65 72   or the sub-quer
1ced0 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20  y is not a.**   
1cee0 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75       compound qu
1cef0 65 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69  ery. This restri
1cf00 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ction is because
1cf10 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
1cf20 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65  e.**        pare
1cf30 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64  nt to a compound
1cf40 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20   query confuses 
1cf50 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61  the code that ha
1cf60 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  ndles.**        
1cf70 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
1cf80 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  s in multiSelect
1cf90 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20  ()..**.**  (24) 
1cfa0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1cfb0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1cfc0 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  e that uses the 
1cfd0 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f  built-in min() o
1cfe0 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20  r .**        or 
1cff0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  max() functions.
1d000 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73 20    (Without this 
1d010 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71  restriction, a q
1d020 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20  uery like:.**   
1d030 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46       "SELECT x F
1d040 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28  ROM (SELECT max(
1d050 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20  y), x FROM t1)" 
1d060 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73  would not necess
1d070 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  arily.**        
1d080 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
1d090 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20 77   X for which Y w
1d0a0 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a  as maximal.).**.
1d0b0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
1d0c0 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
1d0d0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
1d0e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
1d0f0 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
1d100 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
1d110 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
1d120 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
1d130 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1d140 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
1d150 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
1d160 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
1d170 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1d180 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
1d190 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
1d1a0 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
1d1b0 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
1d1c0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
1d1d0 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
1d1e0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1d1f0 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
1d200 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1d210 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
1d220 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
1d230 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
1d240 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
1d250 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
1d260 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
1d270 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1d280 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
1d290 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
1d2a0 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  bquery(.  Parse 
1d2b0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
1d2c0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1d2d0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1d2e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1d2f0 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
1d300 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
1d310 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
1d320 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
1d330 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
1d340 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
1d350 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
1d360 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
1d370 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d380 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
1d390 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1d3a0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
1d3b0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
1d3c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1d3d0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1d3e0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1d3f0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
1d400 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
1d410 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
1d420 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
1d430 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
1d440 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  nt;    /* Curren
1d450 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d  t UNION ALL term
1d460 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71 75   of the other qu
1d470 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ery */.  Select 
1d480 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
1d490 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
1d4a0 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
1d4b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
1d4c0 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
1d4d0 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
1d4e0 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
1d4f0 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
1d500 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
1d510 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1d520 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1d530 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
1d540 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
1d550 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1d560 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1d570 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
1d580 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
1d590 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1d5a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d5b0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
1d5c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
1d5d0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
1d5e0 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
1d5f0 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
1d600 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1d610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d620 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
1d630 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
1d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d650 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1d660 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1d670 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1d680 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
1d690 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
1d6a0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d6b0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
1d6c0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
1d6d0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1d6e0 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
1d6f0 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
1d700 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
1d710 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
1d720 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55  rior==0 );  /* U
1d730 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e  nable to flatten
1d740 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65   compound querie
1d750 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  s */.  if( Optim
1d760 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1d770 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
1d780 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74  Flattener) ) ret
1d790 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
1d7a0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
1d7b0 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
1d7c0 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
1d7d0 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
1d7e0 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
1d7f0 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
1d800 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
1d810 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
1d820 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1d830 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
1d840 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  ub!=0 );.  if( s
1d850 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1d860 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20      if( isAgg ) 
1d870 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d890 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d8a0 72 69 63 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f  riction (1)   */
1d8b0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
1d8c0 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
1d8d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d8f0 74 72 69 63 74 69 6f 6e 20 28 32 61 29 20 20 2a  triction (2a)  *
1d900 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 57  /.    if( (p->pW
1d910 68 65 72 65 20 26 26 20 45 78 70 72 48 61 73 50  here && ExprHasP
1d920 72 6f 70 65 72 74 79 28 70 2d 3e 70 57 68 65 72  roperty(p->pWher
1d930 65 2c 45 50 5f 53 75 62 71 75 65 72 79 29 29 0a  e,EP_Subquery)).
1d940 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33       || (sqlite3
1d950 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d  ExprListFlags(p-
1d960 3e 70 45 4c 69 73 74 29 20 26 20 45 50 5f 53 75  >pEList) & EP_Su
1d970 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20 20  bquery)!=0.     
1d980 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c  || (sqlite3ExprL
1d990 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64  istFlags(p->pOrd
1d9a0 65 72 42 79 29 20 26 20 45 50 5f 53 75 62 71 75  erBy) & EP_Subqu
1d9b0 65 72 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  ery)!=0.    ){. 
1d9c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1da00 69 63 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a  iction (2b)  */.
1da10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20      }.  }.    . 
1da20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
1da30 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1da40 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a   pSubSrc );.  /*
1da50 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f   Prior to versio
1da60 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49  n 3.1.2, when LI
1da70 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68  MIT and OFFSET h
1da80 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20  ad to be simple 
1da90 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20  constants,.  ** 
1daa0 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78  not arbitrary ex
1dab0 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c  pressions, we al
1dac0 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69  lowed some combi
1dad0 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e  ning of LIMIT an
1dae0 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
1daf0 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64  cause they could
1db00 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20   be computed at 
1db10 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42  compile-time.  B
1db20 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  ut when LIMIT an
1db30 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
1db40 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65  came arbitrary e
1db50 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77  xpressions, we w
1db60 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64  ere forced to ad
1db70 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  d restrictions (
1db80 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34  13).  ** and (14
1db90 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ). */.  if( pSub
1dba0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
1dbb0 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
1dbc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1dbd0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1dbe0 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  3) */.  if( pSub
1dbf0 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75  ->pOffset ) retu
1dc00 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dc20 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1dc30 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  4) */.  if( (p->
1dc40 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
1dc50 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53  mpound)!=0 && pS
1dc60 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
1dc70 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1dcb0 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20  ction (15) */.  
1dcc0 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  }.  if( pSubSrc-
1dcd0 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
1dce0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1dcf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1dd00 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a  striction (7)  *
1dd10 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  /.  if( pSub->se
1dd20 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1dd30 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
1dd40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1dd50 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a  striction (5)  *
1dd60 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1dd70 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e  imit && (pSrc->n
1dd80 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
1dd90 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1dda0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1ddb0 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29  trictions (8)(9)
1ddc0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
1ddd0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1dde0 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20  Distinct)!=0 && 
1ddf0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1de00 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1de10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1de20 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20  iction (6)  */. 
1de30 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
1de40 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
1de50 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
1de60 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dea0 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
1deb0 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
1dec0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
1ded0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1dee0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1def0 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20  ction (16) */.  
1df00 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1df10 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20   && p->pWhere ) 
1df20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1df30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1df40 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20  ction (19) */.  
1df50 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1df60 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
1df70 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
1df80 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  =0 ){.     retur
1df90 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
1dfa0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29  Restriction (21)
1dfb0 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   */.  }.  testca
1dfc0 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  se( pSub->selFla
1dfd0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
1dfe0 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  e );.  testcase(
1dff0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1e000 26 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29  & SF_MinMaxAgg )
1e010 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  ;.  if( pSub->se
1e020 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63  lFlags & (SF_Rec
1e030 75 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78  ursive|SF_MinMax
1e040 41 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Agg) ){.    retu
1e050 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
1e060 74 69 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28  tions (22) and (
1e070 32 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  24) */.  }.  if(
1e080 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1e090 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26  SF_Recursive) &&
1e0a0 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b   pSub->pPrior ){
1e0b0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
1e0c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
1e0d0 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  3) */.  }..  /* 
1e0e0 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
1e0f0 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63   1:.  ** Restric
1e100 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
1e110 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
1e120 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
1e130 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
1e140 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
1e150 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1e160 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
1e170 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
1e180 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
1e190 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1e1a0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1e1b0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1e1c0 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
1e1d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1e1e0 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1e1f0 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1e200 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1e210 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1e220 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
1e230 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
1e240 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
1e250 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
1e260 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c  .  **.  ** OBSOL
1e270 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20  ETE COMMENT 2:. 
1e280 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
1e290 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
1e2a0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1e2b0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
1e2c0 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
1e2d0 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
1e2e0 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1e2f0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
1e300 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
1e310 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
1e320 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
1e330 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1e340 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1e350 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
1e360 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
1e370 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
1e380 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
1e390 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
1e3a0 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
1e3b0 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
1e3c0 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
1e3d0 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
1e3e0 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
1e3f0 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
1e400 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
1e410 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
1e420 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
1e430 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
1e440 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
1e450 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
1e460 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20  .  **.  ** THIS 
1e470 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45  OVERRIDES OBSOLE
1e480 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e  TE COMMENTS 1 AN
1e490 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20  D 2 ABOVE:.  ** 
1e4a0 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f  Ticket #3300 sho
1e4b0 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69  ws that flatteni
1e4c0 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ng the right ter
1e4d0 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
1e4e0 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74  .  ** is fraught
1e4f0 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42   with danger.  B
1e500 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65  est to avoid the
1e510 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49   whole thing.  I
1e520 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  f the.  ** subqu
1e530 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1e540 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
1e550 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  JOIN, then do no
1e560 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a  t flatten..  */.
1e570 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
1e580 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
1e590 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
1e5a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1e5b0 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
1e5c0 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75  on 17: If the su
1e5d0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1e5e0 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68  pound SELECT, th
1e5f0 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20  en it must.  ** 
1e600 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49  use only the UNI
1e610 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e  ON ALL operator.
1e620 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   And none of the
1e630 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71   simple select q
1e640 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74  ueries.  ** that
1e650 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d   make up the com
1e660 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65  pound SELECT are
1e670 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61   allowed to be a
1e680 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74  ggregate or dist
1e690 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65  inct.  ** querie
1e6a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
1e6b0 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1e6c0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
1e6d0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65  erBy ){.      re
1e6e0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74  turn 0;  /* Rest
1e6f0 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20  riction 20 */.  
1e700 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67    }.    if( isAg
1e710 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67  g || (p->selFlag
1e720 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1e730 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72  !=0 || pSrc->nSr
1e740 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=1 ){.      re
1e750 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1e760 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62    for(pSub1=pSub
1e770 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70  ; pSub1; pSub1=p
1e780 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Sub1->pPrior){. 
1e790 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1e7a0 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1e7b0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1e7c0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1e7d0 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
1e7e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
1e7f0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1e800 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1e810 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
1e820 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
1e830 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1e840 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20  ->pSrc!=0 );.   
1e850 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
1e860 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
1e870 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pSub1->pEList->n
1e880 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66  Expr );.      if
1e890 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1e8a0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1e8b0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1e8c0 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  !=0.       || (p
1e8d0 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
1e8e0 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
1e8f0 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  L) .       || pS
1e900 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
1e910 31 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  1.      ){.     
1e920 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1e930 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
1e940 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63  ase( pSub1->pSrc
1e950 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20  ->nSrc>1 );.    
1e960 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
1e970 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20  ction 18. */.   
1e980 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1e990 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
1e9a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
1e9b0 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  ; ii<p->pOrderBy
1e9c0 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
1e9d0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
1e9e0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75  OrderBy->a[ii].u
1e9f0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
1ea00 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1ea10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ea20 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20  .  /***** If we 
1ea30 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
1ea40 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  , flattening is 
1ea50 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a  permitted. *****
1ea60 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  /.  SELECTTRACE(
1ea70 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61  1,pParse,p,("fla
1ea80 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20  tten %s.%p from 
1ea90 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  term %d\n",.    
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1eab0 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70  Sub->zSelName, p
1eac0 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20  Sub, iFrom));.. 
1ead0 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68   /* Authorize th
1eae0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1eaf0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1eb00 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  text = pSubitem-
1eb10 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e  >zName;.  TESTON
1eb20 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41  LY(i =) sqlite3A
1eb30 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1eb40 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
1eb50 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74  0, 0, 0);.  test
1eb60 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f  case( i==SQLITE_
1eb70 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65  DENY );.  pParse
1eb80 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1eb90 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
1eba0 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  xt;..  /* If the
1ebb0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1ebc0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
1ebd0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
1ebe0 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73  (by restrictions
1ebf0 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20  .  ** 17 and 18 
1ec00 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62  above) it must b
1ec10 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e  e a UNION ALL an
1ec20 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  d the parent que
1ec30 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65  ry must .  ** be
1ec40 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
1ec50 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
1ec60 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46  CT <expr-list> F
1ec70 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e  ROM (<sub-query>
1ec80 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e  ) <where-clause>
1ec90 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c   .  **.  ** foll
1eca0 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45  owed by any ORDE
1ecb0 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f  R BY, LIMIT and/
1ecc0 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  or OFFSET clause
1ecd0 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20  s. This block.  
1ece0 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63  ** creates N-1 c
1ecf0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
1ed00 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75  ent query withou
1ed10 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  t any ORDER BY, 
1ed20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f  LIMIT or .  ** O
1ed30 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e  FFSET clauses an
1ed40 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20  d joins them to 
1ed50 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69  the left-hand-si
1ed60 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  de of the origin
1ed70 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e  al.  ** using UN
1ed80 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1ed90 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
1eda0 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
1edb0 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73  of simple.  ** s
1edc0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
1edd0 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
1ede0 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a   sub-query..  **
1edf0 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20  .  ** Example:. 
1ee00 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1ee10 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20  ECT a+1 FROM (. 
1ee20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1ee30 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T x FROM tab.  *
1ee40 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
1ee50 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
1ee60 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62  ELECT y FROM tab
1ee70 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
1ee80 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1ee90 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
1eea0 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a  2) FROM tab2.  *
1eeb0 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21  *     ) WHERE a!
1eec0 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  =5 ORDER BY 1.  
1eed0 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72  **.  ** Transfor
1eee0 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  med into:.  **. 
1eef0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
1ef00 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1ef10 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E x+1!=5.  **   
1ef20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1ef30 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20       SELECT y+1 
1ef40 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79  FROM tab WHERE y
1ef50 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
1ef60 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1ef70 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
1ef80 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48  )+1 FROM tab2 WH
1ef90 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d  ERE abs(z*2)+1!=
1efa0 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52  5.  **     ORDER
1efb0 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
1efc0 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65  We call this the
1efd0 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75   "compound-subqu
1efe0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e  ery flattening".
1eff0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62  .  */.  for(pSub
1f000 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70  =pSub->pPrior; p
1f010 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e  Sub; pSub=pSub->
1f020 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
1f030 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45  ect *pNew;.    E
1f040 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1f050 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1f060 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  .    Expr *pLimi
1f070 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
1f080 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74     Expr *pOffset
1f090 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
1f0a0 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
1f0b0 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
1f0c0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1f0d0 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   0;.    p->pSrc 
1f0e0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  = 0;.    p->pPri
1f0f0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  or = 0;.    p->p
1f100 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
1f110 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
1f120 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1f130 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
1f140 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1f150 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
1f160 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e  New, pSub->zSelN
1f170 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66  ame);.    p->pOf
1f180 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
1f190 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
1f1a0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70  pLimit;.    p->p
1f1b0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1f1c0 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  By;.    p->pSrc 
1f1d0 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f  = pSrc;.    p->o
1f1e0 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20  p = TK_ALL;.    
1f1f0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1f200 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
1f210 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c   pPrior;.    }el
1f220 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
1f230 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1f240 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
1f250 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  r ) pPrior->pNex
1f260 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  t = pNew;.      
1f270 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pNew->pNext = p;
1f280 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
1f290 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53   = pNew;.      S
1f2a0 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50 61  ELECTTRACE(2,pPa
1f2b0 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20  rse,p,.         
1f2c0 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  ("compound-subqu
1f2d0 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63 72  ery flattener cr
1f2e0 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20 70  eates %s.%p as p
1f2f0 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  eer\n",.        
1f300 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c   pNew->zSelName,
1f310 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20   pNew));.    }. 
1f320 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1f330 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1f340 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
1f350 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
1f360 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
1f370 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
1f380 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
1f390 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1f3a0 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
1f3b0 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
1f3c0 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
1f3d0 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
1f3e0 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
1f3f0 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
1f400 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
1f410 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
1f420 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1f430 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1f440 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1f450 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1f460 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
1f470 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1f480 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
1f490 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
1f4a0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
1f4b0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
1f4c0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
1f4d0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
1f4e0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
1f4f0 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
1f500 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
1f510 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
1f520 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
1f530 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
1f540 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
1f550 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
1f560 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
1f570 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
1f580 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
1f590 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
1f5a0 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
1f5b0 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
1f5c0 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
1f5d0 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
1f5e0 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
1f5f0 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
1f600 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
1f610 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
1f620 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
1f630 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
1f640 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
1f650 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
1f660 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
1f670 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
1f680 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1f690 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
1f6a0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1f6b0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1f6c0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1f6d0 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
1f6e0 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
1f6f0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1f700 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
1f710 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
1f720 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
1f730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
1f740 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b  abToDel->nRef--;
1f750 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
1f760 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
1f770 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1f780 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
1f790 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1f7a0 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
1f7b0 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
1f7c0 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
1f7d0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
1f7e0 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
1f7f0 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
1f800 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
1f810 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
1f820 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
1f830 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
1f840 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
1f850 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
1f860 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
1f870 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
1f880 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
1f890 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
1f8a0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
1f8b0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1f8c0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
1f8d0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1f8e0 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
1f8f0 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
1f900 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
1f910 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
1f920 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
1f930 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
1f940 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
1f950 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
1f960 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
1f970 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
1f980 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
1f990 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
1f9a0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
1f9b0 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
1f9c0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
1f9d0 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
1f9e0 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
1f9f0 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
1fa00 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
1fa10 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
1fa20 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
1fa30 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
1fa40 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
1fa50 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
1fa60 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
1fa70 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
1fa80 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
1fa90 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
1faa0 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
1fab0 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
1fac0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1fad0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
1fae0 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
1faf0 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
1fb00 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
1fb10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
1fb20 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
1fb30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1fb40 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
1fb50 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
1fb60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1fb70 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fb80 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
1fb90 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1fba0 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
1fbb0 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
1fbc0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1fbd0 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
1fbe0 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67  e = pSubitem->fg
1fbf0 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
1fc00 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1fc10 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1fc20 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1fc30 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1fc40 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1fc50 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1fc60 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1fc70 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1fc80 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1fc90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1fca0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1fcb0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1fcc0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1fcd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1fce0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1fcf0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1fd00 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1fd10 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1fd20 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1fd30 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1fd40 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1fd50 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1fd60 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1fd70 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1fd80 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1fd90 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fda0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1fdb0 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1fdc0 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1fdd0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1fde0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1fdf0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1fe00 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1fe10 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1fe20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1fe30 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1fe40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1fe50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1fe60 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1fe70 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1fe80 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1fe90 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1fea0 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1feb0 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1fec0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1fed0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1fee0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1fef0 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1ff00 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  er query FROM cl
1ff10 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e  ause to 4 slots.
1ff20 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64  .    ** The midd
1ff30 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  le slot is expan
1ff40 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
1ff50 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
1ff60 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66  e space.    ** f
1ff70 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65  or the two eleme
1ff80 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
1ff90 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1ffa0 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
1ffb0 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
1ffc0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1ffd0 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
1ffe0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1fff0 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
20000 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
20010 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
20020 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
20030 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
20040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20050 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
20060 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
20070 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
20080 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
20090 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
200a0 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
200b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
200c0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
200d0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
200e0 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
200f0 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
20100 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20110 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
20120 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ].fg.isTabFunc==
20130 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  0 );.      pSrc-
20140 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
20150 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
20160 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
20170 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
20180 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
20190 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
201a0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67  Src->a[iFrom].fg
201b0 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e  .jointype = join
201c0 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  type;.  .    /* 
201d0 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69  Now begin substi
201e0 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20  tuting subquery 
201f0 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65  result set expre
20200 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20  ssions for .    
20210 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
20220 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
20230 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
20240 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
20250 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
20260 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
20270 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28  a+5, b*10 FROM (
20280 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c  SELECT x*3 AS a,
20290 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20   y+10 AS b FROM 
202a0 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20  t1) WHERE a>b;. 
202b0 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20     **   \       
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
202d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62  ____________ sub
202e0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
202f0 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20  /          /.   
20300 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
20310 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
20320 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
20330 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20340 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a  ________/.    **
20350 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  .    ** We look 
20360 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
20370 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
20380 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
20390 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
203a0 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73    ** "a" we subs
203b0 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64  titute "x*3" and
203c0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
203d0 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74  see "b" we subst
203e0 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20  itute "y+10"..  
203f0 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d    */.    pList =
20400 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74   pParent->pEList
20410 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
20420 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
20430 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
20440 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
20450 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
20460 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c  har *zName = sql
20470 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
20480 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70   pList->a[i].zSp
20490 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  an);.        sql
204a0 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
204b0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  e);.        pLis
204c0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
204d0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
204e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
204f0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
20500 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
20510 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a  point, any non-z
20520 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20  ero iOrderByCol 
20530 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20  values indicate 
20540 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
20550 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d  * ORDER BY colum
20560 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
20570 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65  identical to the
20580 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a   iOrderByCol'th.
20590 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
205a0 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  ion returned by 
205b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
205c0 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65   pSub. Since the
205d0 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20  se values.      
205e0 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73  ** do not necess
205f0 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64  arily correspond
20600 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53   to columns in S
20610 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
20620 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a  pParent,.      *
20630 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f  * zero them befo
20640 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74  re transfering t
20650 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
20660 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
20670 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20     ** Not doing 
20680 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20 61  this may cause a
20690 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75 62  n error if a sub
206a0 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
206b0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75  this.      ** fu
206c0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
206d0 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d  to flatten a com
206e0 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20  pound sub-query 
206f0 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20  into pParent.   
20700 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20     ** (the only 
20710 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
20720 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f  pen is if the co
20730 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
20740 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72   is.      ** cur
20750 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70  rently part of p
20760 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20  Sub->pSrc). See 
20770 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30  ticket [d11a6e90
20780 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45  8f].  */.      E
20790 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
207a0 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
207b0 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  By;.      for(i=
207c0 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
207d0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
207e0 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
207f0 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
20800 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ol = 0;.      }.
20810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20820 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d  arent->pOrderBy=
20830 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
20840 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  rt( pSub->pPrior
20850 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
20860 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rent->pOrderBy =
20870 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
20880 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
20890 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
208a0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
208b0 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
208c0 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  >pWhere, 0);.   
208d0 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
208e0 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
208f0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
20900 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
20910 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
20920 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
20930 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
20940 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
20950 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
20960 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
20970 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
20980 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
20990 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
209c0 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
209d0 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
209e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
209f0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
20a00 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
20a10 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
20a20 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
20a30 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
20a40 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
20a50 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
20a60 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
20a70 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
20a80 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70  arent->pWhere, p
20a90 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Where);.    }.  
20aa0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
20ab0 2c 20 70 50 61 72 65 6e 74 2c 20 69 50 61 72 65  , pParent, iPare
20ac0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
20ad0 2c 20 30 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  , 0);.  .    /* 
20ae0 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
20af0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
20b00 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
20b10 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ner or the.    *
20b20 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
20b30 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20   distinct. .    
20b40 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  */.    pParent->
20b50 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62  selFlags |= pSub
20b60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
20b70 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20  Distinct;.  .   
20b80 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43   /*.    ** SELEC
20b90 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
20ba0 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
20bb0 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
20bc0 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a   OFFSET y;.    *
20bd0 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20  *.    ** One is 
20be0 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74  tempted to try t
20bf0 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f  o add a and b to
20c00 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d   combine the lim
20c10 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20  its.  But this. 
20c20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77     ** does not w
20c30 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69  ork if either li
20c40 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
20c50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20c60 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
20c70 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20c80 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
20c90 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62  imit;.      pSub
20ca0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
20cb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
20cc0 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
20cd0 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
20ce0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
20cf0 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
20d00 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
20d10 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
20d20 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66  db, pSub1);..#if
20d30 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
20d40 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
20d50 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
20d60 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x100 ){.    SEL
20d70 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
20d80 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
20d90 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29  flattening:\n"))
20da0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
20db0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
20dc0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
20dd0 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
20de0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
20df0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
20e00 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
20e10 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
20e20 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66  _VIEW) */....#if
20e30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
20e40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
20e50 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
20e60 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
20e70 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  .** Make copies 
20e80 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52  of relevant WHER
20e90 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
20ea0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
20eb0 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48  y into.** the WH
20ec0 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ERE clause of su
20ed0 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65  bquery.  Example
20ee0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
20ef0 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
20f00 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
20f10 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  y FROM t1) WHERE
20f20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a   x=5 AND y=10;.*
20f30 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64  *.** Transformed
20f40 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   into:.**.**    
20f50 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
20f60 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d  ELECT a AS x, c-
20f70 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57  d AS y FROM t1 W
20f80 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64  HERE a=5 AND c-d
20f90 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52  =10).**     WHER
20fa0 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
20fb0 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69  **.** The hope i
20fc0 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  s that the terms
20fd0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
20fe0 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d  ner query will m
20ff0 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65  ake it more.** e
21000 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
21010 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
21020 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
21030 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29   if:.**.**   (1)
21040 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
21050 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
21060 2e 20 20 28 49 6e 20 74 68 61 74 20 63 61 73 65  .  (In that case
21070 2c 20 77 65 27 64 20 72 65 61 6c 6c 79 20 77 61  , we'd really wa
21080 6e 74 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 63  nt.**       to c
21090 6f 70 79 20 74 68 65 20 6f 75 74 65 72 20 57 48  opy the outer WH
210a0 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE-clause terms
210b0 20 6f 6e 74 6f 20 74 68 65 20 48 41 56 49 4e 47   onto the HAVING
210c0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 0a 2a   clause of the.*
210d0 2a 20 20 20 20 20 20 20 69 6e 6e 65 72 20 71 75  *       inner qu
210e0 65 72 79 2e 20 20 42 75 74 20 74 68 65 79 20 70  ery.  But they p
210f0 72 6f 62 61 62 6c 79 20 77 6f 6e 27 74 20 68 65  robably won't he
21100 6c 70 20 74 68 65 72 65 20 73 6f 20 64 6f 20 6e  lp there so do n
21110 6f 74 20 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a  ot bother.).**.*
21120 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65  *   (2) The inne
21130 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
21140 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66  ecursive part of
21150 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20   a common table 
21160 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
21170 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65  *   (3) The inne
21180 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49  r query has a LI
21190 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63  MIT clause (sinc
211a0 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  e the changes to
211b0 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20   the WHERE.**   
211c0 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20      close would 
211d0 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69  change the meani
211e0 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29  ng of the LIMIT)
211f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68  ..**.**   (4) Th
21200 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
21210 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
21220 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
21230 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c 65 72 0a  N.  (The caller.
21240 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f 72 63 65  **       enforce
21250 73 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  s this restricti
21260 6f 6e 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f  on since this ro
21270 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68  utine does not h
21280 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20  ave enough.**   
21290 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20      information 
212a0 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20  to know.).**.** 
212b0 20 20 28 35 29 20 54 68 65 20 57 48 45 52 45 20    (5) The WHERE 
212c0 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
212d0 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20  n originates in 
212e0 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
212f0 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
21300 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  of a LEFT JOIN..
21310 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  **.** Return 0 i
21320 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  f no changes are
21330 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65   made and non-ze
21340 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ro if one or mor
21350 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
21360 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c  * terms are dupl
21370 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20  icated into the 
21380 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
21390 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e  tic int pushDown
213a0 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20 73 71  WhereTerms(.  sq
213b0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
213c0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
213d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28  ase connection (
213e0 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f  for malloc()) */
213f0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
21400 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
21410 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20 57  subquery whose W
21420 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
21430 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a  o be augmented *
21440 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
21450 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
21460 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
21470 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
21480 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f   */.  int iCurso
21490 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  r           /* C
214a0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
214b0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
214c0 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
214d0 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30  .  int nChng = 0
214e0 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d  ;.  if( pWhere==
214f0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
21500 69 66 28 20 28 70 53 75 62 71 2d 3e 73 65 6c 46  if( (pSubq->selF
21510 6c 61 67 73 20 26 20 28 53 46 5f 41 67 67 72 65  lags & (SF_Aggre
21520 67 61 74 65 7c 53 46 5f 52 65 63 75 72 73 69 76  gate|SF_Recursiv
21530 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  e))!=0 ){.     r
21540 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
21550 72 69 63 74 69 6f 6e 73 20 28 31 29 20 61 6e 64  rictions (1) and
21560 20 28 32 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (2) */.  }.  if
21570 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21  ( pSubq->pLimit!
21580 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  =0 ){.     retur
21590 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
215a0 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20  ion (3) */.  }. 
215b0 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
215c0 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
215d0 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44    nChng += pushD
215e0 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 64 62  ownWhereTerms(db
215f0 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d  , pSubq, pWhere-
21600 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73 6f 72  >pRight, iCursor
21610 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
21620 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20  pWhere->pLeft;. 
21630 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
21640 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
21650 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72  EP_FromJoin) ) r
21660 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
21670 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a 20 20 69  riction 5 */.  i
21680 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
21690 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57  TableConstant(pW
216a0 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29  here, iCursor) )
216b0 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20  {.    nChng++;. 
216c0 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20     while( pSubq 
216d0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
216e0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
216f0 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  b, pWhere, 0);. 
21700 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73       pNew = subs
21710 74 45 78 70 72 28 64 62 2c 20 70 4e 65 77 2c 20  tExpr(db, pNew, 
21720 69 43 75 72 73 6f 72 2c 20 70 53 75 62 71 2d 3e  iCursor, pSubq->
21730 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
21740 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73  Subq->pWhere = s
21750 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
21760 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c  , pSubq->pWhere,
21770 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 53   pNew);.      pS
21780 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50 72  ubq = pSubq->pPr
21790 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ior;.    }.  }. 
217a0 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d   return nChng;.}
217b0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
217c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
217d0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
217e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
217f0 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a  T_VIEW) */../*.*
21800 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63  * Based on the c
21810 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41  ontents of the A
21820 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
21830 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
21840 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
21850 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ent, this functi
21860 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  on checks if the
21870 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
21880 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  rue:.**.**    * 
21890 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69  the query contai
218a0 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  ns just a single
218b0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
218c0 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65  ion,.**    * the
218d0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
218e0 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69  ion is either mi
218f0 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e  n() or max(), an
21900 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72  d.**    * the ar
21910 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67  gument to the ag
21920 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
21930 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
21940 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c  ue..**.** If all
21950 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
21960 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45  e true, then WHE
21970 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
21980 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
21990 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MAX.** is return
219a0 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ed as appropriat
219b0 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d  e. Also, *ppMinM
219c0 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ax is set to poi
219d0 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69  nt to the .** li
219e0 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  st of arguments 
219f0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61 67  passed to the ag
21a00 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20 72  gregate before r
21a10 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
21a20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69  Or, if the condi
21a30 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20  tions above are 
21a40 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d  not met, *ppMinM
21a50 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ax is set to 0 a
21a60 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45  nd.** WHERE_ORDE
21a70 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65  RBY_NORMAL is re
21a80 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
21a90 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79  c u8 minMaxQuery
21aa0 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e  (AggInfo *pAggIn
21ab0 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  fo, ExprList **p
21ac0 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  pMinMax){.  int 
21ad0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
21ae0 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20  ERBY_NORMAL;    
21af0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
21b00 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d  value */..  *ppM
21b10 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28  inMax = 0;.  if(
21b20 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
21b30 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ==1 ){.    Expr 
21b40 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66  *pExpr = pAggInf
21b50 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70  o->aFunc[0].pExp
21b60 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20  r; /* Aggregate 
21b70 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
21b80 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
21b90 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
21ba0 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  t;      /* Argum
21bb0 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63  ents to agg func
21bc0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73  tion */..    ass
21bd0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
21be0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
21bf0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  );.    if( pELis
21c00 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
21c10 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d  pr==1 && pEList-
21c20 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  >a[0].pExpr->op=
21c30 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
21c40 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
21c50 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70  ar *zFunc = pExp
21c60 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
21c70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
21c80 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69  rICmp(zFunc, "mi
21c90 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
21ca0 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
21cb0 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20  RDERBY_MIN;.    
21cc0 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20      *ppMinMax = 
21cd0 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65  pEList;.      }e
21ce0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
21cf0 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
21d00 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ax")==0 ){.     
21d10 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
21d20 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20  ORDERBY_MAX;.   
21d30 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
21d40 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
21d50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
21d60 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d  sert( *ppMinMax=
21d70 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78  =0 || (*ppMinMax
21d80 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  )->nExpr==1 );. 
21d90 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a   return eRet;.}.
21da0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
21db0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
21dc0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
21dd0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
21de0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
21df0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
21e00 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  gument is the as
21e10 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
21e20 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
21e30 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
21e40 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
21e50 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
21e60 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
21e70 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
21e80 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
21e90 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
21ea0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
21eb0 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
21ec0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
21ed0 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
21ee0 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
21ef0 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
21f00 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
21f10 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
21f20 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
21f30 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
21f40 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
21f50 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
21f60 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
21f70 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
21f80 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
21f90 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
21fa0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
21fb0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
21fc0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
21fd0 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
21fe0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
21ff0 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
22000 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
22010 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
22020 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
22030 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
22040 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
22050 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
22060 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
22070 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
22080 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
22090 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
220a0 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
220b0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
220c0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
220d0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
220e0 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
220f0 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
22100 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
22110 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
22120 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
22130 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
22140 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
22150 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
22160 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
22170 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
22180 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
22190 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
221a0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
221b0 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
221c0 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
221d0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
221e0 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
221f0 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
22200 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
22210 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
22220 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
22230 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
22240 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
22250 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
22260 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
22270 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
22280 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
22290 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
222a0 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
222b0 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
222c0 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
222d0 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
222e0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
222f0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
22300 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
22310 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
22320 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
22330 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
22340 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66  pTab && pFrom->f
22350 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b  g.isIndexedBy ){
22360 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
22370 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
22380 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
22390 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31  edBy = pFrom->u1
223a0 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20  .zIndexedBy;.   
223b0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
223c0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
223d0 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20  >pIndex; .      
223e0 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65    pIdx && sqlite
223f0 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a  3StrICmp(pIdx->z
22400 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79  Name, zIndexedBy
22410 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
22420 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
22430 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
22440 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
22450 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
22460 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
22470 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64  x: %s", zIndexed
22480 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  By, 0);.      pP
22490 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
224a0 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
224b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
224c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
224d0 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49  m->pIBIndex = pI
224e0 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
224f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
22500 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f  .** Detect compo
22510 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
22520 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61  ments that use a
22530 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
22540 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c  e with .** an al
22550 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
22560 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
22570 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e  .**    SELECT ..
22580 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
22590 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
225a0 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20   t2 ORDER BY .. 
225b0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
225c0 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72  * These are rewr
225d0 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75  itten as a subqu
225e0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ery:.**.**    SE
225f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
22600 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
22610 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
22620 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20  . FROM t2).**   
22630 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43    ORDER BY ... C
22640 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
22650 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
22660 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
22670 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75  y because the mu
22680 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
22690 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62  () routine.** ab
226a0 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74  ove that generat
226b0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
226c0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
226d0 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
226e0 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65  BY clause.** use
226f0 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  s a merge algori
22700 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65  thm that require
22710 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
22720 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e  ting sequence on
22730 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
22740 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65  olumns as on the
22750 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
22760 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a  .  See ticket.**
22770 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
22780 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
22790 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a  6709574d2a.**.**
227a0 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
227b0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65  tion is only nee
227c0 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20  ded for EXCEPT, 
227d0 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55  INTERSECT, and U
227e0 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49  NION..** The UNI
227f0 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
22800 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20  works fine with 
22810 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
22820 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a  By() even when.*
22830 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c  * there are COLL
22840 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ATE terms in the
22850 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74   ORDER BY..*/.st
22860 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74  atic int convert
22870 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
22880 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20  Subquery(Walker 
22890 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
228a0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
228b0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
228c0 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73   Select *pX;.  s
228d0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
228e0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
228f0 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74  em *a;.  SrcList
22900 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72   *pNewSrc;.  Par
22910 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f  se *pParse;.  To
22920 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66  ken dummy;..  if
22930 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
22940 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
22950 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  inue;.  if( p->p
22960 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
22970 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
22980 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58  ;.  for(pX=p; pX
22990 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   && (pX->op==TK_
229a0 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  ALL || pX->op==T
229b0 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58  K_SELECT); pX=pX
229c0 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66  ->pPrior){}.  if
229d0 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pX==0 ) return
229e0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
229f0 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79   a = p->pOrderBy
22a00 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  ->a;.  for(i=p->
22a10 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d  pOrderBy->nExpr-
22a20 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
22a30 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70     if( a[i].pExp
22a40 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  r->flags & EP_Co
22a50 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  llate ) break;. 
22a60 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72   }.  if( i<0 ) r
22a70 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
22a80 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ue;..  /* If we 
22a90 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
22aa0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
22ab0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
22ac0 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
22ad0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
22ae0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
22af0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
22b00 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
22b10 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
22b20 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
22b30 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
22b40 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
22b50 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  rt;.  memset(&du
22b60 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  mmy, 0, sizeof(d
22b70 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72  ummy));.  pNewSr
22b80 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
22b90 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
22ba0 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64  (pParse,0,0,0,&d
22bb0 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a  ummy,pNew,0,0);.
22bc0 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30    if( pNewSrc==0
22bd0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
22be0 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a  ort;.  *pNew = *
22bf0 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  p;.  p->pSrc = p
22c00 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c  NewSrc;.  p->pEL
22c10 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
22c20 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
22c30 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
22c40 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49  pr(db, TK_ASTERI
22c50 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70  SK, 0));.  p->op
22c60 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
22c70 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20  p->pWhere = 0;. 
22c80 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
22c90 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  = 0;.  pNew->pHa
22ca0 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ving = 0;.  pNew
22cb0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
22cc0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
22cd0 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  .  p->pNext = 0;
22ce0 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b  .  p->pWith = 0;
22cf0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
22d00 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
22d10 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
22d20 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76  lFlags & SF_Conv
22d30 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70  erted)==0 );.  p
22d40 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
22d50 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73  _Converted;.  as
22d60 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69  sert( pNew->pPri
22d70 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  or!=0 );.  pNew-
22d80 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d  >pPrior->pNext =
22d90 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70   pNew;.  pNew->p
22da0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65  Limit = 0;.  pNe
22db0 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  w->pOffset = 0;.
22dc0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
22dd0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
22de0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
22df0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
22e00 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74  term pFrom has t
22e10 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
22e20 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  tion.** argument
22e30 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20  s.  If it does, 
22e40 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
22e50 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
22e60 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
22e70 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70  on-zero, since p
22e80 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  From is not allo
22e90 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c  wed to be a tabl
22ea0 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f  e-valued functio
22eb0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
22ec0 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
22ed0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
22ee0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
22ef0 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
22f00 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
22f10 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73  TabFunc ){.    s
22f20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
22f30 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20  Parse, "'%s' is 
22f40 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c  not a function",
22f50 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pFrom->zName);.
22f60 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22f70 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
22f80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22f90 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
22fa0 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
22fb0 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
22fc0 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
22fd0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
22fe0 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
22ff0 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
23000 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
23010 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
23020 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
23030 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
23040 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
23050 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
23060 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
23070 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
23080 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
23090 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
230a0 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
230b0 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
230c0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
230d0 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
230e0 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
230f0 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
23100 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
23110 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
23120 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
23130 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
23140 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
23150 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
23160 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
23170 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
23180 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
23190 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54  nt innermost WIT
231a0 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
231b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
231c0 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
231d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
231e0 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
231f0 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
23200 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
23210 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
23220 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
23230 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
23240 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
23250 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
23260 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
23270 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
23280 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
23290 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
232a0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
232b0 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
232c0 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
232d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
232e0 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
232f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
23300 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
23310 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
23320 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
23330 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
23340 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
23350 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
23360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23370 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23380 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
23390 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
233a0 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
233b0 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
233c0 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
233d0 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
233e0 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
233f0 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
23400 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
23410 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
23420 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
23430 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
23440 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23450 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
23460 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
23470 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
23480 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
23490 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
234a0 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
234b0 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
234c0 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
234d0 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
234e0 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
234f0 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
23500 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
23510 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
23520 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
23530 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
23540 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
23550 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
23560 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
23570 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
23580 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
23590 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
235a0 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
235b0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
235c0 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
235d0 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28  t( bFree==0 || (
235e0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30  pParse->pWith==0
235f0 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74   && pParse->pWit
23600 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20  hToFree==0) );. 
23610 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
23620 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
23630 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29  ->pWith!=pWith )
23640 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  ;.    pWith->pOu
23650 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
23660 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
23670 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
23680 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
23690 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
236a0 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  ree = pWith;.  }
236b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
236c0 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
236d0 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
236e0 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
236f0 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
23700 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
23710 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
23720 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
23730 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
23740 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
23750 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
23760 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
23770 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
23780 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
23790 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
237a0 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
237b0 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
237c0 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
237d0 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
237e0 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
237f0 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
23800 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
23810 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
23820 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
23830 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
23840 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
23850 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
23860 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
23870 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
23880 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
23890 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
238a0 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
238b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
238c0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
238d0 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
238e0 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
238f0 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
23900 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
23910 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
23920 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
23930 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
23940 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
23950 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
23960 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
23970 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
23980 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
23990 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
239a0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
239b0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
239c0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
239d0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
239e0 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
239f0 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
23a00 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
23a10 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
23a20 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
23a30 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a50 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
23a60 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
23a70 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
23a80 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
23a90 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
23aa0 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
23ab0 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
23ac0 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
23ad0 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
23ae0 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
23af0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
23b00 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
23b10 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23b30 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
23b40 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
23b50 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
23b60 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
23b70 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
23b80 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
23b90 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
23ba0 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
23bb0 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
23bc0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
23bd0 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
23be0 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
23bf0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
23c00 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68  s non-NULL at th
23c10 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
23c20 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61  his is an illega
23c30 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  l.    ** recursi
23c40 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ve reference to 
23c50 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20  CTE pCte. Leave 
23c60 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
23c70 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  se and return.  
23c80 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70    ** early. If p
23c90 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
23ca0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
23cb0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
23cc0 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20  ve reference..  
23cd0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
23ce0 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a  e, proceed.  */.
23cf0 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43      if( pCte->zC
23d00 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  teErr ){.      s
23d10 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
23d20 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74  Parse, pCte->zCt
23d30 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  eErr, pCte->zNam
23d40 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
23d50 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
23d60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e     }.    if( can
23d70 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
23d80 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72  arse, pFrom) ) r
23d90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
23da0 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  OR;..    assert(
23db0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
23dc0 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  );.    pFrom->pT
23dd0 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
23de0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
23df0 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
23e00 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
23e10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23e20 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62  _Abort;.    pTab
23e30 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
23e40 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
23e50 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
23e60 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
23e70 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
23e80 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e  = -1;.    pTab->
23e90 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
23ea0 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
23eb0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
23ec0 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61  8576) );.    pTa
23ed0 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
23ee0 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46  F_Ephemeral | TF
23ef0 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b  _NoVisibleRowid;
23f00 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  .    pFrom->pSel
23f10 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
23f20 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d  ectDup(db, pCte-
23f30 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
23f40 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
23f50 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
23f60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23f70 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
23f80 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20  >pSelect );..   
23f90 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
23fa0 73 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  s is a recursive
23fb0 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65   CTE. */.    pSe
23fc0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
23fd0 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75  ct;.    bMayRecu
23fe0 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e  rsive = ( pSel->
23ff0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53  op==TK_ALL || pS
24000 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e  el->op==TK_UNION
24010 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79   );.    if( bMay
24020 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
24030 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
24040 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
24050 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pFrom->pSelect->
24060 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
24070 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
24080 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
24090 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
240a0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
240b0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
240c0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44     if( pItem->zD
240d0 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20  atabase==0 .    
240e0 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a       && pItem->z
240f0 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20  Name!=0 .       
24100 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
24110 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e  trICmp(pItem->zN
24120 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  ame, pCte->zName
24130 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
24140 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
24150 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
24160 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67         pItem->fg
24170 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31  .isRecursive = 1
24180 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  ;.          pTab
24190 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
241a0 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
241b0 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69  gs |= SF_Recursi
241c0 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ve;.        }.  
241d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
241e0 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63   /* Only one rec
241f0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
24200 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
24210 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  / .    if( pTab-
24220 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20  >nRef>2 ){.     
24230 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
24240 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  (.          pPar
24250 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  se, "multiple re
24260 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75  ferences to recu
24270 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22  rsive table: %s"
24280 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20  , pCte->zName.  
24290 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74      );.      ret
242a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
242b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
242c0 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d  rt( pTab->nRef==
242d0 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c  1 || ((pSel->sel
242e0 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69  Flags&SF_Recursi
242f0 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52 65  ve) && pTab->nRe
24300 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43  f==2 ));..    pC
24310 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63  te->zCteErr = "c
24320 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
24330 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76  e: %s";.    pSav
24340 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d  edWith = pParse-
24350 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
24360 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
24370 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  h;.    sqlite3Wa
24380 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
24390 2c 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  , bMayRecursive 
243a0 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a  ? pSel->pPrior :
243b0 20 70 53 65 6c 29 3b 0a 20 20 20 20 70 50 61 72   pSel);.    pPar
243c0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
243d0 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66  h;..    for(pLef
243e0 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70  t=pSel; pLeft->p
243f0 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65  Prior; pLeft=pLe
24400 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20  ft->pPrior);.   
24410 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d   pEList = pLeft-
24420 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  >pEList;.    if(
24430 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a   pCte->pCols ){.
24440 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
24450 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
24460 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r!=pCte->pCols->
24470 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
24480 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
24490 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
244a0 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73  %s has %d values
244b0 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
244c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
244d0 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
244e0 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
244f0 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
24500 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
24510 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
24520 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20  pSavedWith;.    
24530 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24540 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
24550 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
24560 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
24570 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43   }..    sqlite3C
24580 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
24590 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
245a0 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
245b0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
245c0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
245d0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ive ){.      if(
245e0 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
245f0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
24600 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
24610 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69  zCteErr = "multi
24620 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65  ple recursive re
24630 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20  ferences: %s";. 
24640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24650 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
24660 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72  r = "recursive r
24670 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75  eference in a su
24680 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20  bquery: %s";.   
24690 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
246a0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
246b0 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
246c0 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74   }.    pCte->zCt
246d0 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  eErr = 0;.    pP
246e0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
246f0 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20  avedWith;.  }.. 
24700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24710 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
24720 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24730 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  _CTE./*.** If th
24740 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20  e SELECT passed 
24750 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
24760 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73  gument has an as
24770 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a  sociated WITH .*
24780 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74  * clause, pop it
24790 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
247a0 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
247b0 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  f the Parse obje
247c0 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ct..**.** This f
247d0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
247e0 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61  as the xSelectCa
247f0 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61  llback2() callba
24800 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33  ck by.** sqlite3
24810 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77  SelectExpand() w
24820 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45  hen walking a SE
24830 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73  LECT tree to res
24840 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  olve table.** na
24850 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52  mes and other FR
24860 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
24870 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ts. .*/.static v
24880 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74  oid selectPopWit
24890 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  h(Walker *pWalke
248a0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
248b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
248c0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
248d0 3b 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 20  ;.  With *pWith 
248e0 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28  = findRightmost(
248f0 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66 28  p)->pWith;.  if(
24900 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20   pWith!=0 ){.   
24910 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
24920 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b  >pWith==pWith );
24930 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
24940 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74  th = pWith->pOut
24950 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  er;.  }.}.#else.
24960 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f  #define selectPo
24970 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a  pWith 0.#endif..
24980 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
24990 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63  ne is a Walker c
249a0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70  allback for "exp
249b0 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54  anding" a SELECT
249c0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22   statement..** "
249d0 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73  Expanding" means
249e0 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f   to do the follo
249f0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  wing:.**.**    (
24a00 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
24a10 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
24a20 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
24a30 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
24a40 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
24a50 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
24a60 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
24a70 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
24a80 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
24a90 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
24aa0 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
24ab0 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
24ac0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
24ad0 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
24ae0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
24af0 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
24b00 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
24b10 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
24b20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
24b30 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
24b40 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
24b50 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
24b60 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
24b70 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
24b80 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
24b90 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
24ba0 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
24bb0 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
24bc0 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
24bd0 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
24be0 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
24bf0 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
24c00 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
24c10 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
24c20 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
24c30 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
24c40 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
24c50 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
24c60 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  se to accommodat
24c70 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
24c80 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
24c90 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
24ca0 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
24cb0 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
24cc0 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
24cd0 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
24ce0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
24cf0 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
24d00 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
24d10 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
24d20 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
24d30 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
24d40 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
24d50 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
24d60 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
24d70 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
24d80 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
24d90 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
24da0 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
24db0 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
24dc0 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f   in TABLE..**.*/
24dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
24de0 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65  ctExpander(Walke
24df0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
24e00 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
24e10 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
24e20 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  r->pParse;.  int
24e30 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c   i, j, k;.  SrcL
24e40 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
24e50 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
24e60 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
24e70 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
24e80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
24e90 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
24ea0 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74  xpr *pE, *pRight
24eb0 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20  , *pExpr;.  u16 
24ec0 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
24ed0 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65  lFlags;..  p->se
24ee0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
24ef0 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d  anded;.  if( db-
24f00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
24f10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
24f20 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66  _Abort;.  }.  if
24f30 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d  ( NEVER(p->pSrc=
24f40 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73  =0) || (selFlags
24f50 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21   & SF_Expanded)!
24f60 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
24f70 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
24f80 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
24f90 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
24fa0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
24fb0 28 20 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65  ( pWalker->xSele
24fc0 63 74 43 61 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c  ctCallback2==sel
24fd0 65 63 74 50 6f 70 57 69 74 68 20 29 7b 0a 20 20  ectPopWith ){.  
24fe0 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73    sqlite3WithPus
24ff0 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69  h(pParse, findRi
25000 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
25010 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  h, 0);.  }..  /*
25020 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
25030 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
25040 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
25050 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
25060 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
25070 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
25080 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
25090 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
250a0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
250b0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
250c0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
250d0 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
250e0 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
250f0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
25100 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
25110 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
25120 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
25130 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
25140 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
25150 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
25160 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
25170 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
25180 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
25190 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
251a0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
251b0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
251c0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
251d0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
251e0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
251f0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
25200 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  m->fg.isRecursiv
25210 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70  e==0 || pFrom->p
25220 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
25230 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65  ( pFrom->fg.isRe
25240 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e  cursive ) contin
25250 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
25260 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
25270 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
25280 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66  _OMIT_CTE.    if
25290 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61  ( withExpand(pWa
252a0 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72  lker, pFrom) ) r
252b0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
252c0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
252d0 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23  pTab ) {} else.#
252e0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46  endif.    if( pF
252f0 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  rom->zName==0 ){
25300 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25310 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
25320 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
25330 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
25340 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  t;.      /* A su
25350 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
25360 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
25370 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
25380 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20  assert( pSel!=0 
25390 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
253a0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
253b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
253c0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
253d0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20  Walker, pSel) ) 
253e0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
253f0 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
25400 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
25410 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
25420 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
25430 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e));.      if( p
25440 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
25450 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
25460 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
25470 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  .      pTab->zNa
25480 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
25490 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
254a0 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70  sq_%p", (void*)p
254b0 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  Tab);.      whil
254c0 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
254d0 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e  ){ pSel = pSel->
254e0 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20  pPrior; }.      
254f0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
25500 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
25510 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
25520 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61  &pTab->nCol,&pTa
25530 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->aCol);.      
25540 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
25550 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
25560 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
25570 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
25580 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
25590 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61  76) );.      pTa
255a0 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
255b0 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e  F_Ephemeral;.#en
255c0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
255d0 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
255e0 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
255f0 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
25600 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
25610 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
25620 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
25630 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
25640 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
25650 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
25660 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
25670 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
25680 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
25690 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
256a0 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78  ( pTab->nRef==0x
256b0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
256c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
256d0 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
256e0 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
256f0 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
25700 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
25710 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
25720 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
25730 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
25740 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
25760 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
25770 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
25780 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74  (pTab) && cannot
25790 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  BeFunction(pPars
257a0 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
257b0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
257c0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23  Abort;.      }.#
257d0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
257e0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
257f0 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
25800 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
25810 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49  BLE).      if( I
25820 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c  sVirtual(pTab) |
25830 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
25840 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e  ){.        i16 n
25850 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
25860 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
25870 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
25880 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
25890 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
258a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
258b0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
258c0 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
258d0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
258e0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
258f0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
25900 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
25910 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
25920 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pFrom->pSelect, 
25930 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
25940 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61        nCol = pTa
25950 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
25960 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31   pTab->nCol = -1
25970 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25980 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
25990 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
259a0 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ect);.        pT
259b0 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ab->nCol = nCol;
259c0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
259d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
259e0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
259f0 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
25a00 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
25a10 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
25a20 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
25a30 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
25a40 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
25a50 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25a60 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
25a70 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
25a80 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
25a90 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
25aa0 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
25ab0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
25ac0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
25ad0 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
25ae0 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
25af0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
25b00 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
25b10 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
25b20 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
25b30 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
25b40 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
25b50 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
25b60 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
25b70 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
25b80 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
25b90 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
25ba0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
25bb0 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
25bc0 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
25bd0 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
25be0 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
25bf0 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61  K_ASTERISK opera
25c00 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
25c10 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
25c20 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a  n the column.  *
25c30 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c  * list.  The fol
25c40 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
25c50 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
25c60 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  he TK_ASTERISK. 
25c70 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
25c80 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20  and expand each 
25c90 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
25ca0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
25cb0 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65  n.  ** all table
25cc0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
25cd0 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
25ce0 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
25cf0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
25d00 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
25d10 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
25d20 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
25d30 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
25d40 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
25d50 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
25d60 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
25d70 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
25d80 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b  STERISK ) break;
25d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
25da0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
25db0 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
25dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
25dd0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
25de0 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
25df0 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
25e00 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
25e10 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
25e20 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
25e30 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
25e40 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
25e50 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
25e60 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
25e70 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
25e80 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
25e90 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
25ea0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
25eb0 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
25ec0 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
25ed0 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
25ee0 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
25ef0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
25f00 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
25f10 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
25f20 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
25f30 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
25f40 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
25f50 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
25f60 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
25f70 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
25f80 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
25f90 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
25fa0 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
25fb0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
25fc0 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
25fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fe0 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
25ff0 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
26000 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
26010 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
26020 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
26030 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d  .      pE = a[k]
26040 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52  .pExpr;.      pR
26050 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68  ight = pE->pRigh
26060 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
26070 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
26080 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  || pRight!=0 );.
26090 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
260a0 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20  !=TK_ASTERISK.  
260b0 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21       && (pE->op!
260c0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
260d0 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49  t->op!=TK_ASTERI
260e0 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  SK).      ){.   
260f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
26100 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
26110 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
26120 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
26130 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26140 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
26150 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
26160 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
26170 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [k].pExpr);.    
26180 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
26190 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
261a0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
261b0 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
261c0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
261d0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
261e0 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b  pr-1].zSpan = a[
261f0 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  k].zSpan;.      
26200 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
26210 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b   0;.          a[
26220 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20  k].zSpan = 0;.  
26230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26240 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
26250 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26260 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
26270 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
26280 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
26290 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
262a0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
262b0 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
262c0 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
262d0 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
262e0 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
262f0 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
26300 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d    char *zTName =
26310 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78   0;       /* tex
26320 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
26330 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
26340 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
26350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
26360 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
26370 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
26380 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
26390 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
263a0 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
263b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
263c0 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
263d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
263e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
263f0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
26400 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
26410 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
26420 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
26430 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
26440 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
26450 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
26460 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pSub = pFrom->
26470 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
26480 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
26490 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
264a0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  s;.          con
264b0 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
264c0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
264d0 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
264e0 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
264f0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
26500 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
26510 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
26520 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26530 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
26540 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
26550 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26560 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62  pSub==0 || (pSub
26570 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
26580 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29  NestedFrom)==0 )
26590 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
265a0 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ub = 0;.        
265b0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
265c0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
265d0 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
265e0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
265f0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
26600 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26610 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d             iDb =
26620 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
26630 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
26640 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
26650 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
26660 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d  e = iDb>=0 ? db-
26670 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
26680 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20  : "*";.         
26690 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72   }.          for
266a0 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
266b0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
266c0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
266d0 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
266e0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
266f0 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e       char *zColn
26700 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ame;  /* The com
26710 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
26720 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
26730 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20   char *zToFree; 
26740 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74    /* Malloced st
26750 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20  ring that needs 
26760 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
26770 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e             Token
26780 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43   sColname;  /* C
26790 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
267a0 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a  ame as a token *
267b0 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  /..            a
267c0 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a  ssert( zName );.
267d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
267e0 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20  zTName && pSub. 
267f0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
26800 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e  qlite3MatchSpanN
26810 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74  ame(pSub->pEList
26820 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c  ->a[j].zSpan, 0,
26830 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20   zTName, 0)==0. 
26840 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
26850 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
26860 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
26870 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
26880 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
26890 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
268a0 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66  dden', omit it f
268b0 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64  rom the expanded
268c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
268d0 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20  result-set list 
268e0 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43  unless the SELEC
268f0 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63  T has the SF_Inc
26900 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20  ludeHidden.     
26910 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65         ** bit se
26920 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
26930 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
26940 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
26950 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65   SF_IncludeHidde
26960 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
26970 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f     && IsHiddenCo
26980 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
26990 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20  [j]) .          
269a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
269b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
269c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
269d0 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
269e0 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
269f0 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54     if( i>0 && zT
26a00 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
26a10 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46           if( (pF
26a20 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  rom->fg.jointype
26a30 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
26a40 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
26a50 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c    && tableAndCol
26a60 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
26a70 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  t, i, zName, 0, 
26a80 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
26a90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26aa0 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
26ab0 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
26ac0 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
26ad0 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
26ae0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
26af0 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  le to the right 
26b00 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
26b20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
26b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26b40 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
26b50 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46  e3IdListIndex(pF
26b60 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  rom->pUsing, zNa
26b70 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
26b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
26b90 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
26ba0 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
26bb0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
26be0 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
26bf0 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
26c20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26c40 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
26c50 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
26c60 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
26c70 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
26c80 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
26c90 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
26ca0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
26cb0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
26cc0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
26cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26ce0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
26d00 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
26d10 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
26d20 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
26d30 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
26d40 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
26d50 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
26d60 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
26d70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
26d80 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20  SchemaName ){.  
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
26da0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
26db0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63  r(db, TK_ID, zSc
26dc0 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20  hemaName);.     
26dd0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
26de0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
26df0 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
26e00 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29  pLeft, pExpr, 0)
26e10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26e20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
26e30 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
26e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26e50 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
26e60 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
26e70 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
26e80 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
26e90 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
26ea0 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26ec0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
26ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
26ee0 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
26ef0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26f00 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
26f10 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
26f20 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
26f30 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
26f40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
26f50 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61  okenInit(&sColna
26f60 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
26f70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26f80 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
26f90 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  e(pParse, pNew, 
26fa0 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20  &sColname, 0);. 
26fb0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
26fc0 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  New && (p->selFl
26fd0 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
26fe0 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
26ff0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
27000 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
27010 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65  X = &pNew->a[pNe
27020 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  w->nExpr-1];.   
27030 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
27040 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
27050 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
27060 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
27070 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  up(db, pSub->pEL
27080 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29  ist->a[j].zSpan)
27090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
270a0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
270b0 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
270c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
270d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
270e0 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
270f0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
27100 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20  "%s.%s.%s",.    
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27130 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
27140 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43  me, zTabName, zC
27150 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
27160 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
27170 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
27180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
27190 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
271a0 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20   pX->bSpanIsTab 
271b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
271c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
271d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
271e0 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
271f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27200 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
27210 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
27220 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
27230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
27240 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27250 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
27260 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
27270 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
27280 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27290 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
272a0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
272b0 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
272c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
272d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
272e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
272f0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
27300 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
27310 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
27320 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
27330 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
27340 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
27350 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
27360 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
27370 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
27380 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
27390 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
273a0 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
273b0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
273c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  );.    return WR
273d0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e  C_Abort;.  }.#en
273e0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43  dif.  return WRC
273f0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
27400 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
27410 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
27420 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
27430 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
27440 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
27450 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
27460 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
27470 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
27480 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
27490 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
274a0 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
274b0 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
274c0 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
274d0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
274e0 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
274f0 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
27500 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
27510 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
27520 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
27530 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
27540 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
27550 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
27560 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
27570 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
27580 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
27590 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
275a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
275b0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
275c0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
275d0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
275e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
275f0 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
27600 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
27610 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
27620 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
27630 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
27640 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
27650 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
27660 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
27670 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
27680 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
27690 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
276a0 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
276b0 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
276c0 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
276d0 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
276e0 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
276f0 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
27700 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
27710 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
27720 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
27730 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
27740 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
27750 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
27760 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
27770 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
27780 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
27790 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
277a0 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
277b0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
277c0 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
277d0 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
277e0 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
277f0 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
27800 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
27810 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
27820 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
27830 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
27840 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
27850 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
27860 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
27870 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
27880 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
27890 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
278a0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
278b0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
278c0 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
278d0 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
278e0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
278f0 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
27900 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
27910 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ry;.    sqlite3W
27920 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
27930 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
27940 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
27950 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
27960 3b 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63 74  ;.  if( (pSelect
27970 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27980 4d 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20 29  MultiValue)==0 )
27990 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
279a0 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
279b0 74 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20  tPopWith;.  }.  
279c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
279d0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
279e0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
279f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
27a00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
27a10 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
27a20 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
27a30 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
27a40 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
27a50 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
27a60 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
27a70 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
27a80 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
27a90 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
27aa0 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
27ab0 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
27ac0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
27ad0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
27ae0 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
27af0 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
27b00 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
27b10 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
27b20 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
27b30 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
27b40 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
27b50 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
27b60 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
27b70 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
27b80 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
27b90 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
27ba0 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
27bb0 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
27bc0 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
27bd0 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
27be0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
27bf0 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
27c00 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
27c10 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
27c20 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
27c30 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
27c40 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
27c50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27c60 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
27c70 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
27c80 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27c90 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
27ca0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
27cb0 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
27cc0 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed );.  assert( 
27cd0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
27ce0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
27cf0 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
27d00 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
27d10 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
27d20 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
27d30 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
27d40 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
27d50 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
27d60 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
27d70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
27d80 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
27d90 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
27da0 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
27db0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
27dc0 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
27dd0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
27de0 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
27df0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
27e00 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
27e10 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
27e20 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
27e30 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
27e40 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28  elect;.      if(
27e50 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
27e60 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
27e70 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
27e80 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
27e90 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c      selectAddCol
27ea0 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
27eb0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
27ec0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
27ed0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
27ee0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
27ef0 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61   routine adds da
27f00 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  tatype and colla
27f10 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e  ting sequence in
27f20 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20  formation to.** 
27f30 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
27f40 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d  ures of all FROM
27f50 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
27f60 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43  es in a.** SELEC
27f70 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
27f80 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74  ** Use this rout
27f90 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72  ine after name r
27fa0 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
27fb0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
27fc0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
27fd0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
27fe0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
27ff0 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
28000 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
28010 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
28020 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
28030 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65  eof(w));.  w.xSe
28040 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
28050 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
28060 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78  yTypeInfo;.  w.x
28070 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
28080 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
28090 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
280a0 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
280b0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
280c0 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69   pSelect);.#endi
280d0 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f.}.../*.** This
280e0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
280f0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
28100 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
28110 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ng.  The.** foll
28120 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  owing is accompl
28130 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ished:.**.**    
28140 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20   *  VDBE Cursor 
28150 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69  numbers are assi
28160 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d  gned to all FROM
28170 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a  -clause terms..*
28180 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72  *     *  Ephemer
28190 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73  al Table objects
281a0 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
281b0 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
281c0 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
281d0 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53      *  ON and US
281e0 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
281f0 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45  shifted into WHE
28200 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  RE statements.**
28210 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64       *  Wildcard
28220 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45  s "*" and "TABLE
28230 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65  .*" in result se
28240 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e  ts are expanded.
28250 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74  .**     *  Ident
28260 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73  ifiers in expres
28270 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64  sion are matched
28280 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   to tables..**.*
28290 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
282a0 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20  cts recursively 
282b0 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65  on all subquerie
282c0 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c  s within the SEL
282d0 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
282e0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a  ite3SelectPrep(.
282f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
28300 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28310 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
28320 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
28330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28340 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
28350 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
28360 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
28370 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e   *pOuterNC  /* N
28380 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
28390 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a  container */.){.
283a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
283b0 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
283c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
283d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
283e0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
283f0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
28400 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
28410 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
28420 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
28430 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
28440 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
28450 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
28460 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
28470 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
28480 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
28490 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73  electNames(pPars
284a0 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b  e, p, pOuterNC);
284b0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
284c0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || 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 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
284f0 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
28500 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
28510 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
28520 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
28530 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
28540 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
28550 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
28560 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
28570 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
28580 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
28590 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
285a0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
285b0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
285c0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
285d0 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  at stores NULLs 
285e0 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
285f0 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e  memory.** cells.
28600 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28610 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
28620 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
28630 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
28640 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
28650 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
28660 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
28670 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
28680 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67  Func;.  int nReg
28690 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   = pAggInfo->nFu
286a0 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  nc + pAggInfo->n
286b0 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52  Column;.  if( nR
286c0 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  eg==0 ) return;.
286d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
286e0 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
286f0 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f  that all AggInfo
28700 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77   registers are w
28710 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
28720 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a  specified by.  *
28730 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e  * AggInfo.mnReg.
28740 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a  .AggInfo.mxReg *
28750 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67  /.  assert( nReg
28760 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  ==pAggInfo->mxRe
28770 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  g-pAggInfo->mnRe
28780 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  g+1 );.  for(i=0
28790 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
287a0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
287b0 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
287c0 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e  o->aCol[i].iMem>
287d0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
287e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
287f0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
28800 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
28810 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  xReg );.  }.  fo
28820 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
28830 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
28840 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
28850 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
28860 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
28870 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
28880 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
28890 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
288a0 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
288b0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
288c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
288d0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
288e0 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67  nfo->mnReg, pAgg
288f0 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20  Info->mxReg);.  
28900 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
28910 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
28920 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
28930 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
28940 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  {.    if( pFunc-
28950 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
28960 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
28970 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
28980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
28990 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
289a0 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
289b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
289c0 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
289d0 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
289e0 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
289f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
28a00 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
28a10 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
28a20 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
28a30 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
28a40 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
28a50 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
28a60 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
28a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28a80 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
28a90 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
28aa0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
28ab0 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30  , pE->x.pList, 0
28ac0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
28ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
28ae0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
28af0 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
28b00 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
28b30 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
28b40 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
28b50 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
28b60 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
28b70 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
28b80 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
28b90 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
28ba0 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
28bb0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
28bc0 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
28bd0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
28be0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
28bf0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
28c00 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
28c10 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
28c20 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
28c30 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
28c40 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
28c50 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
28c60 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
28c70 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
28c80 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
28c90 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
28ca0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
28cb0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
28cc0 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
28cd0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
28ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28cf0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
28d00 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
28d10 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
28d20 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20  >nExpr : 0, 0,. 
28d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d40 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
28d50 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
28d60 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
28d70 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
28d80 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
28d90 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
28da0 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
28db0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
28dc0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
28dd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
28de0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
28df0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
28e00 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
28e10 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
28e20 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
28e30 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67  int i;.  int reg
28e40 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  Hit = 0;.  int a
28e50 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a  ddrHitTest = 0;.
28e60 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
28e70 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
28e80 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
28e90 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
28ea0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
28eb0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
28ec0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
28ed0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
28ee0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
28ef0 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
28f00 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
28f10 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
28f20 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
28f30 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
28f40 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
28f50 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
28f60 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
28f70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
28f80 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
28f90 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
28fa0 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
28fb0 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
28fc0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
28fd0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
28fe0 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
28ff0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
29000 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
29010 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c  , regAgg, 0, SQL
29020 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20  ITE_ECEL_DUP);. 
29030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29040 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
29050 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
29060 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
29070 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
29080 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
29090 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
290a0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
290b0 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20  stcase( nArg==0 
290c0 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e  );  /* Error con
290d0 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  dition */.      
290e0 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31  testcase( nArg>1
290f0 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e   );   /* Also an
29100 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
29110 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
29120 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
29130 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
29140 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
29150 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
29160 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
29170 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
29180 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  OLL ){.      Col
29190 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
291a0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
291b0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
291c0 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
291d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
291e0 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
291f0 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
29200 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c  Func has NEEDCOL
29210 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  L */.      for(j
29220 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
29230 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
29240 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  nArg; j++, pItem
29250 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  ++){.        pCo
29260 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
29270 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
29280 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
29290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
292a0 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
292b0 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
292c0 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
292d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
292e0 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26  if( regHit==0 &&
292f0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
29300 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74  mulator ) regHit
29310 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
29320 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
29330 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
29340 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74  _CollSeq, regHit
29350 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
29360 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
29370 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Q);.    }.    sq
29380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
29390 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20  v, OP_AggStep0, 
293a0 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69  0, regAgg, pF->i
293b0 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
293c0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
293d0 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
293e0 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
293f0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
29400 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
29410 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
29420 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
29430 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
29440 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  g, nArg);.    sq
29450 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
29460 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
29470 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
29480 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
29490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
294a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
294b0 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
294c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
294d0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
294e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
294f0 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74  * Before populat
29500 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
29510 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63  tor registers, c
29520 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
29530 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65  cache..  ** Othe
29540 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66  rwise, if any of
29550 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f   the required co
29560 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20  lumn values are 
29570 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20  already present 
29580 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  .  ** in registe
29590 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43  rs, sqlite3ExprC
295a0 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50  ode() may use OP
295b0 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74  _SCopy to copy t
295c0 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f  he value.  ** to
295d0 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62   pC->iMem. But b
295e0 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76  y the time the v
295f0 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68  alue is used, th
29600 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73  e original regis
29610 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76  ter.  ** may hav
29620 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76  e been used, inv
29630 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e  alidating the un
29640 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20  derlying buffer 
29650 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a  holding the.  **
29660 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61   text or blob va
29670 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20  lue. See ticket 
29680 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20  [883034dcb5]..  
29690 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20  **.  ** Another 
296a0 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62  solution would b
296b0 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  e to change the 
296c0 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f  OP_SCopy used to
296d0 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a   copy cached.  *
296e0 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f  * values to an O
296f0 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69  P_Copy..  */.  i
29700 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20  f( regHit ){.   
29710 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73   addrHitTest = s
29720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
29730 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69  (v, OP_If, regHi
29740 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
29750 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
29760 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
29770 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
29780 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
29790 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
297a0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
297b0 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
297c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
297d0 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
297e0 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
297f0 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
29800 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
29810 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
29820 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
29830 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65  .  if( addrHitTe
29840 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
29850 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
29860 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20   addrHitTest);. 
29870 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
29880 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c  a single OP_Expl
29890 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
298a0 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65  to the VDBE to e
298b0 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a  xplain a simple.
298c0 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72  ** count(*) quer
298d0 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  y ("SELECT count
298e0 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e  (*) FROM pTab").
298f0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
29900 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
29910 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
29920 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a  ainSimpleCount(.
29930 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
29940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29950 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
29960 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
29970 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
29980 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
29990 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
299a0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65      /* Index use
299d0 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63  d to optimize sc
299e0 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  an, or NULL */.)
299f0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
29a00 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
29a10 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28    int bCover = (
29a20 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73 52  pIdx!=0 && (HasR
29a30 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49  owid(pTab) || !I
29a40 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
29a50 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68  (pIdx)));.    ch
29a60 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74  ar *zEqp = sqlit
29a70 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
29a80 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c  ->db, "SCAN TABL
29a90 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20  E %s%s%s",.     
29aa0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
29ab0 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
29ac0 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
29ad0 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
29ae0 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
29af0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
29b00 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ".    );.    sql
29b10 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
29b20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
29b30 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69  pVdbe, OP_Explai
29b40 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
29b50 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70  ctId, 0, 0, zEqp
29b60 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20  , P4_DYNAMIC.   
29b70 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
29b80 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
29b90 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c  SimpleCount(a,b,
29ba0 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
29bb0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
29bc0 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  or the SELECT st
29bd0 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e  atement given in
29be0 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e   the p argument.
29bf0 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73    .**.** The res
29c00 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e 65  ults are returne
29c10 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  d according to t
29c20 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
29c30 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20  ructure..** See 
29c40 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69  comments in sqli
29c50 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74  teInt.h for furt
29c60 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  her information.
29c70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
29c80 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
29c90 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
29ca0 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
29cb0 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
29cc0 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
29cd0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
29ce0 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
29cf0 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
29d00 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
29d10 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
29d20 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
29d30 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
29d40 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
29d50 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
29d60 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
29d70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29d80 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
29d90 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
29da0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
29db0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
29dc0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
29dd0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
29de0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
29df0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
29e00 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
29e10 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
29e20 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
29e30 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
29e40 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
29e50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
29e60 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
29e70 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
29e80 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
29e90 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
29ea0 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
29eb0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
29ec0 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
29ed0 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
29ee0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
29ef0 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
29f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
29f10 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
29f20 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
29f30 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
29f40 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f   *pEList = 0;  /
29f50 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
29f60 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
29f70 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
29f80 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
29f90 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
29fa0 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
29fb0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
29fc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
29fd0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
29fe0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
29ff0 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
2a000 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55  ;    /* The GROU
2a010 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  P BY clause.  Ma
2a020 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
2a030 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20  xpr *pHaving;   
2a040 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56        /* The HAV
2a050 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ING clause.  May
2a060 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
2a070 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
2a080 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
2a090 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
2a0a0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
2a0b0 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73  DistinctCtx sDis
2a0c0 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f  tinct; /* Info o
2a0d0 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
2a0e0 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
2a0f0 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  rd */.  SortCtx 
2a100 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f  sSort;         /
2a110 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
2a120 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20   code the ORDER 
2a130 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41  BY clause */.  A
2a140 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
2a150 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
2a160 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
2a170 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
2a180 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
2a190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2a1a0 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
2a1b0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
2a1c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
2a1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a1e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2a1f0 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  tion */..#ifndef
2a200 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
2a210 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74  LAIN.  int iRest
2a220 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50  oreSelectId = pP
2a230 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
2a240 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  .  pParse->iSele
2a250 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
2a260 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a  NextSelectId++;.
2a270 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70  #endif..  db = p
2a280 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
2a290 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
2a2a0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
2a2b0 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
2a2c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2a2d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
2a2e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
2a2f0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
2a300 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
2a310 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
2a320 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
2a330 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20  sAggInfo));.#if 
2a340 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2a350 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53  LED.  pParse->nS
2a360 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20  electIndent++;. 
2a370 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
2a380 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e  Parse,p, ("begin
2a390 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29   processing:\n")
2a3a0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2a3b0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2a3c0 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  100 ){.    sqlit
2a3d0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2a3e0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2a3f0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
2a400 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2a410 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2a420 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b  =SRT_DistFifo );
2a430 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2a440 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2a450 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46  st->eDest!=SRT_F
2a460 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2a470 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2a480 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2a490 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
2a4a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2a4b0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2a4c0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2a4d0 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49  Queue );.  if( I
2a4e0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
2a4f0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73  pDest) ){.    as
2a500 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
2a510 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
2a520 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2a530 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
2a540 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2a550 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
2a560 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2a570 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c  ==SRT_Discard ||
2a580 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
2a590 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75  t->eDest==SRT_Qu
2a5a0 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65  eue  || pDest->e
2a5b0 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
2a5c0 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  fo ||.          
2a5d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2a5e0 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20  RT_DistQueue || 
2a5f0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2a600 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20  T_Fifo);.    /* 
2a610 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65  If ORDER BY make
2a620 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
2a630 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68  in the output th
2a640 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a  en neither does.
2a650 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20      ** DISTINCT 
2a660 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d  so it can be rem
2a670 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20  oved too. */.   
2a680 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2a690 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
2a6a0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e  rderBy);.    p->
2a6b0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2a6c0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2a6d0 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
2a6e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
2a6f0 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
2a700 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  , 0);.  memset(&
2a710 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  sSort, 0, sizeof
2a720 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72  (sSort));.  sSor
2a730 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
2a740 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62  pOrderBy;.  pTab
2a750 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2a760 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2a770 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
2a780 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
2a790 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2a7a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
2a7b0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69  pEList!=0 );.  i
2a7c0 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  sAgg = (p->selFl
2a7d0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2a7e0 74 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45  te)!=0;.#if SELE
2a7f0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2a800 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2a810 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2a820 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2a830 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2a840 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65  ,p, ("after name
2a850 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29   resolution:\n")
2a860 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2a870 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2a880 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2a890 66 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  f...  /* If writ
2a8a0 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
2a8b0 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
2a8c0 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
2a8d0 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
2a8e0 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
2a8f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a900 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
2a910 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  f( checkForMulti
2a920 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
2a930 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c  r(pParse, pDest,
2a940 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
2a950 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  r) ){.    goto s
2a960 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
2a970 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20  endif..  /* Try 
2a980 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
2a990 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
2a9a0 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f  M clause up into
2a9b0 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a   the main query.
2a9c0 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
2a9d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
2a9e0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
2a9f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2aa00 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
2aa10 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69   !p->pPrior && i
2aa20 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2aa30 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2aa40 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2aa50 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
2aa60 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
2aa70 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
2aa80 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
2aa90 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 20 20  int isAggSub;.  
2aaa0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2aab0 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pItem->pTab;.   
2aac0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
2aad0 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
2aae0 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20   Catch mismatch 
2aaf0 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65 64 20  in the declared 
2ab00 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65  columns of a vie
2ab10 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  w and the number
2ab20 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d   of.    ** colum
2ab30 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
2ab40 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   on the RHS */. 
2ab50 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f     if( pTab->nCo
2ab60 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  l!=pSub->pEList-
2ab70 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
2ab80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2ab90 70 50 61 72 73 65 2c 20 22 65 78 70 65 63 74 65  pParse, "expecte
2aba0 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  d %d columns for
2abb0 20 27 25 73 27 20 62 75 74 20 67 6f 74 20 25 64   '%s' but got %d
2abc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2abd0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
2abe0 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Col, pTab->zName
2abf0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
2ac00 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f  nExpr);.      go
2ac10 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2ac20 20 20 20 7d 0a 0a 20 20 20 20 69 73 41 67 67 53     }..    isAggS
2ac30 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46  ub = (pSub->selF
2ac40 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2ac50 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28  ate)!=0;.    if(
2ac60 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
2ac70 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
2ac80 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20  sAgg, isAggSub) 
2ac90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2aca0 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
2acb0 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
2acc0 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
2acd0 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62      if( isAggSub
2ace0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67   ){.        isAg
2acf0 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  g = 1;.        p
2ad00 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2ad10 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
2ad20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31    }.      i = -1
2ad30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
2ad40 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2ad50 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2ad60 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2ad70 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2ad80 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
2ad90 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2ada0 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2adb0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
2adc0 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  By;.    }.  }.#e
2add0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61  ndif..  /* Get a
2ade0 20 70 6f 69 6e 74 65 72 20 74 68 65 20 56 44 42   pointer the VDB
2adf0 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
2ae00 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67  tion, allocating
2ae10 20 61 20 6e 65 77 20 56 44 42 45 20 69 66 20 6f   a new VDBE if o
2ae20 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ne.  ** does not
2ae30 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 2a   already exist *
2ae40 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
2ae50 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
2ae60 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
2ae70 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23  o select_end;..#
2ae80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ae90 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
2aea0 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63  CT.  /* Handle c
2aeb0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
2aec0 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20  tatements using 
2aed0 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c  the separate mul
2aee0 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20  tiSelect().  ** 
2aef0 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a  procedure..  */.
2af00 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
2af10 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
2af20 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
2af30 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65  p, pDest);.    e
2af40 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2af50 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
2af60 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
2af70 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43  ctId);.#if SELEC
2af80 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2af90 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31     SELECTTRACE(1
2afa0 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20  ,pParse,p,("end 
2afb0 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
2afc0 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b  processing\n"));
2afd0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  .    pParse->nSe
2afe0 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65  lectIndent--;.#e
2aff0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
2b000 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
2b010 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
2b020 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
2b030 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
2b040 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
2b050 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2b060 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2b070 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
2b080 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
2b090 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2b0a0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2b0b0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
2b0c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2b0d0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2b0e0 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
2b0f0 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
2b100 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
2b110 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
2b120 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
2b130 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
2b140 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63   Sometimes the c
2b150 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65  ode for a subque
2b160 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ry will be gener
2b170 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ated more than. 
2b180 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74     ** once, if t
2b190 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
2b1a0 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
2b1b0 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46   clause in a LEF
2b1c0 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66  T JOIN,.    ** f
2b1d0 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20  or example.  In 
2b1e0 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f  that case, do no
2b1f0 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65  t regenerate the
2b200 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73   code to manifes
2b210 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20  t.    ** a view 
2b220 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  or the co-routin
2b230 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
2b240 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73   view.  The firs
2b250 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a  t instance.    *
2b260 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  * is sufficient,
2b270 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72   though the subr
2b280 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65  outine to manife
2b290 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73  st the view does
2b2a0 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
2b2b0 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  be invoked again
2b2c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
2b2d0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2b2e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
2b2f0 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2b300 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ine==0 ){.      
2b310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b320 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2b330 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2b340 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  n, pItem->addrFi
2b350 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a  llSub);.      }.
2b360 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2b370 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
2b380 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48  crement Parse.nH
2b390 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69  eight by the hei
2b3a0 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ght of the large
2b3b0 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  st expression.  
2b3c0 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72    ** tree referr
2b3d0 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
2b3e0 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
2b3f0 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
2b400 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
2b410 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
2b420 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
2b430 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
2b440 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
2b450 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
2b460 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
2b470 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
2b480 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
2b490 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
2b4a0 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
2b4b0 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
2b4c0 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
2b4d0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
2b4e0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
2b4f0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
2b500 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
2b510 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65     /* Make copie
2b520 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48  s of constant WH
2b530 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE-clause terms
2b540 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
2b550 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20  ery down.    ** 
2b560 69 6e 73 69 64 65 20 74 68 65 20 73 75 62 71 75  inside the subqu
2b570 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68  ery.  This can h
2b580 65 6c 70 20 74 68 65 20 73 75 62 71 75 65 72 79  elp the subquery
2b590 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66   to run more eff
2b5a0 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f  iciently..    */
2b5b0 0a 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d  .    if( (pItem-
2b5c0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
2b5d0 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20 20 20  T_OUTER)==0.    
2b5e0 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72   && pushDownWher
2b5f0 65 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62 2c  eTerms(db, pSub,
2b600 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65   p->pWhere, pIte
2b610 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20  m->iCursor).    
2b620 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ){.#if SELECTTRA
2b630 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
2b640 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2b650 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2b660 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  ){.        SELEC
2b670 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2b680 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48  rse,p,("After WH
2b690 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d  ERE-clause push-
2b6a0 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  down:\n"));.    
2b6b0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2b6c0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2b6d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
2b6e0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
2b6f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
2b700 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2b710 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2f 0a  subquery.    */.
2b720 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
2b730 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 26  ->nSrc==1.     &
2b740 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
2b750 20 53 46 5f 41 6c 6c 29 3d 3d 30 0a 20 20 20 20   SF_All)==0.    
2b760 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
2b770 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
2b780 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65  TE_SubqCoroutine
2b790 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
2b7a0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f  * Implement a co
2b7b0 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  -routine that wi
2b7c0 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  ll return a sing
2b7d0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
2b7e0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
2b7f0 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  t on each invoca
2b800 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
2b810 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2b820 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2b830 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a  rrentAddr(v)+1;.
2b840 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
2b850 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
2b860 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
2b870 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2b880 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
2b890 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2b8a0 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54  Return, 0, addrT
2b8b0 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  op);.      VdbeC
2b8c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
2b8d0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2b8e0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ame));.      pIt
2b8f0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2b900 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  = addrTop;.     
2b910 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2b920 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
2b930 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
2b940 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2b950 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2b960 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2b970 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
2b980 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2b990 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
2b9a0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
2b9b0 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
2b9c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
2b9d0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2b9e0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53  sqlite3LogEst(pS
2b9f0 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  ub->nSelectRow);
2ba00 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
2ba10 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
2ba20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
2ba30 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
2ba40 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
2ba50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2ba60 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
2ba70 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2ba80 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  turn);.      sql
2ba90 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2baa0 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
2bab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
2bac0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
2bad0 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
2bae0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
2baf0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
2bb00 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
2bb10 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
2bb20 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
2bb30 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
2bb40 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
2bb50 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2bb60 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
2bb70 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
2bb80 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
2bb90 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
2bba0 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
2bbb0 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
2bbc0 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
2bbd0 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
2bbe0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
2bbf0 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
2bc00 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
2bc10 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
2bc20 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
2bc30 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
2bc40 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
2bc50 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
2bc60 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
2bc70 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2bc80 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
2bc90 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
2bca0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 5a  r = sqlite3VdbeZ
2bcb0 65 72 6f 52 65 67 69 73 74 65 72 28 76 2c 20 70  eroRegister(v, p
2bcc0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2bcd0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
2bce0 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
2bcf0 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66  Addr+1;.      if
2bd00 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f  ( pItem->fg.isCo
2bd10 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20  rrelated==0 ){. 
2bd20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
2bd30 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
2bd40 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20   correlated and 
2bd50 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
2bd60 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20  side of.        
2bd70 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  ** a trigger, th
2bd80 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  en we only need 
2bd90 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76  to compute the v
2bda0 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71  alue of the subq
2bdb0 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
2bdc0 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  once. */.       
2bdd0 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
2bde0 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
2bdf0 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
2be00 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
2be10 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  beComment((v, "m
2be20 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
2be30 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
2be40 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2be50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56  }else{.        V
2be60 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
2be70 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
2be80 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
2be90 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2bea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2beb0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
2bec0 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
2bed0 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
2bee0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65  Cursor);.      e
2bef0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2bf00 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
2bf10 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
2bf20 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
2bf30 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2bf40 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
2bf50 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
2bf60 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
2bf70 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33  LogEst = sqlite3
2bf80 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e 53 65  LogEst(pSub->nSe
2bf90 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
2bfa0 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73  if( onceAddr ) s
2bfb0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2bfc0 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b  re(v, onceAddr);
2bfd0 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d  .      retAddr =
2bfe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2bff0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2c000 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2c010 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
2c020 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25  mment((v, "end %
2c030 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
2c040 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2c050 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2c060 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20  eP1(v, topAddr, 
2c070 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  retAddr);.      
2c080 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2c090 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
2c0a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c0b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c0c0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2c0d0 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  nd;.    pParse->
2c0e0 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
2c0f0 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
2c100 68 74 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ht(p);.  }.#endi
2c110 66 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  f..  /* Various 
2c120 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
2c130 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e  SELECT copied in
2c140 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  to local variabl
2c150 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76  es for.  ** conv
2c160 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c  enience */.  pEL
2c170 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
2c180 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
2c190 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
2c1a0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
2c1b0 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
2c1c0 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
2c1d0 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
2c1e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2c1f0 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
2c200 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2c210 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2c220 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2c230 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
2c240 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
2c250 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
2c260 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
2c270 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
2c280 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2c290 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2c2a0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2c2b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75  ..  /* If the qu
2c2c0 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
2c2d0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
2c2e0 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61   but is not an a
2c2f0 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20  ggregate, and . 
2c300 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63   ** if the selec
2c310 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61  t-list is the sa
2c320 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20  me as the ORDER 
2c330 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68  BY list, then th
2c340 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61  is query.  ** ca
2c350 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
2c360 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e  s a GROUP BY. In
2c370 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
2c380 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
2c390 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
2c3a0 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  T xyz FROM ... O
2c3b0 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
2c3c0 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f  .  ** is transfo
2c3d0 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  rmed to:.  **.  
2c3e0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79  **     SELECT xy
2c3f0 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50  z FROM ... GROUP
2c400 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59   BY xyz ORDER BY
2c410 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   xyz.  **.  ** T
2c420 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
2c430 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61  s preferred as a
2c440 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f   single index (o
2c450 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61  r temp-table) ma
2c460 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20  y be .  ** used 
2c470 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44  for both the ORD
2c480 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ER BY and DISTIN
2c490 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41  CT processing. A
2c4a0 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20  s originally .  
2c4b0 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71  ** written the q
2c4c0 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20  uery must use a 
2c4d0 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61  temp-table for a
2c4e0 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
2c4f0 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42  he ORDER .  ** B
2c500 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20  Y and DISTINCT, 
2c510 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  and an index or 
2c520 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61  separate temp-ta
2c530 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65  ble for the othe
2c540 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
2c550 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
2c560 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
2c570 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
2c580 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c  tinct .   && sql
2c590 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2c5a0 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72  are(sSort.pOrder
2c5b0 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d  By, pEList, -1)=
2c5c0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73  =0.  ){.    p->s
2c5d0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
2c5e0 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72  istinct;.    pGr
2c5f0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
2c600 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
2c610 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c  rListDup(db, pEL
2c620 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  ist, 0);.    /* 
2c630 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e  Notice that even
2c640 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74   thought SF_Dist
2c650 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c  inct has been cl
2c660 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65  eared from p->se
2c670 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74  lFlags,.    ** t
2c680 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  he sDistinct.isT
2c690 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74  nct is still set
2c6a0 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74  .  Hence, isTnct
2c6b0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a   represents the.
2c6c0 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20      ** original 
2c6d0 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53  setting of the S
2c6e0 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c  F_Distinct flag,
2c6f0 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74   not the current
2c700 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20   setting */.    
2c710 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63  assert( sDistinc
2c720 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a  t.isTnct );.  }.
2c730 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
2c740 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
2c750 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61 74  ause, then creat
2c760 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  e an ephemeral i
2c770 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20  ndex to.  ** do 
2c780 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42 75  the sorting.  Bu
2c790 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20 65  t this sorting e
2c7a0 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d  phemeral index m
2c7b0 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a  ight end up.  **
2c7c0 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
2c7d0 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
2c7e0 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
2c7f0 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a  e-sorted order..
2c800 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20    ** If that is 
2c810 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
2c820 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2c830 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
2c840 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61  will be.  ** cha
2c850 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
2c860 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75 72  op once we figur
2c870 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
2c880 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 0a  orting index is.
2c890 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e    ** not needed.
2c8a0 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64 72    The sSort.addr
2c8b0 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61 62  SortIndex variab
2c8c0 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61  le is used to fa
2c8d0 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74 68  cilitate.  ** th
2c8e0 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
2c8f0 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
2c900 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
2c910 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
2c920 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
2c930 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2c940 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e  t(pParse, sSort.
2c950 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c  pOrderBy, 0, pEL
2c960 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
2c970 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20   sSort.iECursor 
2c980 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2c990 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72  ;.    sSort.addr
2c9a0 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
2c9b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c9c0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
2c9d0 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
2c9e0 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
2c9f0 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  r, sSort.pOrderB
2ca00 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73  y->nExpr+1+pELis
2ca10 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20  t->nExpr, 0,.   
2ca20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
2ca30 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2ca40 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65  FO.      );.  }e
2ca50 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61  lse{.    sSort.a
2ca60 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
2ca70 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
2ca80 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
2ca90 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
2caa0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
2cab0 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
2cac0 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
2cad0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
2cae0 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
2caf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2cb00 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2cb10 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  l, pDest->iSDPar
2cb20 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
2cb30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
2cb40 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
2cb50 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
2cb60 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2cb70 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
2cb80 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f 49  tRow = LARGEST_I
2cb90 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  NT64;.  computeL
2cba0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
2cbb0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
2cbc0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
2cbd0 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
2cbe0 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
2cbf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2cc00 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
2cc10 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2cc20 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
2cc30 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
2cc40 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
2cc50 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
2cc60 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
2cc70 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
2cc80 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
2cc90 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
2cca0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
2ccb0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2ccc0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
2ccd0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
2cce0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2ccf0 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
2cd00 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
2cd10 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2cd20 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd40 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
2cd50 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
2cd60 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd80 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46   (char*)keyInfoF
2cd90 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2cda0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
2cdb0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
2cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdd0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2cde0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2cdf0 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
2ce00 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
2ce10 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2ce20 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
2ce30 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
2ce40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
2ce50 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2ce60 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2ce70 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
2ce80 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
2ce90 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
2cea0 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
2ceb0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
2cec0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
2ced0 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
2cee0 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
2cef0 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
2cf00 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
2cf10 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65  : 0);..    /* Be
2cf20 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
2cf30 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57   scan. */.    pW
2cf40 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
2cf50 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
2cf60 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
2cf70 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
2cf80 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfa0 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74    p->pEList, wct
2cfb0 72 6c 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  rlFlags, 0);.   
2cfc0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
2cfd0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2cfe0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2cff0 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
2d000 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70  ount(pWInfo) < p
2d010 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
2d020 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
2d030 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Row = sqlite3Whe
2d040 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
2d050 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
2d060 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63      if( sDistinc
2d070 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69  t.isTnct && sqli
2d080 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
2d090 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ct(pWInfo) ){.  
2d0a0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
2d0b0 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65  nctType = sqlite
2d0c0 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
2d0d0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
2d0e0 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f      if( sSort.pO
2d0f0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
2d100 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73  sSort.nOBSat = s
2d110 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
2d120 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ered(pWInfo);.  
2d130 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f      if( sSort.nO
2d140 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64  BSat==sSort.pOrd
2d150 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
2d160 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
2d170 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2d180 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2d190 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
2d1a0 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
2d1b0 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
2d1c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
2d1d0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
2d1e0 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
2d1f0 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
2d200 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
2d210 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
2d220 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
2d230 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
2d240 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72    if( sSort.addr
2d250 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
2d260 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d  sSort.pOrderBy==
2d270 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2d280 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
2d290 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
2d2a0 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
2d2b0 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
2d2c0 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
2d2d0 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65   loop. */.    se
2d2e0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2d2f0 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
2d300 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44   -1, &sSort, &sD
2d310 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d330 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2d340 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57  ContinueLabel(pW
2d350 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
2d360 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2d370 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
2d380 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20  l(pWInfo));..   
2d390 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
2d3a0 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
2d3b0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2d3c0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2d3d0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
2d3e0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68   /* This case wh
2d3f0 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61  en there exist a
2d400 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2d410 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59  ns or a GROUP BY
2d420 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f   clause.    ** o
2d430 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61  r both */.    Na
2d440 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
2d450 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
2d460 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
2d470 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
2d480 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
2d490 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
2d4a0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
2d4b0 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
2d4c0 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
2d4d0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2d4e0 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
2d4f0 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
2d500 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
2d510 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
2d520 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
2d530 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
2d540 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
2d550 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
2d560 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
2d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d580 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
2d590 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
2d5a0 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
2d5b0 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
2d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2d5d0 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
2d5e0 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
2d5f0 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
2d600 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
2d610 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
2d620 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
2d630 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
2d640 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
2d650 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
2d660 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
2d670 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
2d680 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  d;        /* End
2d690 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66   of processing f
2d6a0 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  or this SELECT *
2d6b0 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54  /.    int sortPT
2d6c0 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65  ab = 0;   /* Pse
2d6d0 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f  udotable used to
2d6e0 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20   decode sorting 
2d6f0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69  results */.    i
2d700 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20  nt sortOut = 0; 
2d710 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67     /* Output reg
2d720 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73  ister from the s
2d730 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  orter */.    int
2d740 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b   orderByGrp = 0;
2d750 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2d760 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44  GROUP BY and ORD
2d770 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61  ER BY are the sa
2d780 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  me */..    /* Re
2d790 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c  move any and all
2d7a0 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e   aliases between
2d7b0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2d7c0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  and the.    ** G
2d7d0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
2d7e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2d7f0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
2d800 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
2d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d820 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2d830 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
2d840 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
2d850 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  tem;  /* For loo
2d860 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73  ping over expres
2d870 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a  sion in a list *
2d880 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  /..      for(k=p
2d890 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
2d8a0 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74   pItem=p->pEList
2d8b0 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
2d8c0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2d8d0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
2d8e0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
2d8f0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f        for(k=pGro
2d900 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74  upBy->nExpr, pIt
2d910 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
2d920 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
2d930 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
2d940 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
2d950 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
2d960 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
2d970 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c  ow>100 ) p->nSel
2d980 65 63 74 52 6f 77 20 3d 20 31 30 30 3b 0a 20 20  ectRow = 100;.  
2d990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2d9a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31  ->nSelectRow = 1
2d9b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2d9c0 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
2d9d0 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20   a GROUP BY and 
2d9e0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2d9f0 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a  se and they are.
2da00 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c      ** identical
2da10 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65  , then it may be
2da20 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73   possible to dis
2da30 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
2da40 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a  Y clause .    **
2da50 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20   on the grounds 
2da60 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42  that the GROUP B
2da70 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65  Y will cause ele
2da80 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75  ments to come ou
2da90 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  t .    ** in the
2daa0 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20   correct order. 
2dab0 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20  It also may not 
2dac0 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d  - the GROUP BY m
2dad0 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a  ight use a.    *
2dae0 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  * database index
2daf0 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77   that causes row
2db00 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20  s to be grouped 
2db10 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75  together as requ
2db20 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20  ired.    ** but 
2db30 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72  not actually sor
2db40 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ted. Either way,
2db50 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
2db60 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
2db70 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52   ORDER BY and GR
2db80 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61  OUP BY clauses a
2db90 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73  re the same by s
2dba0 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72  etting the order
2dbb0 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72  ByGrp.    ** var
2dbc0 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  iable.  */.    i
2dbd0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
2dbe0 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70  stCompare(pGroup
2dbf0 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  By, sSort.pOrder
2dc00 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  By, -1)==0 ){.  
2dc10 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d      orderByGrp =
2dc20 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20   1;.    }. .    
2dc30 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65  /* Create a labe
2dc40 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65  l to jump to whe
2dc50 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f  n we want to abo
2dc60 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  rt the query */.
2dc70 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
2dc80 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2dc90 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
2dca0 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
2dcb0 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
2dcc0 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
2dcd0 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
2dce0 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
2dcf0 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
2dd00 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
2dd10 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
2dd20 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
2dd30 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
2dd40 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
2dd50 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
2dd60 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
2dd70 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
2dd80 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
2dd90 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
2dda0 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
2ddb0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
2ddc0 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61  Info.mnReg = pPa
2ddd0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
2dde0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
2ddf0 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
2de00 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
2de10 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73  nExpr : 0;.    s
2de20 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
2de30 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
2de40 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2de50 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
2de60 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
2de70 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2de80 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53  AggList(&sNC, sS
2de90 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  ort.pOrderBy);. 
2dea0 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
2deb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2dec0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2ded0 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
2dee0 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ng);.    }.    s
2def0 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
2df00 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
2df10 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
2df20 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
2df30 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
2df40 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2df50 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67  rHasProperty(sAg
2df60 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
2df70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2df80 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
2df90 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49  .ncFlags |= NC_I
2dfa0 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20  nAggFunc;.      
2dfb0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2dfc0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
2dfd0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
2dfe0 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ].pExpr->x.pList
2dff0 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
2e000 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67  lags &= ~NC_InAg
2e010 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20  gFunc;.    }.   
2e020 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20   sAggInfo.mxReg 
2e030 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
2e040 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2e050 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2e060 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
2e070 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
2e080 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
2e090 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
2e0a0 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
2e0b0 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
2e0c0 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
2e0d0 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
2e0e0 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
2e0f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
2e100 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2e110 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2e120 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
2e130 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
2e140 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
2e150 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
2e160 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f  ddr1;          /
2e170 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
2e180 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
2e190 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
2e1a0 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
2e1b0 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
2e1c0 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
2e1d0 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
2e1e0 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
2e1f0 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
2e200 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
2e210 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
2e220 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
2e230 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
2e240 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
2e250 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
2e260 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
2e270 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
2e280 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
2e290 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
2e2a0 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
2e2b0 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
2e2c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
2e2d0 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
2e2e0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
2e2f0 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
2e300 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
2e310 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
2e320 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
2e330 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
2e340 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
2e350 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
2e360 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
2e370 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
2e380 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
2e390 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
2e3a0 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
2e3b0 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
2e3c0 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
2e3d0 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
2e3e0 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
2e3f0 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
2e400 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
2e410 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
2e420 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
2e430 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
2e440 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  OP_SorterOpen in
2e450 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
2e460 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
2e470 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
2e480 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
2e490 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
2e4a0 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
2e4b0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
2e4c0 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
2e4d0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
2e4e0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
2e4f0 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c  0, sAggInfo.nCol
2e500 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72  umn);.      addr
2e510 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
2e520 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2e530 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
2e540 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
2e550 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2e560 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
2e570 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
2e580 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
2e590 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
2e5a0 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
2e5b0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
2e5c0 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
2e5d0 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
2e5e0 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
2e5f0 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
2e600 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
2e610 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2e620 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
2e630 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2e640 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
2e650 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
2e660 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
2e670 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
2e680 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2e690 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
2e6a0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
2e6b0 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
2e6c0 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
2e6d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2e6e0 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
2e6f0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2e700 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2e710 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2e720 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
2e730 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
2e740 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
2e750 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
2e760 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
2e770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 5a 65     sqlite3VdbeZe
2e780 72 6f 52 65 67 69 73 74 65 72 28 76 2c 20 69 41  roRegister(v, iA
2e790 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
2e7a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2e7b0 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
2e7c0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
2e7d0 69 74 65 33 56 64 62 65 5a 65 72 6f 52 65 67 69  ite3VdbeZeroRegi
2e7e0 73 74 65 72 28 76 2c 20 69 55 73 65 46 6c 61 67  ster(v, iUseFlag
2e7f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2e800 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
2e810 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
2e820 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73  mpty"));.      s
2e830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2e840 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
2e850 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72  iAMem, iAMem+pGr
2e860 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
2e870 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
2e880 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
2e890 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
2e8a0 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
2e8b0 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
2e8c0 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
2e8d0 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
2e8e0 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
2e8f0 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
2e900 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
2e910 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
2e920 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
2e930 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
2e940 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
2e950 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
2e960 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
2e970 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
2e980 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
2e990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e9a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2e9b0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
2e9c0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
2e9d0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
2e9e0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
2e9f0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
2ea00 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20  , pGroupBy, 0,. 
2ea10 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47           WHERE_G
2ea20 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42  ROUPBY | (orderB
2ea30 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52  yGrp ? WHERE_SOR
2ea40 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30  TBYGROUP : 0), 0
2ea50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
2ea60 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
2ea70 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2ea80 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2ea90 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
2eaa0 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70  (pWInfo)==pGroup
2eab0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
2eac0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
2ead0 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
2eae0 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
2eaf0 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
2eb00 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
2eb10 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
2eb20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
2eb30 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
2eb40 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
2eb50 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
2eb60 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
2eb70 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
2eb80 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
2eb90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2eba0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
2ebb0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2ebc0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
2ebd0 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
2ebe0 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
2ebf0 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
2ec00 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
2ec10 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
2ec20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
2ec30 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
2ec40 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
2ec50 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
2ec60 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
2ec70 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
2ec80 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
2ec90 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
2eca0 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
2ecb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ecc0 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20  int regBase;.   
2ecd0 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f       int regReco
2ece0 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rd;.        int 
2ecf0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  nCol;.        in
2ed00 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20  t nGroupBy;..   
2ed10 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70       explainTemp
2ed20 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20  Table(pParse, . 
2ed30 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73             (sDis
2ed40 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
2ed50 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  (p->selFlags&SF_
2ed60 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a  Distinct)==0) ?.
2ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed80 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a      "DISTINCT" :
2ed90 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20   "GROUP BY");.. 
2eda0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
2edb0 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
2edc0 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
2edd0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2ede0 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
2edf0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  pBy;.        j =
2ee00 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
2ee10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
2ee20 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
2ee30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2ee40 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
2ee50 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
2ee60 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
2ee70 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
2ee80 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
2ee90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2eea0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
2eeb0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
2eec0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2eed0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
2eee0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2eef0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2ef00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2ef10 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
2ef20 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
2ef30 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29  , regBase, 0, 0)
2ef40 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
2ef50 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
2ef60 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
2ef70 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
2ef80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
2ef90 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
2efa0 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
2efb0 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
2efc0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
2efd0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
2efe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2eff0 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
2f000 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
2f010 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2f020 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70  GetColumnToReg(p
2f030 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
2f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f050 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2f060 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
2f070 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
2f080 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
2f090 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
2f0a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2f0b0 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
2f0c0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2f0d0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
2f0e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f0f0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
2f100 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
2f110 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29  nCol, regRecord)
2f120 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f140 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
2f150 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2f160 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
2f170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f180 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2f190 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
2f1a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2f1b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2f1c0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ge(pParse, regBa
2f1d0 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
2f1e0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2f1f0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
2f200 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
2f210 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f  tingIdxPTab = so
2f220 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d  rtPTab = pParse-
2f230 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
2f240 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74   sortOut = sqlit
2f250 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2f260 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
2f270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2f280 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
2f290 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74  , sortPTab, sort
2f2a0 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  Out, nCol);.    
2f2b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f2c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2f2d0 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  erSort, sAggInfo
2f2e0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
2f2f0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
2f300 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2f310 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
2f320 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2f330 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
2f340 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
2f350 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  x = 1;.        s
2f360 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2f370 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20  lear(pParse);.. 
2f380 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2f390 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72   If the index or
2f3a0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2f3b0 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f   used by the GRO
2f3c0 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20  UP BY sort.     
2f3d0 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c   ** will natural
2f3e0 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  ly deliver rows 
2f3f0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71  in the order req
2f400 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44  uired by the ORD
2f410 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63  ER BY.      ** c
2f420 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68  lause, cancel th
2f430 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
2f440 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72  e open coded ear
2f450 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lier..      **. 
2f460 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
2f470 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
2f480 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  - the correct an
2f490 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75  swer should resu
2f4a0 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  lt regardless.. 
2f4b0 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20       ** Use the 
2f4c0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
2f4d0 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
2f4e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
2f4f0 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20  TIMIZER to .    
2f500 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69    ** disable thi
2f510 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
2f520 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
2f530 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ses.  */.      i
2f540 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26  f( orderByGrp &&
2f550 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2f560 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2f570 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20  GroupByOrder) . 
2f580 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42        && (groupB
2f590 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33  ySort || sqlite3
2f5a0 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57  WhereIsSorted(pW
2f5b0 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a  Info)).      ){.
2f5c0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f          sSort.pO
2f5d0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2f5e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2f5f0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
2f600 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2f610 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
2f620 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
2f630 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
2f640 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
2f650 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
2f660 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
2f670 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
2f680 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
2f690 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
2f6a0 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
2f6b0 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
2f6c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
2f6d0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
2f6e0 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
2f6f0 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
2f700 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
2f710 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
2f720 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
2f730 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
2f740 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
2f750 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
2f760 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2f770 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f780 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2f790 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
2f7a0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2f7b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f7c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2f7d0 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67  _SorterData, sAg
2f7e0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2f7f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f800 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 72 74              sort
2f810 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a  Out, sortPTab);.
2f820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2f830 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
2f840 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
2f850 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
2f860 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2f870 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f880 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
2f890 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a  umn, sortPTab, j
2f8a0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
2f8b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f8c0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
2f8d0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
2f8e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2f8f0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2f900 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
2f910 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
2f920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f930 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
2f940 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2f950 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
2f960 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
2f970 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
2f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f990 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
2f9a0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
2f9b0 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
2f9c0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
2f9d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2f9e0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2f9f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2fa00 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
2fa10 61 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72  addr1+1, 0, addr
2fa20 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
2fa30 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge(v);..      /*
2fa40 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
2fa50 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
2fa60 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
2fa70 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
2fa80 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   Changes in the 
2fa90 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
2faa0 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
2fab0 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
2fac0 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
2fad0 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
2fae0 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
2faf0 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
2fb00 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
2fb10 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
2fb20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
2fb30 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
2fb40 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
2fb50 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
2fb60 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
2fb70 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
2fb80 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
2fb90 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
2fba0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
2fbb0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
2fbc0 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
2fbd0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
2fbe0 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
2fbf0 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
2fc00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2fc10 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  deMove(pParse, i
2fc20 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72  BMem, iAMem, pGr
2fc30 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  oupBy->nExpr);. 
2fc40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fc50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2fc60 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
2fc70 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
2fc80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2fc90 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
2fca0 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
2fcb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2fcc0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
2fcd0 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
2fce0 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  rEnd); VdbeCover
2fcf0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
2fd00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
2fd10 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
2fd20 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2fd30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2fd40 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
2fd50 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
2fd60 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2fd70 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75  ((v, "reset accu
2fd80 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
2fd90 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
2fda0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2fdb0 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
2fdc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
2fdd0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
2fde0 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
2fdf0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2fe00 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
2fe10 64 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64  ddr1);.      upd
2fe20 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
2fe30 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2fe40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2fe50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2fe60 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
2fe70 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2fe80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2fe90 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
2fea0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
2feb0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
2fec0 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
2fed0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
2fee0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2fef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ff00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2ff10 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
2ff20 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
2ff30 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
2ff40 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2ff50 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
2ff60 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2ff70 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2ff80 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
2ff90 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
2ffa0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
2ffb0 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
2ffc0 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
2ffd0 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
2ffe0 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
2fff0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
30000 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
30010 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
30020 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
30030 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
30040 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
30050 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
30060 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
30070 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74  over the subrout
30080 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ines.      */.  
30090 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
300a0 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  oto(v, addrEnd);
300b0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
300c0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
300d0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
300e0 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
300f0 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
30100 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
30110 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
30120 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
30130 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
30140 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
30150 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
30160 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
30170 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
30180 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
30190 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
301a0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
301b0 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
301c0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
301d0 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
301e0 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
301f0 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
30200 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
30210 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
30220 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
30230 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
30240 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
30250 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
30260 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
30270 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
30280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30290 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
302a0 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  er, 1, iAbortFla
302b0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
302c0 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61  mment((v, "set a
302d0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
302e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
302f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
30300 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
30310 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30320 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
30330 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  (v, addrOutputRo
30340 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  w);.      addrOu
30350 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
30360 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
30370 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
30380 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30390 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c  OP_IfPos, iUseFl
303a0 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ag, addrOutputRo
303b0 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+2);.      Vdbe
303c0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
303d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
303e0 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
303f0 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
30400 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
30410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30420 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
30430 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
30440 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
30450 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
30460 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
30470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
30480 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
30490 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
304a0 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
304b0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
304c0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
304d0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
304e0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p->pEList, -1, 
304f0 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20  &sSort,.        
30500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
30510 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
30520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30530 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
30540 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
30550 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
30560 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
30570 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
30580 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
30590 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
305a0 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
305b0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
305c0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
305d0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
305e0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
305f0 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
30600 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
30610 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
30620 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
30630 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
30640 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
30650 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
30660 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
30670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30680 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
30690 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
306a0 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
306b0 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
306c0 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
306d0 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
306e0 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
306f0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
30700 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
30710 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30720 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
30730 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
30740 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
30750 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
30760 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
30770 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
30780 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
30790 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
307a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
307b0 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
307c0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
307d0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
307e0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
307f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30800 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
30810 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
30820 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
30830 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
30840 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
30850 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
30860 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
30870 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
30880 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
30890 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
308a0 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
308b0 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
308c0 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
308d0 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
308e0 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
308f0 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
30900 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
30910 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
30920 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
30930 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
30940 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
30950 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
30960 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
30970 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
30980 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
30990 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
309a0 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
309b0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
309c0 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
309d0 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
309e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
309f0 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
30a00 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
30a10 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
30a20 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
30a30 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
30a40 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
30a50 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
30a60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
30a70 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
30a80 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
30a90 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
30aa0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
30ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ac0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
30ad0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
30ae0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
30af0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
30b00 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
30b10 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
30b20 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
30b30 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
30b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b50 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
30b60 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
30b70 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
30b80 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
30b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30ba0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
30bb0 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
30bc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
30bd0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
30be0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
30bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
30c00 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
30c10 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
30c20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
30c30 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
30c40 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
30c50 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
30c60 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e  owest scan cost.
30c70 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
30c80 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
30c90 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
30ca0 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
30cb0 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
30cc0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
30cd0 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d      ** (2013-10-
30ce0 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74  03) Do not count
30cf0 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20   the entries in 
30d00 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
30d10 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
30d20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
30d30 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
30d40 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
30d50 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
30d60 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
30d70 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
30d80 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
30d90 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
30da0 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
30db0 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65  owid(pTab) ) pBe
30dc0 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  st = sqlite3Prim
30dd0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
30de0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
30df0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
30e00 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
30e10 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
30e20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
30e30 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
30e40 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
30e50 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
30e60 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20  szTabRow.       
30e70 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61      && pIdx->pPa
30e80 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20  rtIdxWhere==0.  
30e90 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42           && (!pB
30ea0 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49  est || pIdx->szI
30eb0 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49  dxRow<pBest->szI
30ec0 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  dxRow).         
30ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30ee0 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
30ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30f00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
30f10 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pBest ){.       
30f20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
30f30 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
30f40 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
30f50 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
30f60 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  ex(pParse, pBest
30f70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
30f80 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
30f90 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
30fa0 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
30fb0 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
30fc0 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
30fd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30fe0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
30ff0 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
31000 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a  iRoot, iDb, 1);.
31010 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
31020 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
31030 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
31040 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
31050 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
31060 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
31070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
31080 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
31090 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
310a0 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
310b0 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
310c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
310d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
310e0 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
310f0 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43    explainSimpleC
31100 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  ount(pParse, pTa
31110 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  b, pBest);.     
31120 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
31130 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
31140 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
31150 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
31160 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
31170 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
31180 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
31190 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
311a0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
311b0 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
311c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
311d0 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
311e0 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
311f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
31200 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
31210 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
31220 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
31230 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
31240 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
31250 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
31260 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
31270 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
31280 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
31290 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
312a0 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
312b0 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
312c0 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
312d0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
312e0 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
312f0 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
31300 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
31310 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
31320 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
31330 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
31340 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
31350 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
31360 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
31370 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
31380 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
31390 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
313a0 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
313b0 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
313c0 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
313d0 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
313e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
313f0 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
31400 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
31410 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
31420 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
31430 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
31440 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f  y behavior as fo
31450 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
31460 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
31470 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
31480 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
31490 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
314a0 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
314b0 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
314c0 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
314d0 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
314e0 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
314f0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
31500 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
31510 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31520 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
31530 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
31540 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
31550 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
31560 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
31570 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
31580 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
31590 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
315a0 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
315b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
315c0 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
315d0 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
315e0 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
315f0 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
31600 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
31610 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
31620 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
31630 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
31640 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31650 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
31660 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
31670 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52    u8 flag = WHER
31680 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
31690 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
316a0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
316b0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
316c0 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
316d0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
316e0 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  if( p->pHaving==
316f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
31700 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
31710 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d  y(&sAggInfo, &pM
31720 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20  inMax);.        
31730 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
31740 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d  ( flag==0 || (pM
31750 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e  inMax!=0 && pMin
31760 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29  Max->nExpr==1) )
31770 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ;..        if( f
31780 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
31790 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74   pMinMax = sqlit
317a0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
317b0 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20  , pMinMax, 0);. 
317c0 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
317d0 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
317e0 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
317f0 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
31800 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
31810 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
31820 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
31830 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
31840 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
31850 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
31860 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
31870 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
31880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31890 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
318a0 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
318b0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
318c0 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
318d0 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
318e0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
318f0 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
31900 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
31910 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
31920 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
31930 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
31940 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
31950 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
31960 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
31970 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
31980 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
31990 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
319a0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
319b0 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29  MinMax,0,flag,0)
319c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
319d0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
319e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
319f0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
31a00 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
31a10 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
31a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31a30 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
31a40 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
31a50 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
31a60 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
31a70 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e  ==0 || pMinMax->
31a80 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
31a90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
31aa0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
31ab0 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20  Info)>0 ){.     
31ac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31ad0 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57  Goto(v, sqlite3W
31ae0 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
31af0 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20  WInfo));.       
31b00 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
31b10 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
31b20 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
31b30 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45      (flag==WHERE
31b40 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69  _ORDERBY_MIN?"mi
31b50 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20  n":"max")));.   
31b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
31b70 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
31b80 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
31b90 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
31ba0 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
31bb0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d  ggInfo);.      }
31bc0 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  ..      sSort.pO
31bd0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
31be0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
31bf0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
31c00 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
31c10 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
31c20 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
31c30 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
31c40 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d   p, p->pEList, -
31c50 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20  1, 0, 0, .      
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c70 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
31c80 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
31c90 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
31ca0 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
31cb0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
31cc0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
31cd0 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
31ce0 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
31cf0 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
31d00 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73  y */..  if( sDis
31d10 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d  tinct.eTnctType=
31d20 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
31d30 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20  UNORDERED ){.   
31d40 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
31d50 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  e(pParse, "DISTI
31d60 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NCT");.  }..  /*
31d70 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
31d80 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
31d90 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
31da0 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
31db0 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
31dc0 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
31dd0 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
31de0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
31df0 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
31e00 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
31e10 6c 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  le(pParse,.     
31e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e30 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f  sSort.nOBSat>0 ?
31e40 20 22 52 49 47 48 54 20 50 41 52 54 20 4f 46 20   "RIGHT PART OF 
31e50 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52  ORDER BY":"ORDER
31e60 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72   BY");.    gener
31e70 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
31e80 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70  se, p, &sSort, p
31e90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44  EList->nExpr, pD
31ea0 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
31eb0 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
31ec0 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
31ed0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
31ee0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
31ef0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
31f00 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
31f10 63 6f 64 65 64 2e 20 49 66 20 74 68 65 72 65 20  coded. If there 
31f20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  is an error in t
31f30 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
31f40 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  re,.  ** set the
31f50 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
31f60 31 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 20  1. Otherwise 0. 
31f70 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50 61 72 73  */.  rc = (pPars
31f80 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20 20 2f  e->nErr>0);..  /
31f90 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
31fa0 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
31fb0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
31fc0 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
31fd0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
31fe0 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
31ff0 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
32000 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61  ect_end:.  expla
32010 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
32020 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
32030 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
32040 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  );..  /* Identif
32050 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
32060 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  f results of the
32070 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62   SELECT are to b
32080 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
32090 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
320a0 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65  OK && pDest->eDe
320b0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
320c0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
320d0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
320e0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
320f0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  st);.  }..  sqli
32100 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
32110 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
32120 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
32130 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
32140 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
32150 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c  CE_ENABLED.  SEL
32160 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
32170 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73  e,p,("end proces
32180 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61  sing\n"));.  pPa
32190 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
321a0 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72  nt--;.#endif.  r
321b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.