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

Artifact 137b31daa84d57d67847bf621bb54f3353e2077b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e  its */.};.#defin
0840: 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  e SORTFLAG_UseSo
0850: 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20  rter  0x01   /* 
0860: 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69  Use SorterOpen i
0870: 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70  nstead of OpenEp
0880: 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a  hemeral */../*.*
0890: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65  * Delete all the
08a0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65   content of a Se
08b0: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20  lect structure. 
08c0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20   Deallocate the 
08d0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73  structure.** its
08e0: 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65  elf only if bFre
08f0: 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  e is true..*/.st
0900: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53  atic void clearS
0910: 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  elect(sqlite3 *d
0920: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
0930: 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c  t bFree){.  whil
0940: 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65  e( p ){.    Sele
0950: 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
0960: 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69  pPrior;.    sqli
0970: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0980: 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e(db, p->pEList)
0990: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
09a0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
09b0: 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c  ->pSrc);.    sql
09c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
09d0: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
09e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
09f0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0a00: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
0a10: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0a20: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  (db, p->pHaving)
0a30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
0a40: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
0a50: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
0a60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0a70: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
0a80: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
0a90: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0aa0: 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >pOffset);.    s
0ab0: 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65  qlite3WithDelete
0ac0: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
0ad0: 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
0ae0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
0af0: 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 50  , p);.    p = pP
0b00: 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65 20  rior;.    bFree 
0b10: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
0b20: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53  * Initialize a S
0b30: 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
0b40: 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
0b50: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
0b60: 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70  it(SelectDest *p
0b70: 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c  Dest, int eDest,
0b80: 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70   int iParm){.  p
0b90: 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75  Dest->eDest = (u
0ba0: 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74  8)eDest;.  pDest
0bb0: 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72  ->iSDParm = iPar
0bc0: 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53  m;.  pDest->affS
0bd0: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
0be0: 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  ->iSdst = 0;.  p
0bf0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b  Dest->nSdst = 0;
0c00: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
0c10: 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74  ate a new Select
0c20: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
0c30: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
0c40: 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63  to that.** struc
0c50: 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20  ture..*/.Select 
0c60: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65  *sqlite3SelectNe
0c70: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
0c80: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
0c90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
0ca0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
0cb0: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
0cc0: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
0cd0: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
0ce0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
0cf0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
0d00: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
0d10: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
0d20: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
0d30: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
0d40: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
0d50: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0d60: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
0d70: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
0d80: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
0d90: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
0da0: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
0db0: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
0dc0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
0dd0: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
0de0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
0df0: 20 75 33 32 20 73 65 6c 46 6c 61 67 73 2c 20 20   u32 selFlags,  
0e00: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70         /* Flag p
0e10: 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20  arameters, such 
0e20: 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a  as SF_Distinct *
0e30: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
0e40: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d  ,         /* LIM
0e50: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
0e60: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
0e70: 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65  /.  Expr *pOffse
0e80: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  t         /* OFF
0e90: 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  SET value.  NULL
0ea0: 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74   means no offset
0eb0: 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
0ec0: 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
0ed0: 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74  standin;.  sqlit
0ee0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0ef0: 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
0f00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
0f10: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
0f20: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
0f30: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
0f40: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
0f50: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65  ailed );.    pNe
0f60: 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20  w = &standin;.  
0f70: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
0f80: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
0f90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
0fa0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0fb0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0fc0: 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29  b,TK_ASTERISK,0)
0fd0: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  );.  }.  pNew->p
0fe0: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
0ff0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
1000: 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e  SELECT;.  pNew->
1010: 73 65 6c 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c  selFlags = selFl
1020: 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  ags;.  pNew->iLi
1030: 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
1040: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 23 69  >iOffset = 0;.#i
1050: 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
1060: 41 42 4c 45 44 0a 20 20 70 4e 65 77 2d 3e 7a 53  ABLED.  pNew->zS
1070: 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 23  elName[0] = 0;.#
1080: 65 6e 64 69 66 0a 20 20 70 4e 65 77 2d 3e 61 64  endif.  pNew->ad
1090: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
10a0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
10b0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
10c0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63  ;.  pNew->nSelec
10d0: 74 52 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20  tRow = 0;.  if( 
10e0: 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d  pSrc==0 ) pSrc =
10f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1100: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1110: 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d  *pSrc));.  pNew-
1120: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
1130: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
1140: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
1150: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
1160: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
1170: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
1180: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1190: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
11a0: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
11b0: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
11c0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
11d0: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
11e0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
11f0: 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  ffset;.  pNew->p
1200: 57 69 74 68 20 3d 20 30 3b 0a 20 20 61 73 73 65  With = 0;.  asse
1210: 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c  rt( pOffset==0 |
1220: 7c 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70  | pLimit!=0 || p
1230: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c  Parse->nErr>0 ||
1240: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1250: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62  d!=0 );.  if( db
1260: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1270: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
1280: 63 74 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ct(db, pNew, pNe
1290: 77 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20  w!=&standin);.  
12a0: 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65    pNew = 0;.  }e
12b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
12c0: 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c   pNew->pSrc!=0 |
12d0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
12e0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
12f0: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
1300: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   );.  return pNe
1310: 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54  w;.}..#if SELECT
1320: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
1330: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
1340: 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a   of a Select obj
1350: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
1360: 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
1370: 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73  (Select *p, cons
1380: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1390: 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65    if( p && zName
13a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13b0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
13c0: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d  p->zSelName), p-
13d0: 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c  >zSelName, "%s",
13e0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23   zName);.  }.}.#
13f0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
1400: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
1410: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
1420: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
1430: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
1440: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
1450: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
1460: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
1470: 29 7b 0a 20 20 63 6c 65 61 72 53 65 6c 65 63 74  ){.  clearSelect
1480: 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f  (db, p, 1);.}../
1490: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
14a0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
14b0: 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
14c0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f  tatement in a co
14d0: 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  mpound..*/.stati
14e0: 63 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69  c Select *findRi
14f0: 67 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a  ghtmost(Select *
1500: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  p){.  while( p->
1510: 70 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70  pNext ) p = p->p
1520: 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70  Next;.  return p
1530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1540: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
1550: 65 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68  ers preceding th
1560: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
1570: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
1580: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
1590: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
15a0: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
15b0: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
15c0: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
15d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
15e0: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
15f0: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
1600: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
1610: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
1620: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
1630: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
1640: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
1650: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
1660: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
1670: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
1680: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
1690: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
16a0: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
16b0: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
16c0: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
16d0: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
16e0: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
16f0: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
1700: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
1710: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
1720: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
1730: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
1740: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
1750: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
1760: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
1770: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
1780: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
1790: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17b0: 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31  *   0123456789 1
17c0: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
17d0: 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74  89 123 */.  stat
17e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b  ic const char zK
17f0: 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75  eyText[] = "natu
1800: 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66  raleftouterightf
1810: 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a  ullinnercross";.
1820: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1830: 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69  truct {.    u8 i
1840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
1850: 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64  nning of keyword
1860: 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78   text in zKeyTex
1870: 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43  t[] */.    u8 nC
1880: 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74  har;    /* Lengt
1890: 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64  h of the keyword
18a0: 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a   in characters *
18b0: 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20  /.    u8 code;  
18c0: 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20     /* Join type 
18d0: 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79  mask */.  } aKey
18e0: 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  word[] = {.    /
18f0: 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30  * natural */ { 0
1900: 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c  ,  7, JT_NATURAL
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20  },.    /* left  
1930: 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54    */ { 6,  4, JT
1940: 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20  _LEFT|JT_OUTER  
1950: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1960: 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31  * outer   */ { 1
1970: 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20  0, 5, JT_OUTER  
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20  },.    /* right 
19a0: 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54    */ { 14, 5, JT
19b0: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
19c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
19d0: 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31  * full    */ { 1
19e0: 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54  9, 4, JT_LEFT|JT
19f0: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
1a00: 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20  },.    /* inner 
1a10: 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54    */ { 23, 5, JT
1a20: 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20  _INNER          
1a30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1a40: 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32  * cross   */ { 2
1a50: 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a  8, 5, JT_INNER|J
1a60: 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20  T_CROSS         
1a70: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
1a80: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
1a90: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
1aa0: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
1ab0: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
1ac0: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
1ad0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
1ae0: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
1af0: 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53  or(j=0; j<ArrayS
1b00: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a  ize(aKeyword); j
1b10: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1b20: 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d  ->n==aKeyword[j]
1b30: 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20  .nChar .        
1b40: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
1b50: 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a  ICmp((char*)p->z
1b60: 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79  , &zKeyText[aKey
1b70: 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e  word[j].i], p->n
1b80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1b90: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79  jointype |= aKey
1ba0: 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  word[j].code;.  
1bb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
1bd0: 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c  estcase( j==0 ||
1be0: 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c   j==1 || j==2 ||
1bf0: 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c   j==3 || j==4 ||
1c00: 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b   j==5 || j==6 );
1c10: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61  .    if( j>=Arra
1c20: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20  ySize(aKeyword) 
1c30: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
1c40: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
1c50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c60: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
1c70: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
1c80: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
1c90: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
1ca0: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
1cb0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
1cc0: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
1cd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
1ce0: 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65   = " ";.    asse
1cf0: 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20  rt( pB!=0 );.   
1d00: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53   if( pC==0 ){ zS
1d10: 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  p++; }.    sqlit
1d20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d30: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75  e, "unknown or u
1d40: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
1d50: 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22  type: ".       "
1d60: 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20  %T %T%s%T", pA, 
1d70: 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20  pB, zSp, pC);.  
1d80: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
1d90: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
1da0: 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a  f( (jointype & J
1db0: 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
1dc0: 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79        && (jointy
1dd0: 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
1de0: 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46  _RIGHT))!=JT_LEF
1df0: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
1e00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1e10: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
1e20: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
1e30: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
1e40: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
1e50: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
1e60: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
1e70: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
1e80: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
1e90: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
1ea0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
1eb0: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
1ec0: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
1ed0: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
1ee0: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
1ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1f00: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
1f10: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
1f20: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
1f30: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1f40: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
1f50: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1f60: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
1f70: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
1f80: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
1f90: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1fa0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  -1;.}../*.** Sea
1fb0: 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20  rch the first N 
1fc0: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20  tables in pSrc, 
1fd0: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1fe0: 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ht, looking for 
1ff0: 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20  a.** table that 
2000: 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  has a column nam
2010: 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a  ed zCol.  .**.**
2020: 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74   When found, set
2030: 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43   *piTab and *piC
2040: 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ol to the table 
2050: 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e  index and column
2060: 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65   index.** of the
2070: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
2080: 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45   and return TRUE
2090: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66  ..**.** If not f
20a0: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c  ound, return FAL
20b0: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
20c0: 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  t tableAndColumn
20d0: 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74  Index(.  SrcList
20e0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a   *pSrc,       /*
20f0: 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73   Array of tables
2100: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2110: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
2120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2130: 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  f tables in pSrc
2140: 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20  ->a[] to search 
2150: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2160: 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d  *zCol,    /* Nam
2170: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
2180: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  we are looking f
2190: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54  or */.  int *piT
21a0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
21b0: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
21c0: 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f  Src->a[] here */
21d0: 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20  .  int *piCol   
21e0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
21f0: 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e   index of pSrc->
2200: 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e  a[*piTab].pTab->
2210: 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29  aCol[] here */.)
2220: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2230: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
2240: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
2250: 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  les in pSrc */. 
2260: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
2270: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2280: 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e  f column matchin
2290: 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73  g zCol */..  ass
22a0: 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d  ert( (piTab==0)=
22b0: 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20  =(piCol==0) );  
22c0: 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68  /* Both or neith
22d0: 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20  er are NULL */. 
22e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69   for(i=0; i<N; i
22f0: 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ++){.    iCol = 
2300: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63  columnIndex(pSrc
2310: 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f  ->a[i].pTab, zCo
2320: 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  l);.    if( iCol
2330: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
2340: 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20   piTab ){.      
2350: 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20    *piTab = i;.  
2360: 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69        *piCol = i
2370: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
2380: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2390: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
23b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
23c0: 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69  d to add terms i
23d0: 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73  mplied by JOIN s
23e0: 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20  yntax to the.** 
23f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
2400: 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c  ression of a SEL
2410: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ECT statement. T
2420: 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69  he new term, whi
2430: 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77  ch.** is ANDed w
2440: 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67  ith the existing
2450: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
2460: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
2470: 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f  *.**    (tab1.co
2480: 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a  l1 = tab2.col2).
2490: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31  **.** where tab1
24a0: 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20   is the iSrc'th 
24b0: 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74  table in SrcList
24c0: 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69   pSrc and tab2 i
24d0: 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b  s the .** (iSrc+
24e0: 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f  1)'th. Column co
24f0: 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f  l1 is column iCo
2500: 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61  lLeft of tab1, a
2510: 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f  nd col2 is.** co
2520: 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f  lumn iColRight o
2530: 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69  f tab2..*/.stati
2540: 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54  c void addWhereT
2550: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
2560: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
2570: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
2580: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
2590: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
25c0: 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
25d0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20  */.  int iLeft, 
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2600: 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20   first table to 
2610: 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a  join in pSrc */.
2620: 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20    int iColLeft, 
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2650: 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61  lumn in first ta
2660: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69  ble */.  int iRi
2670: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2690: 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c  x of second tabl
26a0: 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  e in pSrc */.  i
26b0: 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20  nt iColRight,   
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
26e0: 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c  n in second tabl
26f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  e */.  int isOut
2700: 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20  erJoin,         
2710: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2720: 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54  f this is an OUT
2730: 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70  ER join */.  Exp
2740: 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20  r **ppWhere     
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2760: 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52  IN/OUT: The WHER
2770: 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20  E clause to add 
2780: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  to */.){.  sqlit
2790: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
27a0: 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31  >db;.  Expr *pE1
27b0: 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20  ;.  Expr *pE2;. 
27c0: 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61   Expr *pEq;..  a
27d0: 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69  ssert( iLeft<iRi
27e0: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
27f0: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67   pSrc->nSrc>iRig
2800: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
2810: 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70  pSrc->a[iLeft].p
2820: 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Tab );.  assert(
2830: 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d   pSrc->a[iRight]
2840: 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20  .pTab );..  pE1 
2850: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2860: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2870: 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c  rc, iLeft, iColL
2880: 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71  eft);.  pE2 = sq
2890: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
28a0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
28b0: 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68  iRight, iColRigh
28c0: 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c  t);..  pEq = sql
28d0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
28e0: 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45  , TK_EQ, pE1, pE
28f0: 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71  2, 0);.  if( pEq
2900: 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20   && isOuterJoin 
2910: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2920: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46  operty(pEq, EP_F
2930: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
2940: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2950: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54  operty(pEq, EP_T
2960: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2970: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
2980: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2990: 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  Eq, EP_NoReduce)
29a0: 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68  ;.    pEq->iRigh
29b0: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
29c0: 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20  6)pE2->iTable;. 
29d0: 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20   }.  *ppWhere = 
29e0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
29f0: 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71  b, *ppWhere, pEq
2a00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
2a10: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
2a20: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
2a30: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
2a40: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
2a50: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
2a60: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2a70: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
2a80: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
2a90: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2aa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
2ab0: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2ac0: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
2ad0: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
2ae0: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
2af0: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
2b00: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
2b10: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
2b20: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
2b30: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
2b40: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
2b50: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2b60: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
2b70: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
2b80: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
2b90: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
2ba0: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
2bb0: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
2bc0: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2bd0: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
2be0: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
2bf0: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
2c00: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
2c10: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
2c20: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2c30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
2c40: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2c50: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
2c60: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2c70: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
2c80: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
2c90: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
2ca0: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
2cb0: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
2cc0: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
2cd0: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
2ce0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
2cf0: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
2d00: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
2d10: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
2d20: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
2d30: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
2d40: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
2d50: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
2d60: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
2d70: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
2d80: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
2d90: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
2da0: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
2db0: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
2dc0: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
2dd0: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
2de0: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
2df0: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
2e00: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
2e10: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
2e20: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
2e30: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
2e40: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
2e50: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
2e60: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
2e70: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
2e80: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
2e90: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
2ea0: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
2eb0: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
2ec0: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
2ed0: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
2ee0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
2ef0: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
2f00: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
2f10: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
2f20: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
2f30: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2f40: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
2f50: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2f60: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
2f70: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20  tVVAProperty(p, 
2f80: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2f90: 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54    p->iRightJoinT
2fa0: 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62  able = (i16)iTab
2fb0: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  le;.    if( p->o
2fc0: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
2fd0: 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  & p->x.pList ){.
2fe0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2ff0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
3000: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
3010: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
3020: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e  etJoinExpr(p->x.
3030: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3040: 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r, iTable);.    
3050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65    }.    }.    se
3060: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
3070: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
3080: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
3090: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
30a0: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
30b0: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
30c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
30d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
30e0: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
30f0: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
3100: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
3110: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
3120: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
3130: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
3140: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
3150: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3160: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
3170: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
3180: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
3190: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
31a0: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
31b0: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
31c0: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
31d0: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
31e0: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
31f0: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
3200: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
3210: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
3220: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
3230: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
3240: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
3250: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
3260: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
3270: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
3280: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
3290: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
32a0: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
32b0: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
32c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
32d0: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
32e0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
32f0: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
3300: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3310: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
3320: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
3330: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
3340: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
3350: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
3360: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
3370: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
3380: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
3390: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
33a0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
33b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
33c0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
33e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
33f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3400: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
3410: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
3420: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
3430: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3440: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
3450: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
3460: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
3470: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
3480: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
3490: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
34a0: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
34b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
34c0: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
34d0: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
34e0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
34f0: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
3500: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
3510: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
3520: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
3530: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
3540: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65     if( NEVER(pLe
3550: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
3560: 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74  htTab==0) ) cont
3570: 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65  inue;.    isOute
3580: 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 66 67 2e  r = (pRight->fg.
3590: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
35a0: 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a  TER)!=0;..    /*
35b0: 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41   When the NATURA
35c0: 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  L keyword is pre
35d0: 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20  sent, add WHERE 
35e0: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
35f0: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f  .    ** every co
3600: 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77  lumn that the tw
3610: 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  o tables have in
3620: 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a   common..    */.
3630: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3640: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
3650: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
3660: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3670: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
3680: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
3690: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
36a0: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
36b0: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
36c0: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
36d0: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
36e0: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
36f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3700: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
3710: 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54  r(j=0; j<pRightT
3720: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
3730: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3740: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
3750: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  f column in the 
3760: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
3770: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3780: 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e  ;     /* Matchin
3790: 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  g left table */.
37a0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
37b0: 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69  tCol;  /* Matchi
37c0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ng column in the
37d0: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a   left table */..
37e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
37f0: 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b  pRightTab->aCol[
3800: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
3810: 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f    if( tableAndCo
3820: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3830: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3840: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29  ft, &iLeftCol) )
3850: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
3860: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3870: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
3880: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a  eftCol, i+1, j,.
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
38b0: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
38c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
38d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
38e0: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
38f0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
3900: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
3910: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3920: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70  pRight->pOn && p
3930: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3950: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3960: 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  cannot have both
3970: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a   ON and USING ".
3980: 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73          "clauses
3990: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
39a0: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
39b0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
39c0: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
39d0: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
39e0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
39f0: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
3a00: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
3a10: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
3a20: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3a30: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
3a40: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
3a50: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
3a60: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
3a70: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
3a80: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3a90: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
3aa0: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
3ab0: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
3ac0: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
3ad0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3ae0: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
3af0: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
3b00: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
3b10: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
3b20: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
3b30: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
3b40: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
3b50: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3b60: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
3b70: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
3b80: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
3b90: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
3ba0: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
3bb0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
3bc0: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
3bd0: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
3be0: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
3bf0: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
3c00: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
3c10: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
3c20: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3c30: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
3c40: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
3c50: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3c60: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
3c70: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
3c80: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
3c90: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
3ca0: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
3cb0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
3cc0: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
3cd0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
3ce0: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
3cf0: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
3d00: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3d10: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3d20: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
3d30: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
3d40: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
3d50: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
3d60: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3d70: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
3d80: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3d90: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3da0: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
3db0: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
3dc0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3dd0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3de0: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
3df0: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
3e00: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
3e10: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3e20: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
3e30: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
3e40: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
3e50: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
3e60: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
3e70: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
3e80: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3e90: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3ea0: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
3eb0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3ec0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3ed0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3ee0: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
3ef0: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
3f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
3f10: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
3f20: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
3f30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
3f40: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
3f50: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
3f60: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3f70: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3f80: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
3f90: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
3fa0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3fb0: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3fd0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3fe0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
3ff0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
4000: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
4010: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
4020: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4030: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
4040: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
4050: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
4060: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
4070: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
4080: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
4090: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
40a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
40b0: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
40c0: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
40d0: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
40e0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
40f0: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
4100: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
4110: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65   */.);../*.** Ge
4120: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
4130: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
4140: 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65  ecord in registe
4150: 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68  rs regData.** th
4160: 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44  rough regData+nD
4170: 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73  ata-1 onto the s
4180: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
4190: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
41a0: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
41b0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
41c0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
41d0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
41e0: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  Sort,        /* 
41f0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
4200: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  t the ORDER BY c
4210: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
4220: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
4230: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
4240: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
4250: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
4260: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
4270: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
4280: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
4290: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74   sorted */.  int
42a0: 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20   regOrigData,   
42b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
42c0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
42d0: 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e  ta before packin
42e0: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  g */.  int nData
42f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4300: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
4310: 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 20  nts in the data 
4320: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4330: 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20  PrefixReg       
4340: 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20    /* No. of reg 
4350: 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61  prior to regData
4360: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
4370: 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  se */.){.  Vdbe 
4380: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4390: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
43b0: 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
43c0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
43d0: 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e  bSeq = ((pSort->
43e0: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
43f0: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d  FLAG_UseSorter)=
4400: 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  =0);.  int nExpr
4410: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
4420: 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20  By->nExpr;      
4430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4440: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
4450: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20   */.  int nBase 
4460: 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b  = nExpr + bSeq +
4470: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
4480: 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73         /* Fields
4490: 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72   in sorter recor
44a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
44b0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20          /* Regs 
44e0: 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72  for sorter recor
44f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  d */.  int regRe
4500: 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  cord = ++pParse-
4510: 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  >nMem;          
4520: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d          /* Assem
4530: 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f  bled sorter reco
4540: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53  rd */.  int nOBS
4550: 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  at = pSort->nOBS
4560: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
4570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
4580: 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b  R BY terms to sk
4590: 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ip */.  int op; 
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
45c0: 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74  code to add sort
45d0: 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72  er record to sor
45e0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ter */.  int iLi
45f0: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
4600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4610: 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  IMIT counter */.
4620: 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71 3d  .  assert( bSeq=
4630: 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b  =0 || bSeq==1 );
4640: 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61  .  assert( nData
4650: 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d  ==1 || regData==
4660: 72 65 67 4f 72 69 67 44 61 74 61 20 29 3b 0a 20  regOrigData );. 
4670: 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20   if( nPrefixReg 
4680: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
4690: 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72  PrefixReg==nExpr
46a0: 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67  +bSeq );.    reg
46b0: 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d  Base = regData -
46c0: 20 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20   nExpr - bSeq;. 
46d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42   }else{.    regB
46e0: 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
46f0: 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72  em + 1;.    pPar
4700: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73  se->nMem += nBas
4710: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
4720: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
4730: 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d  t==0 || pSelect-
4740: 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >iLimit!=0 );.  
4750: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
4760: 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c  ->iOffset ? pSel
4770: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ect->iOffset+1 :
4780: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4790: 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  ;.  pSort->label
47a0: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
47b0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
47c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
47d0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
47e0: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
47f0: 79 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f  y, regBase, regO
4800: 72 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20  rigData,.       
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
4830: 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  UP|SQLITE_ECEL_R
4840: 45 46 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20  EF);.  if( bSeq 
4850: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4860: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
4870: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
4880: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4890: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  e+nExpr);.  }.  
48a0: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  if( nPrefixReg==
48b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
48c0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
48d0: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
48e0: 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71  gBase+nExpr+bSeq
48f0: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  , nData);.  }.  
4900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4910: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4920: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4930: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4940: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
4950: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
4960: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4970: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4980: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4990: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
49a0: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
49b0: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
49c0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
49d0: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
49e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
49f0: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
4a00: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
4a10: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
4a20: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
4a30: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
4a40: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
4a50: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
4a60: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
4a70: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
4a80: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
4a90: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
4aa0: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
4ab0: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
4ac0: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
4ad0: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
4ae0: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
4af0: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
4b00: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
4b10: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
4b20: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
4b30: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
4b40: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
4b50: 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62   bSeq;.    if( b
4b60: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Seq ){.      add
4b70: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4b80: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4b90: 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b  _IfNot, regBase+
4ba0: 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c  nExpr); .    }el
4bb0: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69  se{.      addrFi
4bc0: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
4bd0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
4be0: 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72  quenceTest, pSor
4bf0: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
4c00: 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65    }.    VdbeCove
4c10: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
4c20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4c30: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
4c40: 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73  gPrevKey, regBas
4c50: 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  e, pSort->nOBSat
4c60: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
4c70: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
4c80: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
4c90: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
4ca0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
4cb0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
4cc0: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  n;.    pOp->p2 =
4cd0: 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20   nKey + nData;. 
4ce0: 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34     pKI = pOp->p4
4cf0: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d  .pKeyInfo;.    m
4d00: 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74  emset(pKI->aSort
4d10: 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e  Order, 0, pKI->n
4d20: 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73  Field); /* Makes
4d30: 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74   OP_Jump below t
4d40: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4d50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4d60: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4d70: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4d80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4d90: 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20   pKI->nXField>2 
4da0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
4db0: 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
4dc0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
4dd0: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4de0: 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20  derBy, nOBSat,. 
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e            pKI->n
4e20: 58 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61  XField-1);.    a
4e30: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
4e40: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4e50: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4e60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4e70: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
4e80: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
4e90: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4ea0: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
4eb0: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
4ec0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4ed0: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
4ee0: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
4ef0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
4f00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4f10: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
4f20: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
4f30: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
4f40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4f50: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
4f60: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
4f70: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4f80: 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20   if( iLimit ){. 
4f90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4fa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
4fb0: 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72  ot, iLimit, pSor
4fc0: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20  t->labelDone);. 
4fd0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
4fe0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
4ff0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5000: 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74  ere(v, addrFirst
5010: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
5020: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
5030: 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50  e, regBase, regP
5040: 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e  revKey, pSort->n
5050: 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  OBSat);.    sqli
5060: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5070: 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d  v, addrJmp);.  }
5080: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
5090: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
50a0: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
50b0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74      op = OP_Sort
50c0: 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73  erInsert;.  }els
50d0: 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49  e{.    op = OP_I
50e0: 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20  dxInsert;.  }.  
50f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5100: 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e  2(v, op, pSort->
5110: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
5120: 6f 72 64 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d  ord);.  if( iLim
5130: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
5140: 64 72 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  dr;.    addr = s
5150: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5160: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f  (v, OP_IfNotZero
5170: 2c 20 69 4c 69 6d 69 74 2c 20 30 2c 20 31 29 3b  , iLimit, 0, 1);
5180: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
51a0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
51b0: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
51c0: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
51d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
51e0: 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d  P_Delete, pSort-
51f0: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5200: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5210: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
5220: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
5230: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
5240: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
5250: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
5260: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
5270: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
5280: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
5290: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
52a0: 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20  t iOffset,      
52b0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
52c0: 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20 63  ing the offset c
52d0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
52e0: 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a  iContinue     /*
52f0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
5300: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
5310: 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ecord */.){.  if
5320: 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ( iOffset>0 ){. 
5330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5340: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
5350: 2c 20 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  , iOffset, iCont
5360: 69 6e 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f  inue, 1); VdbeCo
5370: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56  verage(v);.    V
5380: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5390: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d  OFFSET"));.  }.}
53a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
53b0: 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b   that will check
53c0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
53d0: 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74  e N registers st
53e0: 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a  arting at iMem.*
53f0: 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63  * form a distinc
5400: 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69  t entry.  iTab i
5410: 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  s a sorting inde
5420: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65  x that holds pre
5430: 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20  viously.** seen 
5440: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
5450: 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41  the N values.  A
5460: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61   new entry is ma
5470: 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66  de in iTab.** if
5480: 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76   the current N v
5490: 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a  alues are new..*
54a0: 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61  *.** A jump to a
54b0: 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64  ddrRepeat is mad
54c0: 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61  e and the N+1 va
54d0: 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20  lues are popped 
54e0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63  from the.** stac
54f0: 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65  k if the top N e
5500: 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20  lements are not 
5510: 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61  distinct..*/.sta
5520: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73  tic void codeDis
5530: 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a  tinct(.  Parse *
5540: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
5550: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5560: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5570: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
5580: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
5590: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73  sorting index us
55a0: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64  ed to test for d
55b0: 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20  istinctness */. 
55c0: 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c   int addrRepeat,
55d0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68      /* Jump to h
55e0: 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69  ere if not disti
55f0: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  nct */.  int N, 
5600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5610: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
5620: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20  s */.  int iMem 
5630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
5640: 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b  st element */.){
5650: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
5660: 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61  t r1;..  v = pPa
5670: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31  rse->pVdbe;.  r1
5680: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5690: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
56a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56b0: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
56c0: 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65  , iTab, addrRepe
56d0: 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64  at, iMem, N); Vd
56e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
56f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5700: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5710: 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31  ord, iMem, N, r1
5720: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5730: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
5740: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31  Insert, iTab, r1
5750: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
5760: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5770: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64  e, r1);.}..#ifnd
5780: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5790: 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
57a0: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
57b0: 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53  message when a S
57c0: 45 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69  ELECT is used wi
57d0: 74 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73  thin a subexpres
57e0: 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65  sion.** (example
57f0: 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54  :  "a IN (SELECT
5800: 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29   * FROM table)")
5810: 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65   but it has more
5820: 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a   than 1 result.*
5830: 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f  * column.  We do
5840: 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f   this in a subro
5850: 75 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68  utine because th
5860: 65 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20  e error used to 
5870: 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74  occur.** in mult
5880: 69 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54  iple places.  (T
5890: 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63  he error only oc
58a0: 63 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63  curs in one plac
58b0: 65 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a  e now, but we.**
58c0: 20 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72   retain the subr
58d0: 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69  outine to minimi
58e0: 7a 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69  ze code disrupti
58f0: 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  on.).*/.static i
5900: 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  nt checkForMulti
5910: 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
5920: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
5930: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
5940: 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20  se context. */. 
5950: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
5960: 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  st,   /* Destina
5970: 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72  tion of SELECT r
5980: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
5990: 6e 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  nExpr           
59a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
59b0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74  sult columns ret
59c0: 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
59d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73  */.){.  int eDes
59e0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
59f0: 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20  ;.  if( nExpr>1 
5a00: 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  && (eDest==SRT_M
5a10: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
5a20: 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  _Set) ){.    sql
5a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5a40: 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
5a50: 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
5a60: 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
5a70: 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
5a80: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
5a90: 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72  ression");.    r
5aa0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65  eturn 1;.  }else
5ab0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5ac0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
5ad0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5ae0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
5af0: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
5b00: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
5b10: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
5b20: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
5b30: 63 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65  cTab is negative
5b40: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
5b50: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
5b60: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
5b70: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
5b80: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5b90: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
5ba0: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
5bb0: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
5bc0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
5bd0: 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20  cTab and pEList 
5be0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a  is used only .**
5bf0: 20 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63   to get number c
5c00: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64  olumns and the d
5c10: 61 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68  atatype for each
5c20: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
5c30: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
5c40: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
5c50: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5c60: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
5c70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
5c80: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
5c90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
5ca0: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
5cb0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
5cc0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
5cd0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
5ce0: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
5cf0: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
5d00: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
5d10: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
5d20: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
5d30: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
5d40: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
5d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
5d60: 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e  ot NULL, info on
5d70: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
5d80: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69  ORDER BY */.  Di
5d90: 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74  stinctCtx *pDist
5da0: 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20  inct, /* If not 
5db0: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
5dc0: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53  w to process DIS
5dd0: 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63  TINCT */.  Selec
5de0: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
5df0: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
5e00: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
5e10: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  lts */.  int iCo
5e20: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
5e30: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5e40: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
5e50: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
5e60: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
5e70: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
5e80: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
5e90: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5ea0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
5eb0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
5ec0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5ed0: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
5ee0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5ef0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
5f00: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
5f10: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75  */.  int regResu
5f20: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
5f30: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
5f40: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ory holding resu
5f50: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  lt set */.  int 
5f60: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
5f70: 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74  Dest;   /* How t
5f80: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73  o dispose of res
5f90: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
5fa0: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
5fb0: 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61  Parm; /* First a
5fc0: 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f  rgument to dispo
5fd0: 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
5fe0: 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  int nResultCol; 
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6000: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
6010: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
6020: 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b   nPrefixReg = 0;
6030: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6040: 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
6050: 73 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67  sters before reg
6060: 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73  Result */..  ass
6070: 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65  ert( v );.  asse
6080: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
6090: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
60a0: 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69   pDistinct ? pDi
60b0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
60c0: 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e : WHERE_DISTIN
60d0: 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70  CT_NOOP;.  if( p
60e0: 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70  Sort && pSort->p
60f0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f  OrderBy==0 ) pSo
6100: 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  rt = 0;.  if( pS
6110: 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69  ort==0 && !hasDi
6120: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73  stinct ){.    as
6130: 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21  sert( iContinue!
6140: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  =0 );.    codeOf
6150: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
6160: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
6170: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
6180: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
6190: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65  umns..  */.  nRe
61a0: 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74  sultCol = pEList
61b0: 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20  ->nExpr;..  if( 
61c0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
61d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  ){.    if( pSort
61e0: 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69   ){.      nPrefi
61f0: 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  xReg = pSort->pO
6200: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
6210: 20 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74       if( !(pSort
6220: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
6230: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
6240: 29 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b  ) ) nPrefixReg++
6250: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6260: 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52  nMem += nPrefixR
6270: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  eg;.    }.    pD
6280: 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61  est->iSdst = pPa
6290: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
62a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
62b0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
62c0: 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e  else if( pDest->
62d0: 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c  iSdst+nResultCol
62e0: 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   > pParse->nMem 
62f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
6300: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  s an error condi
6310: 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65  tion that can re
6320: 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  sult, for exampl
6330: 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  e, when a SELECT
6340: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72  .    ** on the r
6350: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
6360: 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74  f an INSERT cont
6370: 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74  ains more result
6380: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20   columns than.  
6390: 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63    ** there are c
63a0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
63b0: 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e  ble on the left.
63c0: 20 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c    The error will
63d0: 20 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a   be caught.    *
63e0: 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  * and reported l
63f0: 61 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65  ater.  But we ne
6400: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
6410: 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73  enough memory is
6420: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a   allocated.    *
6430: 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72  * to avoid other
6440: 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73   spurious errors
6450: 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65   in the meantime
6460: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d  . */.    pParse-
6470: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
6480: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74  Col;.  }.  pDest
6490: 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c  ->nSdst = nResul
64a0: 74 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c  tCol;.  regResul
64b0: 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  t = pDest->iSdst
64c0: 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d  ;.  if( srcTab>=
64d0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
64e0: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
64f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
6500: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6510: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
6520: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
6530: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
6540: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
6550: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
6560: 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
6570: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
6580: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20  SRT_Exists ){.  
6590: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
65a0: 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58  ination is an EX
65b0: 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73  ISTS(...) expres
65c0: 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c  sion, the actual
65d0: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72  .    ** values r
65e0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
65f0: 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65  ELECT are not re
6600: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
6610: 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b     u8 ecelFlags;
6620: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
6630: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
6640: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
6650: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6660: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63  tine ){.      ec
6670: 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  elFlags = SQLITE
6680: 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d  _ECEL_DUP;.    }
6690: 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c  else{.      ecel
66a0: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Flags = 0;.    }
66b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
66c0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
66d0: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67  rse, pEList, reg
66e0: 52 65 73 75 6c 74 2c 20 30 2c 20 65 63 65 6c 46  Result, 0, ecelF
66f0: 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
6700: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
6710: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
6720: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
6730: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
6740: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
6750: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
6760: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
6770: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
6780: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
6790: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
67a0: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
67b0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44  {.    switch( pD
67c0: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
67d0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
67e0: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
67f0: 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
6800: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20     VdbeOp *pOp; 
6810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
6820: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
6830: 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
6840: 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nstr. */.       
6850: 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20   int iJump;     
6860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
6870: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
6880: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50          int regP
6890: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
68a0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20  /* Previous row 
68b0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  content */..    
68c0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
68d0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72  space for the pr
68e0: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
68f0: 20 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20        regPrev = 
6900: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
6910: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
6920: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
6930: 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ol;..        /* 
6940: 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  Change the OP_Op
6950: 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65  enEphemeral code
6960: 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20  d earlier to an 
6970: 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20  OP_Null.        
6980: 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f  ** sets the MEM_
6990: 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74  Cleared bit on t
69a0: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
69b0: 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  r of the.       
69c0: 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c   ** previous val
69d0: 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  ue.  This will c
69e0: 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62  ause the OP_Ne b
69f0: 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20  elow to always. 
6a00: 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f         ** fail o
6a10: 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  n the first iter
6a20: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
6a30: 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  p even if the fi
6a40: 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  rst.        ** r
6a50: 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e  ow is all NULLs.
6a60: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6a70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6a80: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70  hangeToNoop(v, p
6a90: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
6aa0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ct);.        pOp
6ab0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
6ac0: 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  tOp(v, pDistinct
6ad0: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
6ae0: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
6af0: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
6b00: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b      pOp->p1 = 1;
6b10: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
6b20: 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20   = regPrev;..   
6b30: 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c       iJump = sql
6b40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
6b50: 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74  ddr(v) + nResult
6b60: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Col;.        for
6b70: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
6b80: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6b90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6ba0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
6bb0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
6bc0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
6bd0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
6be0: 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d  f( i<nResultCol-
6bf0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
6c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c10: 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67  p3(v, OP_Ne, reg
6c20: 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c  Result+i, iJump,
6c30: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
6c40: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
6c50: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
6c60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6c70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6c80: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
6c90: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
6ca0: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
6cb0: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
6cc0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6cd0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d  v);.           }
6ce0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6cf0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
6d00: 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  , -1, (const cha
6d10: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
6d20: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
6d30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6d40: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
6d50: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20  NULLEQ);.       
6d60: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
6d70: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t( sqlite3VdbeCu
6d80: 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a  rrentAddr(v)==iJ
6d90: 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ump || pParse->d
6da0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6db0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6dc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6dd0: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75  OP_Copy, regResu
6de0: 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65  lt, regPrev, nRe
6df0: 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  sultCol-1);.    
6e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6e10: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
6e20: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
6e30: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
6e40: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6e50: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
6e60: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
6e70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6e80: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
6e90: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6ea0: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
6eb0: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
6ec0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
6ed0: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
6ee0: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
6ef0: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
6f00: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
6f10: 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43  ntinue, nResultC
6f20: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
6f30: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
6f40: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  lt);.        bre
6f50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6f60: 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d  }.    if( pSort=
6f70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
6f80: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
6f90: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
6fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
6fb0: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
6fc0: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
6fd0: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
6fe0: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
6ff0: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
7000: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
7010: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
7020: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
7030: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
7040: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
7050: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
7060: 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
7070: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
7080: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7090: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
70a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
70b0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
70c0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
70d0: 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  l, r1);.      sq
70e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
70f0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
7100: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
7110: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7120: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7130: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
7140: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7150: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
7160: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
7170: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
7180: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
7190: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
71a0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
71b0: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
71c0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
71d0: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
71e0: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
71f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7200: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
7210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7220: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7230: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
7240: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7250: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
7260: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
7270: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
7280: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
7290: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
72a0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
72b0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
72c0: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
72d0: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
72e0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
72f0: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7300: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7310: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7320: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
7330: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7340: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7350: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7370: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7380: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7390: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
73a0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
73b0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
73c0: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
73d0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
73e0: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
73f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7400: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7410: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7420: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7430: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7440: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7450: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7460: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7470: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7480: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7490: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
74a0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
74b0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
74c0: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
74d0: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
74e0: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
74f0: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7500: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7510: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7520: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
7530: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7540: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7550: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7560: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7570: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7580: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7590: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
75a0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
75b0: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
75c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
75d0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
75e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
75f0: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7600: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7610: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7620: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
7630: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7640: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7660: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
7670: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
7680: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61  , r1);.        a
7690: 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20  ssert( pSort==0 
76a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
76b0: 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  f.      if( pSor
76c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
76d0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
76e0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31  se, pSort, p, r1
76f0: 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67 52  +nPrefixReg,regR
7700: 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52  esult,1,nPrefixR
7710: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
7720: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
7730: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7740: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7760: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7770: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
7780: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7790: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
77a0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
77b0: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
77c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
77d0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
77e0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
77f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7800: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7810: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
7820: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
7830: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
7840: 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52  se, r1, nPrefixR
7850: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65  eg+1);.      bre
7860: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
7870: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7880: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
7890: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
78a0: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
78b0: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
78c0: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
78d0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
78e0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
78f0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
7900: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
7910: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
7920: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
7930: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
7940: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
7950: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
7960: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
7970: 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20  esultCol==1 );. 
7980: 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
7990: 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  dst =.          
79a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
79b0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
79c0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
79d0: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  r, pDest->affSds
79e0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t);.      if( pS
79f0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ort ){.        /
7a00: 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63  * At first glanc
7a10: 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e  e you would thin
7a20: 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d  k we could optim
7a30: 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ize out the.    
7a40: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
7a50: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e  in this case sin
7a60: 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  ce the order of 
7a70: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73  entries in the s
7a80: 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  et.        ** do
7a90: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  es not matter.  
7aa0: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
7ab0: 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  be a LIMIT claus
7ac0: 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20  e, in which.    
7ad0: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20      ** case the 
7ae0: 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65  order does matte
7af0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73  r */.        pus
7b00: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
7b10: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
7b20: 67 52 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75  gResult, regResu
7b30: 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  lt, 1, nPrefixRe
7b40: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
7b50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
7b60: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7b70: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7b80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7b90: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
7ba0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
7bb0: 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d  lt,1,r1, &pDest-
7bc0: 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20  >affSdst, 1);.  
7bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7be0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
7bf0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
7c00: 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20  Result, 1);.    
7c10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7c20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
7c30: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
7c40: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7c50: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7c60: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
7c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7c80: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7c90: 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
7ca0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
7cb0: 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
7cc0: 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
7cd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
7ce0: 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
7cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7d00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7d10: 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b  eger, 1, iParm);
7d20: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
7d30: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
7d40: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
7d50: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
7d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7d70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
7d80: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
7d90: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
7da0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
7db0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
7dc0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
7dd0: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
7de0: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
7df0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
7e00: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
7e10: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
7e20: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
7e30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
7e40: 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a  ResultCol==1 );.
7e50: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
7e60: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
7e70: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7e80: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7e90: 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74  esult, regResult
7ea0: 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29  , 1, nPrefixReg)
7eb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7ec0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
7ed0: 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20  egResult==iParm 
7ee0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
7ef0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
7f00: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
7f10: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
7f20: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
7f30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7f40: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
7f50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
7f60: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73  UERY */..    cas
7f70: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
7f80: 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64         /* Send d
7f90: 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74  ata to a co-rout
7fa0: 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ine */.    case 
7fb0: 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20  SRT_Output: {   
7fc0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
7fd0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7fe0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ff0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
8000: 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ne );.      test
8010: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
8020: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
8030: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
8040: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
8050: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
8060: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
8070: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
8080: 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20  sultCol,.       
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
80b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
80c0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
80d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
80e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
80f0: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
8100: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
8110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8130: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
8140: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
8150: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
8160: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8170: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
8180: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
8190: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
81a0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
81b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
81c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
81d0: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
81e0: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
81f0: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
8200: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
8210: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
8220: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
8230: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
8240: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
8250: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
8260: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
8270: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
8280: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
8290: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
82a0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
82b0: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
82c0: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
82d0: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
82e0: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
82f0: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
8300: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
8310: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
8320: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
8330: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
8340: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
8350: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
8360: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
8370: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
8380: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
8390: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
83a0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
83b0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
83c0: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
83d0: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
83e0: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
83f0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
8400: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
8410: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
8420: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
8430: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8440: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
8450: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
8460: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
8470: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
8480: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
8490: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
84a0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
84b0: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
84c0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
84d0: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
84e0: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
84f0: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
8500: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
8510: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
8520: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
8530: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
8540: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
8550: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
8560: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
8570: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
8580: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
8590: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
85a0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
85b0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85d0: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
85e0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
85f0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
8600: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
8610: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8620: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8630: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
8640: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8650: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
8660: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
8670: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
8680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8690: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
86a0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
86b0: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
86c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
86d0: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
86e0: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
86f0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
8700: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
8710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8720: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
8730: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
8760: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
8770: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
87a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
87b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
87c0: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
87d0: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
87e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
87f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
8800: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
8810: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
8820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8830: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
8840: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
8850: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
8860: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
8870: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
8880: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8890: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
88a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
88b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
88c0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
88d0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
88e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
88f0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8900: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
8910: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
8920: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
8930: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
8940: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
8950: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
8960: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
8970: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
8980: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
8990: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
89a0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
89b0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
89c0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
89d0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
89e0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
89f0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
8a00: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
8a10: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
8a20: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
8a30: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
8a40: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8a50: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
8a60: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
8a70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8a80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
8a90: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
8aa0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
8ab0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
8ac0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
8ad0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
8ae0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
8af0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
8b00: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
8b10: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
8b20: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
8b30: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
8b40: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
8b50: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
8b60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8b70: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
8b80: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
8b90: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
8ba0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
8bb0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
8bc0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
8bd0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
8be0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
8bf0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
8c00: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
8c10: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
8c20: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
8c30: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
8c40: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
8c50: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
8c60: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
8c70: 2b 31 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  +1);.  KeyInfo *
8c80: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
8c90: 63 28 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  c(sizeof(KeyInfo
8ca0: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
8cb0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
8cc0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
8cd0: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
8ce0: 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  .    p->nField =
8cf0: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
8d00: 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58  nXField = (u16)X
8d10: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
8d20: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
8d30: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
8d40: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
8d50: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
8d60: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
8d70: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
8d80: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
8d90: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
8da0: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
8db0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
8dc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
8dd0: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
8de0: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
8df0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8e00: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
8e10: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
8e20: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
8e30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
8e40: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
8e50: 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e   Make a new poin
8e60: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
8e70: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e   object.*/.KeyIn
8e80: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
8e90: 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  foRef(KeyInfo *p
8ea0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
8eb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
8ec0: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
8ed0: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ef++;.  }.  retu
8ee0: 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn p;.}..#ifdef 
8ef0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
8f00: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8f10: 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  f a KeyInfo obje
8f20: 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ct can be change
8f30: 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f  .  The KeyInfo o
8f40: 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c  bject.** can onl
8f50: 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20  y be changed if 
8f60: 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73  this is just a s
8f70: 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20  ingle reference 
8f80: 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a  to the object..*
8f90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8fa0: 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69  e is used only i
8fb0: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
8fc0: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
8fd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49  .int sqlite3KeyI
8fe0: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b  nfoIsWriteable(K
8ff0: 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75  eyInfo *p){ retu
9000: 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d  rn p->nRef==1; }
9010: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9020: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
9030: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
9040: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
9050: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
9060: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
9070: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
9080: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
9090: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
90a0: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
90b0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
90c0: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
90d0: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
90e0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
90f0: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
9100: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
9110: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
9120: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9130: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
9140: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
9150: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
9160: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
9170: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
9180: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
9190: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
91a0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
91b0: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
91c0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
91d0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
91e0: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
91f0: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
9200: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
9210: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
9220: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
9230: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
9240: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
9250: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
9260: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
9270: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
9280: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
9290: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
92a0: 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
92b0: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
92c0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
92d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
92e0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
92f0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9300: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9310: 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68  ,     /* Form th
9320: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
9330: 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c   from this ExprL
9340: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ist */.  int iSt
9350: 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  art,          /*
9360: 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73   Begin with this
9370: 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74   column of pList
9380: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
9390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
93a0: 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72  d this many extr
93b0: 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  a columns to the
93c0: 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   end */.){.  int
93d0: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
93e0: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
93f0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9400: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
9410: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9420: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  >db;.  int i;.. 
9430: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
9440: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
9450: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
9460: 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69  lloc(db, nExpr-i
9470: 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29  Start, nExtra+1)
9480: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
9490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
94a0: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
94b0: 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b  teable(pInfo) );
94c0: 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72  .    for(i=iStar
94d0: 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  t, pItem=pList->
94e0: 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70  a+iStart; i<nExp
94f0: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
9500: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
9510: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
9520: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
9530: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
9540: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
9550: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
9560: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
9570: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
9580: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69  pInfo->aColl[i-i
9590: 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  Start] = pColl;.
95a0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
95b0: 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74  rtOrder[i-iStart
95c0: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
95d0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
95e0: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
95f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  }../*.** Name of
9600: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9610: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
9620: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
9630: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
9640: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
9650: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
9660: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
9670: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
9680: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
9690: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
96a0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
96b0: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
96c0: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
96d0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
96e0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
96f0: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
9700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9710: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
9720: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
9730: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9740: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
9750: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9760: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
9770: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
9780: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
9790: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
97a0: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
97b0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
97c0: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
97d0: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
97e0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
97f0: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
9800: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
9810: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
9820: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
9830: 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42  **   "USE TEMP B
9840: 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a  -TREE FOR xxx".*
9850: 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69  *.** where xxx i
9860: 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e  s one of "DISTIN
9870: 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20  CT", "ORDER BY" 
9880: 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45  or "GROUP BY". E
9890: 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20  xactly which.** 
98a0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
98b0: 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75   the zUsage argu
98c0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
98d0: 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70  void explainTemp
98e0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
98f0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
9900: 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20  *zUsage){.  if( 
9910: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
9920: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
9930: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9940: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
9950: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
9960: 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
9970: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
9980: 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29  FOR %s", zUsage)
9990: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
99a0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
99b0: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
99c0: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
99d0: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
99e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
99f0: 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f  Assign expressio
9a00: 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e  n b to lvalue a.
9a10: 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70   A second, no-op
9a20: 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  , version of thi
9a30: 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72  s macro.** is pr
9a40: 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49  ovided when SQLI
9a50: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
9a60: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
9a70: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65   allows the code
9a80: 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65  .** in sqlite3Se
9a90: 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e  lect() to assign
9aa0: 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63   values to struc
9ab0: 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69  ture member vari
9ac0: 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e  ables that.** on
9ad0: 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49  ly exist if SQLI
9ae0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
9af0: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77  is not defined w
9b00: 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67  ithout polluting
9b10: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
9b20: 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74  h #ifndef direct
9b30: 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e  ives..*/.# defin
9b40: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
9b50: 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a  ger(a, b) a = b.
9b60: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
9b70: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
9b80: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
9b90: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
9ba0: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
9bb0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
9bc0: 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78  y,z).# define ex
9bd0: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
9be0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y,z).#endif..#if
9bf0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9c00: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26  _OMIT_EXPLAIN) &
9c10: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
9c20: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9c30: 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e  SELECT)./*.** Un
9c40: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
9c50: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
9c60: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
9c70: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
9c80: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
9c90: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
9ca0: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
9cb0: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
9cc0: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
9cd0: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
9ce0: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e  caption is of on
9cf0: 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72  e of the two for
9d00: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d  ms:.**.**   "COM
9d10: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
9d20: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
9d30: 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f  2 (op)".**   "CO
9d40: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
9d50: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
9d60: 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  b2 USING TEMP B-
9d70: 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a  TREE (op)".**.**
9d80: 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64   where iSub1 and
9d90: 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69   iSub2 are the i
9da0: 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61  ntegers passed a
9db0: 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
9dc0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
9dd0: 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20  parameters, and 
9de0: 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72  op is the text r
9df0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
9e00: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a   the parameter.*
9e10: 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  * of the same na
9e20: 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  me. The paramete
9e30: 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f  r "op" must be o
9e40: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
9e50: 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b  TK_EXCEPT,.** TK
9e60: 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b  _INTERSECT or TK
9e70: 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20  _ALL. The first 
9e80: 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20  form is used if 
9e90: 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70  argument bUseTmp
9ea0: 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f   is .** false, o
9eb0: 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  r the second for
9ec0: 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e  m if it is true.
9ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9ee0: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
9ef0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9f00: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9f10: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
9f20: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
9f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
9f50: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
9f60: 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a  _EXCEPT etc. */.
9f70: 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20    int iSub1,    
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
9fa0: 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62   1 */.  int iSub
9fb0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
9fc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
9fd0: 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e  ery id 2 */.  in
9fe0: 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20  t bUseTmp       
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a000: 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20   True if a temp 
a010: 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a  table was used *
a020: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f  /.){.  assert( o
a030: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f  p==TK_UNION || o
a040: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
a050: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
a060: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   || op==TK_ALL )
a070: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
a080: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
a090: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a0a0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
a0b0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
a0c0: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
a0d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
a0e0: 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45  "COMPOUND SUBQUE
a0f0: 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25  RIES %d AND %d %
a100: 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69  s(%s)", iSub1, i
a110: 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55  Sub2,.        bU
a120: 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d  seTmp?"USING TEM
a130: 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73  P B-TREE ":"", s
a140: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a  electOpName(op).
a150: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
a160: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a170: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
a180: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
a190: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
a1a0: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
a1b0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
a1c0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
a1d0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
a1e0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
a1f0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
a200: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77  ainComposite(v,w
a210: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
a220: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
a230: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
a240: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
a250: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
a260: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
a270: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
a280: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
a290: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
a2a0: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
a2b0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
a2c0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
a2d0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
a2e0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
a2f0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
a300: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
a310: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
a320: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
a330: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
a340: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
a350: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
a360: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a370: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
a380: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
a390: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a3a0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
a3b0: 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72  Sort,   /* Infor
a3c0: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52  mation on the OR
a3d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
a3e0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
a3f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a400: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
a410: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
a420: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
a430: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
a440: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
a450: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a460: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a480: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
a490: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
a4a0: 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53  t addrBreak = pS
a4b0: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20  ort->labelDone; 
a4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
a4d0: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
a4e0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
a4f0: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  drContinue = sql
a500: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
a510: 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68  l(v);  /* Jump h
a520: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
a530: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
a540: 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65  ;.  int addrOnce
a550: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
a560: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
a570: 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e  rderBy = pSort->
a580: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
a590: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
a5a0: 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72  Dest;.  int iPar
a5b0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
a5c0: 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  rm;.  int regRow
a5d0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  ;.  int regRowid
a5e0: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ;.  int nKey;.  
a5f0: 69 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20  int iSortTab;   
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 2f 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72  /* Sorter cursor
a620: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
a630: 0a 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61  .  int nSortData
a640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a650: 20 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76     /* Trailing v
a660: 61 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72  alues to read fr
a670: 6f 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69  om sorter */.  i
a680: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71  nt i;.  int bSeq
a690: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a6a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
a6b0: 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  if sorter record
a6c0: 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e   includes seq. n
a6d0: 6f 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  o. */.#ifdef SQL
a6e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
a6f0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74  IN_COMMENTS.  st
a700: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
a710: 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e  em *aOutEx = p->
a720: 70 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69  pEList->a;.#endi
a730: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  f..  assert( add
a740: 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66  rBreak<0 );.  if
a750: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
a760: 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
a770: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a780: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
a790: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
a7a0: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
a7b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
a7c0: 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b  oto(v, addrBreak
a7d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a7e0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
a7f0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
a800: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62  Out);.  }.  iTab
a810: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
a820: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
a830: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
a840: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
a850: 69 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  ine ){.    regRo
a860: 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67  wid = 0;.    reg
a870: 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  Row = pDest->iSd
a880: 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74  st;.    nSortDat
a890: 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  a = nColumn;.  }
a8a0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
a8b0: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
a8c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a8d0: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c      regRow = sql
a8e0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a8f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72  Parse);.    nSor
a900: 74 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  tData = 1;.  }. 
a910: 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79   nKey = pOrderBy
a920: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
a930: 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70  >nOBSat;.  if( p
a940: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
a950: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
a960: 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rter ){.    int 
a970: 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70  regSortOut = ++p
a980: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
a990: 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72   iSortTab = pPar
a9a0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
a9b0: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
a9c0: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61  BkOut ){.      a
a9d0: 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65  ddrOnce = sqlite
a9e0: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
a9f0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
aa00: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
aa10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
aa20: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
aa30: 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53  , iSortTab, regS
aa40: 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e  ortOut, nKey+1+n
aa50: 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69  SortData);.    i
aa60: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
aa70: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
aa80: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
aa90: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
aaa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
aab0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
aac0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
aad0: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
aae0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
aaf0: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
ab00: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
ab10: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
ab20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ab30: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
ab40: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
ab50: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
ab60: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
ab70: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
ab80: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
ab90: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
aba0: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
abb0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
abc0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
abd0: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
abe0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
abf0: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
ac00: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
ac10: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
ac20: 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69  ; i<nSortData; i
ac30: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
ac40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ac50: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
ac60: 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20  b, nKey+bSeq+i, 
ac70: 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56  regRow+i);.    V
ac80: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ac90: 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  %s", aOutEx[i].z
aca0: 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d  Name ? aOutEx[i]
acb0: 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b  .zName : aOutEx[
acc0: 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a  i].zSpan));.  }.
acd0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
ace0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
acf0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
ad00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ad10: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
ad20: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
ad30: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
ad40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ad50: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
ad60: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
ad70: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
ad80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
ad90: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
ada0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
adb0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
adc0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
add0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
ade0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
adf0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
ae00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ae10: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
ae20: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
ae30: 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  Row, 1, regRowid
ae40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ae50: 20 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74            &pDest
ae60: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
ae70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ae80: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
ae90: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
aea0: 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ow, 1);.      sq
aeb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aec0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
aed0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
aee0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
aef0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
af00: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
af10: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
af20: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
af30: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
af40: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
af50: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
af60: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
af70: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
af80: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
af90: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
afa0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
afb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
afc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
afd0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
afe0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
aff0: 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20  routine ); .    
b000: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
b010: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
b020: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b030: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
b040: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69  utine );.      i
b050: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
b060: 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
b070: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b080: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
b090: 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  w, pDest->iSdst,
b0a0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
b0b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
b0c0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
b0d0: 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d  e(pParse, pDest-
b0e0: 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  >iSdst, nColumn)
b0f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b110: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
b120: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
b130: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
b140: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b150: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52  }.  }.  if( regR
b160: 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  owid ){.    sqli
b170: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b180: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
b190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
b1a0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
b1b0: 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  rse, regRowid);.
b1c0: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74    }.  /* The bot
b1d0: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
b1e0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
b1f0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
b200: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
b210: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
b220: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
b230: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
b240: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b250: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
b260: 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  erNext, iTab, ad
b270: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
b280: 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(v);.  }else{. 
b290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b2a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
b2b0: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
b2c0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b2d0: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
b2e0: 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69  regReturn ) sqli
b2f0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b300: 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72   OP_Return, pSor
b310: 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  t->regReturn);. 
b320: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
b330: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
b340: 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Break);.}../*.**
b350: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
b360: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
b370: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
b380: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
b390: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
b3a0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
b3b0: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
b3c0: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
b3d0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
b3e0: 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f  *.** Also try to
b3f0: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69   estimate the si
b400: 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ze of the return
b410: 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74  ed value and ret
b420: 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  urn that.** resu
b430: 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68  lt in *pEstWidth
b440: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
b450: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
b460: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
b470: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
b480: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
b490: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
b4a0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b4b0: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
b4c0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
b4d0: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
b4e0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
b4f0: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
b500: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
b510: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
b520: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
b530: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
b540: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
b550: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
b560: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
b570: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
b580: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
b590: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
b5a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b5b0: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
b5c0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
b5d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
b5e0: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
b5f0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
b600: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
b610: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
b620: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
b630: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
b640: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
b650: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
b660: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
b670: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
b680: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
b690: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
b6a0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
b6b0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
b6c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b6d0: 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33  ine has either 3
b6e0: 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73   or 6 parameters
b6f0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
b700: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
b710: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
b720: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b730: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  A compile-time o
b740: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
b750: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
b760: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b770: 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20  TADATA.# define 
b780: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
b790: 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79  ,D,E,F) columnTy
b7a0: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
b7b0: 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ,F).#else /* if 
b7c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b7d0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b7e0: 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66  TADATA) */.# def
b7f0: 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41  ine columnType(A
b800: 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75  ,B,C,D,E,F) colu
b810: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46  mnTypeImpl(A,B,F
b820: 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
b830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
b840: 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61  mnTypeImpl(.  Na
b850: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
b860: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
b870: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b880: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b890: 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68 61  DATA.  const cha
b8a0: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
b8b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
b8c0: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
b8d0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
b8e0: 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a 70  ,.#endif.  u8 *p
b8f0: 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68  EstWidth.){.  ch
b900: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
b910: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
b920: 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b  u8 estWidth = 1;
b930: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b940: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b950: 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e  ADATA.  char con
b960: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
b970: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b980: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
b990: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
b9a0: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Col = 0;.#endif.
b9b0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
b9c0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b9d0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
b9e0: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
b9f0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
ba00: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
ba10: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
ba20: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
ba30: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
ba40: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
ba50: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
ba60: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
ba70: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
ba80: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
ba90: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
baa0: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
bab0: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
bac0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
bad0: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
bae0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
baf0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
bb00: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
bb10: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
bb20: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
bb30: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
bb40: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
bb50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
bb60: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
bb70: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
bb80: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
bb90: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
bba0: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
bbb0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
bbc0: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74   pTab */.      t
bbd0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
bbe0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
bbf0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
bc00: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
bc10: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
bc20: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
bc30: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
bc40: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
bc50: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
bc60: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
bc70: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
bc80: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
bc90: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
bca0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
bcb0: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
bcc0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
bcd0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
bce0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
bcf0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
bd00: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
bd10: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
bd20: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
bd30: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
bd40: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
bd50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
bd60: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
bd70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
bd80: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
bd90: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
bda0: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
bdb0: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
bdc0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
bdd0: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
bde0: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
bdf0: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
be00: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
be10: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
be20: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
be30: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
be40: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
be50: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
be60: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
be70: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
be80: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
be90: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
bea0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
beb0: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
bec0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
bed0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
bee0: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
bef0: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
bf00: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
bf10: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
bf20: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
bf30: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
bf40: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
bf50: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
bf60: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
bf70: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
bf80: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
bf90: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
bfa0: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
bfb0: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
bfc0: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
bfd0: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
bfe0: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
bff0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
c000: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
c010: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
c020: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
c030: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
c040: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
c050: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
c060: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
c070: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
c080: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
c090: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
c0a0: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
c0b0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
c0c0: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
c0d0: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
c0e0: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
c0f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c100: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
c110: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
c120: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
c130: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
c140: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
c150: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
c160: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
c170: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
c180: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
c190: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
c1a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
c1b0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
c1c0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
c1d0: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
c1e0: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
c1f0: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
c200: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
c210: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
c220: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
c230: 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  >=0 && ALWAYS(iC
c240: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
c250: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
c260: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
c270: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
c280: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
c290: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
c2a0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
c2b0: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
c2c0: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
c2d0: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
c2e0: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
c2f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
c300: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
c310: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
c320: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
c330: 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
c340: 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 41 4c         ** The AL
c350: 57 41 59 53 28 29 20 69 73 20 62 65 63 61 75 73  WAYS() is becaus
c360: 65 20 69 43 6f 6c 3e 3d 70 53 2d 3e 70 45 4c 69  e iCol>=pS->pELi
c370: 73 74 2d 3e 6e 45 78 70 72 20 77 69 6c 6c 20 68  st->nExpr will h
c380: 61 76 65 20 62 65 65 6e 0a 20 20 20 20 20 20 20  ave been.       
c390: 20 20 20 2a 2a 20 63 61 75 67 68 74 20 61 6c 72     ** caught alr
c3a0: 65 61 64 79 20 62 79 20 6e 61 6d 65 20 72 65 73  eady by name res
c3b0: 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  olution..       
c3c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
c3d0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
c3e0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
c3f0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
c400: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
c410: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
c420: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
c430: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
c440: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
c450: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
c460: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
c470: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
c480: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
c490: 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c  sNC, p,&zOrigDb,
c4a0: 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67  &zOrigTab,&zOrig
c4b0: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
c4c0: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
c4d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
c4e0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
c4f0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
c500: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
c510: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
c520: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
c530: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
c540: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
c550: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
c560: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
c570: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
c580: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
c590: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c5a0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20  METADATA.       
c5b0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
c5c0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c5d0: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
c5e0: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
c5f0: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
c600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c610: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
c620: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
c630: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
c640: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 53  zType = sqlite3S
c650: 74 72 4e 65 78 74 28 7a 4f 72 69 67 43 6f 6c 29  trNext(zOrigCol)
c660: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
c670: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
c680: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
c690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c6a0: 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62   zOrigTab = pTab
c6b0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
c6c0: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
c6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
c6e0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
c6f0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
c700: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
c710: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
c720: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20          zOrigDb 
c730: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
c740: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
c750: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c  e;.        }.#el
c760: 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  se.        if( i
c770: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
c780: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
c790: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  GER";.        }e
c7a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
c7b0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Type = sqlite3St
c7c0: 72 4e 65 78 74 28 70 54 61 62 2d 3e 61 43 6f 6c  rNext(pTab->aCol
c7d0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
c7e0: 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64 74           estWidt
c7f0: 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  h = pTab->aCol[i
c800: 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20  Col].szEst;.    
c810: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
c820: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
c830: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
c840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
c850: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
c860: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
c870: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c880: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
c890: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
c8a0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
c8b0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
c8c0: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
c8d0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
c8e0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c8f0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
c900: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
c910: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
c920: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
c930: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
c940: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pS = pExpr->x.p
c950: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
c960: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
c970: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
c980: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
c990: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
c9a0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
c9b0: 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
c9c0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
c9d0: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
c9e0: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
c9f0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
ca00: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
ca10: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
ca20: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
ca30: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
ca40: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65  b, &zOrigCol, &e
ca50: 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20  stWidth); .     
ca60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
ca70: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
ca80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
ca90: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
caa0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
cab0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
cac0: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
cad0: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
cae0: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
caf0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
cb00: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
cb10: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
cb20: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
cb30: 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69 64  if.  if( pEstWid
cb40: 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68 20  th ) *pEstWidth 
cb50: 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72 65  = estWidth;.  re
cb60: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
cb70: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
cb80: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
cb90: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
cba0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
cbb0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
cbc0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
cbd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cbe0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
cbf0: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
cc00: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
cc10: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
cc20: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
cc30: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
cc40: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
cc50: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
cc60: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
cc70: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
cc80: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
cc90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cca0: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
ccb0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ccc0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
ccd0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
cce0: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
ccf0: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
cd00: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
cd10: 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rse;.  for(i=0; 
cd20: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
cd30: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
cd40: 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *p = pEList->a[i
cd50: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e  ].pExpr;.    con
cd60: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
cd70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cd80: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
cd90: 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63  DATA.    const c
cda0: 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  har *zOrigDb = 0
cdb0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
cdc0: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
cdd0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cde0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20  zOrigCol = 0;.  
cdf0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
ce00: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
ce10: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
ce20: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29  b, &zOrigCol, 0)
ce30: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
ce40: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
ce50: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
ce60: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
ce70: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
ce80: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
ce90: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
cea0: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
ceb0: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
cec0: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
ced0: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
cee0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
cef0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
cf00: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
cf10: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
cf20: 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  gDb, SQLITE_TRAN
cf30: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
cf40: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
cf50: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
cf60: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
cf70: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
cf80: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
cf90: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
cfa0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
cfb0: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51  MN, zOrigCol, SQ
cfc0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
cfd0: 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65  .#else.    zType
cfe0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
cff0: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20  NC, p, 0, 0, 0, 
d000: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
d010: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d020: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d030: 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79  ME_DECLTYPE, zTy
d040: 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  pe, SQLITE_TRANS
d050: 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  IENT);.  }.#endi
d060: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
d070: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
d080: 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  PE) */.}../*.** 
d090: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
d0a0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
d0b0: 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20   VDBE the names 
d0c0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
d0d0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
d0e0: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
d0f0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  on is used to pr
d100: 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43  ovide the.** azC
d110: 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74  ol[] values in t
d120: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
d130: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
d140: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
d150: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d160: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
d170: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
d180: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
d190: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
d1a0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
d1b0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
d1c0: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
d1d0: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
d1e0: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
d1f0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
d200: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
d210: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d220: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
d230: 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68  nt fullNames, sh
d240: 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64  ortNames;..#ifnd
d250: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
d260: 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74  XPLAIN.  /* If t
d270: 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
d280: 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65  N, skip this ste
d290: 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  p */.  if( pPars
d2a0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
d2b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
d2c0: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72  ndif..  if( pPar
d2d0: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
d2e0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
d2f0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
d300: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
d310: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
d320: 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  st!=0 );.  pPars
d330: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
d340: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20   1;.  fullNames 
d350: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
d360: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
d370: 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e  es)!=0;.  shortN
d380: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
d390: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
d3a0: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
d3b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
d3c0: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
d3d0: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
d3e0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
d3f0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
d400: 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xpr *p;.    p = 
d410: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
d420: 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  pr;.    if( NEVE
d430: 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  R(p==0) ) contin
d440: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
d450: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
d460: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
d470: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
d480: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
d490: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d4a0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d4b0: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
d4c0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d4d0: 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T);.    }else if
d4e0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
d4f0: 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  MN || p->op==TK_
d500: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
d510: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
d520: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
d530: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
d540: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
d550: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41        for(j=0; A
d560: 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74  LWAYS(j<pTabList
d570: 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20  ->nSrc); j++){. 
d580: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c         if( pTabL
d590: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
d5a0: 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62  r==p->iTable ) b
d5b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d5c0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
d5d0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
d5e0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
d5f0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
d600: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
d610: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
d620: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
d630: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
d640: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
d650: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
d660: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
d670: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
d680: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
d690: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d6a0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
d6b0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
d6c0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
d6d0: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
d6e0: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29   && !fullNames )
d6f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d700: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d710: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d720: 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ME, .           
d730: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
d740: 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  (db, pEList->a[i
d750: 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45  ].zSpan), SQLITE
d760: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
d770: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
d780: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
d790: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
d7a0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
d7b0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
d7c0: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
d7d0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b  b->zName, zCol);
d7e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d7f0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d800: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
d810: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
d820: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
d830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d840: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d850: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d860: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
d870: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d880: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
d8a0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69  t char *z = pELi
d8b0: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
d8c0: 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f        z = z==0 ?
d8d0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
d8e0: 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  db, "column%d", 
d8f0: 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62  i+1) : sqlite3Db
d900: 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20  StrDup(db, z);. 
d910: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d920: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d930: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d940: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
d950: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67  );.    }.  }.  g
d960: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
d970: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
d980: 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a  ist, pEList);.}.
d990: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
d9a0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
d9b0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
d9c0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
d9d0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
d9e0: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
d9f0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
da00: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
da10: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
da20: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
da30: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
da40: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
da50: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
da60: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
da70: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
da80: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
da90: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
daa0: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
dab0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
dac0: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
dad0: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
dae0: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
daf0: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
db00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
db10: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
db20: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
db30: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
db40: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
db50: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
db60: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
db70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
db80: 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  M..*/.int sqlite
db90: 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
dba0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
dbb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
dbc0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
dbd0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
dbe0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
dbf0: 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f  /* Expr list fro
dc00: 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76  m which to deriv
dc10: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
dc20: 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20  /.  i16 *pnCol, 
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
dc40: 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
dc50: 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20  of columns here 
dc60: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61  */.  Column **pa
dc70: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Col          /* 
dc80: 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f  Write the new co
dc90: 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a  lumn list here *
dca0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
dcb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
dcc0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
dcd0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
dce0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
dcf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
dd00: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
dd10: 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20   u32 cnt;       
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd30: 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d  Index added to m
dd40: 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69  ake the name uni
dd50: 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  que */.  Column 
dd60: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20  *aCol, *pCol;   
dd70: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
dd80: 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20  ing over result 
dd90: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
dda0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
ddb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ddc0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
ddd0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
dde0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20  */.  Expr *p;   
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
de10: 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  or a single resu
de20: 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  lt column */.  c
de30: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
de40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
de50: 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  lumn name */.  i
de60: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
de70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
de80: 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e  ze of name in zN
de90: 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20  ame[] */.  Hash 
dea0: 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ht;             
deb0: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
dec0: 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  able of column n
ded0: 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74  ames */..  sqlit
dee0: 65 33 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b  e3HashInit(&ht);
def0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b  .  if( pEList ){
df00: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69  .    nCol = pELi
df10: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
df20: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Col = sqlite3DbM
df30: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
df40: 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43  zeof(aCol[0])*nC
df50: 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ol);.    testcas
df60: 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e( aCol==0 );.  
df70: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
df80: 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20  = 0;.    aCol = 
df90: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
dfa0: 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c   nCol==(i16)nCol
dfb0: 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e   );.  *pnCol = n
dfc0: 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20  Col;.  *paCol = 
dfd0: 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  aCol;..  for(i=0
dfe0: 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e  , pCol=aCol; i<n
dff0: 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Col && !db->mall
e000: 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70  ocFailed; i++, p
e010: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47  Col++){.    /* G
e020: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
e030: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
e040: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
e050: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
e060: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
e070: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
e080: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
e090: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
e0a0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
e0b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
e0c0: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
e0d0: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
e0e0: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
e0f0: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
e100: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
e110: 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70  pr *pColExpr = p
e120: 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73  ;  /* The expres
e130: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65  sion that is the
e140: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
e150: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62  ame */.      Tab
e160: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
e170: 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63    /* Table assoc
e180: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
e190: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
e1a0: 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45      while( pColE
e1b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
e1c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45  ){.        pColE
e1d0: 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
e1e0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
e1f0: 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72  assert( pColExpr
e200: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
e210: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70       if( pColExp
e220: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
e230: 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45   && ALWAYS(pColE
e240: 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  xpr->pTab!=0) ){
e250: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
e260: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
e270: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
e280: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
e290: 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
e2a0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
e2b0: 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70    pTab = pColExp
e2c0: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
e2d0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
e2e0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
e2f0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
e300: 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62  = iCol>=0 ? pTab
e310: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
e320: 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20  me : "rowid";.  
e330: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
e340: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  olExpr->op==TK_I
e350: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  D ){.        ass
e360: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
e370: 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20  perty(pColExpr, 
e380: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
e390: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
e3a0: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
e3b0: 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  en;.      }else{
e3c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
e3d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
e3e0: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
e3f0: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
e400: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
e410: 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74    zName = pEList
e420: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20  ->a[i].zSpan;.  
e430: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e440: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
e450: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
e460: 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a   zName);..    /*
e470: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
e480: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
e490: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
e4a0: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
e4b0: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
e4c0: 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68  an integer to th
e4d0: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
e4e0: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
e4f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74  ..    */.    cnt
e500: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
e510: 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65   zName && sqlite
e520: 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a  3HashFind(&ht, z
e530: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
e540: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
e550: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
e560: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d  ;.      if( nNam
e570: 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  e>0 ){.        f
e580: 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e  or(j=nName-1; j>
e590: 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  0 && sqlite3Isdi
e5a0: 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a  git(zName[j]); j
e5b0: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
e5c0: 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20  ( zName[j]==':' 
e5d0: 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20  ) nName = j;.   
e5e0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65     }.      zName
e5f0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
e600: 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c  f(db, "%.*z:%u",
e610: 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b   nName, zName, +
e620: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  +cnt);.      if(
e630: 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33   cnt>3 ) sqlite3
e640: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
e650: 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a  of(cnt), &cnt);.
e660: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
e670: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
e680: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
e690: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
e6a0: 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20  me(0, pCol);.   
e6b0: 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71   if( zName && sq
e6c0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
e6d0: 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c  &ht, zName, pCol
e6e0: 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20  )==pCol ){.     
e6f0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
e700: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
e710: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
e720: 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64  ar(&ht);.  if( d
e730: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e740: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
e750: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
e760: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e770: 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b, aCol[j].zName
e780: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
e790: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
e7a0: 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c  Col);.    *paCol
e7b0: 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c   = 0;.    *pnCol
e7c0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
e7d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
e7e0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
e7f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e800: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
e810: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
e820: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
e830: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
e840: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
e850: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
e860: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
e870: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
e880: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
e890: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
e8a0: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
e8b0: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
e8c0: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
e8d0: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
e8e0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
e8f0: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
e900: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
e910: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
e920: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
e930: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
e940: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
e950: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
e960: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
e970: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73  e resolved..*/.s
e980: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
e990: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
e9a0: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
e9b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e9c0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e9d0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62  ontexts */.  Tab
e9e0: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
e9f0: 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e     /* Add column
ea00: 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f   type informatio
ea10: 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  n to this table 
ea20: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
ea30: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
ea40: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
ea50: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
ea60: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
ea70: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
ea80: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ea90: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
eaa0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
eab0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
eac0: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
ead0: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
eae0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
eaf0: 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20  ;.  u64 szAll = 
eb00: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
eb10: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73  elect!=0 );.  as
eb20: 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e  sert( (pSelect->
eb30: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
eb40: 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20  solved)!=0 );.  
eb50: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
eb60: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
eb70: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
eb80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
eb90: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
eba0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
ebb0: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
ebc0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
ebd0: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
ebe0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
ebf0: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
ec00: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
ec10: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(i=0, pCol=pTa
ec20: 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  b->aCol; i<pTab-
ec30: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
ec40: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69  ++){.    p = a[i
ec50: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6c  ].pExpr;.    col
ec60: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
ec70: 20 30 2c 20 30 2c 20 30 2c 20 26 70 43 6f 6c 2d   0, 0, 0, &pCol-
ec80: 3e 73 7a 45 73 74 29 3b 0a 20 20 20 20 73 7a 41  >szEst);.    szA
ec90: 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73  ll += pCol->szEs
eca0: 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  t;.    pCol->aff
ecb0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
ecc0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
ecd0: 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66      if( pCol->af
ece0: 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c  finity==0 ) pCol
ecf0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
ed00: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
ed10: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
ed20: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
ed30: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
ed40: 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e   pColl && pCol->
ed50: 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  zColl==0 ){.    
ed60: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
ed70: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ed80: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
ed90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
eda0: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  Tab->szTabRow = 
edb0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a  sqlite3LogEst(sz
edc0: 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  All*4);.}../*.**
edd0: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
ede0: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
edf0: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
ee00: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
ee10: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
ee20: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
ee30: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
ee40: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
ee50: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
ee60: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
ee70: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
ee80: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
ee90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
eea0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
eeb0: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
eec0: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
eed0: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
eee0: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
eef0: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
ef00: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
ef10: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
ef20: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
ef30: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
ef40: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
ef50: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
ef60: 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
ef70: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
ef80: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
ef90: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
efa0: 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
efb0: 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
efc0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
efd0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
efe0: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
eff0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
f000: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
f010: 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
f020: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73  SetOfSelect() is
f030: 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e   only used n con
f040: 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b  texts where look
f050: 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69  aside.  ** is di
f060: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65  sabled */.  asse
f070: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
f080: 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20  e.bDisable );.  
f090: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
f0a0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
f0b0: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
f0c0: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
f0d0: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
f0e0: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
f0f0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   );.  sqlite3Col
f100: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
f110: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
f120: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
f130: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
f140: 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64  ol);.  selectAdd
f150: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
f160: 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
f170: 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Tab, pSelect);. 
f180: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
f190: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
f1a0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f1b0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
f1c0: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
f1d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f1e0: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
f1f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
f200: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
f210: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
f220: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
f230: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
f240: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
f250: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
f260: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
f270: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
f280: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
f290: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
f2a0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
f2b0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
f2c0: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
f2d0: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
f2e0: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
f2f0: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
f300: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
f310: 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  v ) sqlite3VdbeA
f320: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp0(v, OP_Init
f330: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
f340: 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a  e->pToplevel==0.
f350: 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
f360: 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
f370: 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61  se->db,SQLITE_Fa
f380: 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20  ctorOutConst).  
f390: 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73    ){.      pPars
f3a0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
f3b0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d   = 1;.    }..  }
f3c0: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
f3d0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
f3e0: 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
f3f0: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
f400: 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
f410: 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
f420: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78  t and pOffset ex
f430: 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d  pressions.  pLim
f440: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68  it and pOffset h
f450: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
f460: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
f470: 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
f480: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
f490: 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
f4a0: 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
f4b0: 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
f4c0: 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
f4d0: 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
f4e0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
f4f0: 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
f500: 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
f510: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
f520: 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
f530: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
f540: 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
f550: 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
f560: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
f570: 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
f580: 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
f590: 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
f5a0: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
f5b0: 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
f5c0: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
f5d0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
f5e0: 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
f5f0: 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
f600: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
f610: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e  mit and pOffset.
f620: 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20    iLimit and.** 
f630: 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
f640: 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
f650: 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
f660: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a  efault values (z
f670: 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  ero).** prior to
f680: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
f690: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
f6a0: 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65   iOffset registe
f6b0: 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  r (if it exists)
f6c0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
f6d0: 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  to the value.** 
f6e0: 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20  of the OFFSET.  
f6f0: 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73  The iLimit regis
f700: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
f710: 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65  ed to LIMIT.  Re
f720: 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65  gister.** iOffse
f730: 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  t+1 is initializ
f740: 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53  ed to LIMIT+OFFS
f750: 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69  ET..**.** Only i
f760: 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70  f pLimit!=0 or p
f770: 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65  Offset!=0 do the
f780: 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
f790: 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65   get.** redefine
f7a0: 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  d.  The UNION AL
f7b0: 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20  L operator uses 
f7c0: 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f  this property to
f7d0: 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65   force.** the re
f7e0: 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  use of the same 
f7f0: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
f800: 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73   registers acros
f810: 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45  s multiple.** SE
f820: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
f830: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f840: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
f850: 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61  sters(Parse *pPa
f860: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
f870: 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56  int iBreak){.  V
f880: 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e  dbe *v = 0;.  in
f890: 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  t iLimit = 0;.  
f8a0: 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69  int iOffset;.  i
f8b0: 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69  nt n;.  if( p->i
f8c0: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a  Limit ) return;.
f8d0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d  .  /* .  ** "LIM
f8e0: 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68  IT -1" always sh
f8f0: 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54  ows all rows.  T
f900: 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a  here is some.  *
f910: 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62  * controversy ab
f920: 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72  out what the cor
f930: 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68  rect behavior sh
f940: 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68  ould be..  ** Th
f950: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
f960: 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72  entation interpr
f970: 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f  ets "LIMIT 0" to
f980: 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f   mean.  ** no ro
f990: 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ws..  */.  sqlit
f9a0: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
f9b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
f9c0: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
f9d0: 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d  0 || p->pLimit!=
f9e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  0 );.  if( p->pL
f9f0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
fa00: 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
fa10: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
fa20: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
fa30: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
fa40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
fa50: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
fa60: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
fa70: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29  r(p->pLimit, &n)
fa80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fa90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
faa0: 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
fab0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
fac0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
fad0: 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
fae0: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
faf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fb00: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
fb10: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
fb20: 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
fb30: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69  >nSelectRow>sqli
fb40: 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
fb50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
fb60: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
fb70: 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
fb80: 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  n);.        p->s
fb90: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69  elFlags |= SF_Fi
fba0: 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  xedLimit;.      
fbb0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
fbc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
fbd0: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
fbe0: 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  imit, iLimit);. 
fbf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fc00: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
fc10: 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
fc20: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
fc30: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
fc40: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
fc50: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
fc60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc70: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
fc80: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
fc90: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
fca0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fcb0: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
fcc0: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
fcd0: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
fce0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
fcf0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
fd00: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
fd10: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
fd20: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
fd30: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
fd40: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
fd50: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
fd60: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
fd70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fd80: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
fd90: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
fda0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fdb0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fdc0: 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
fdd0: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
fde0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fdf0: 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
fe00: 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
fe10: 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  t+1, iOffset);. 
fe20: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
fe30: 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
fe40: 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ET"));.    }.  }
fe50: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
fe60: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
fe70: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
fe80: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
fe90: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
fea0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
feb0: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
fec0: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
fed0: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
fee0: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
fef0: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
ff00: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
ff10: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
ff20: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
ff30: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
ff40: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
ff50: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
ff60: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
ff70: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
ff80: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
ff90: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
ffa0: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
ffb0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
ffc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
ffd0: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
ffe0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
fff0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
10000 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
10010 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
10020 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
10030 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
10040 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
10050 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
10060 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
10070 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
10080 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
10090 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43  ol>=0 );.  /* iC
100a0 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20  ol must be less 
100b0 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  than p->pEList->
100c0 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73  nExpr.  Otherwis
100d0 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64  e an error would
100e0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
100f0 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61  thrown during na
10100 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e  me resolution an
10110 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68  d we would not h
10120 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20  ave gotten.  ** 
10130 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66  this far */.  if
10140 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57  ( pRet==0 && ALW
10150 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69  AYS(iCol<p->pELi
10160 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
10170 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
10180 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
10190 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
101a0 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
101b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
101c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
101d0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
101e0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
101f0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
10200 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
10210 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
10220 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
10230 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
10240 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
10250 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
10260 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
10270 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
10280 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
10290 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
102a0 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
102b0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
102c0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
102d0 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
102e0 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
102f0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
10300 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
10310 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
10320 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
10330 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
10340 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
10350 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
10360 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
10370 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
10380 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
10390 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
103a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
103b0 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
103c0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
103d0 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
103e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
103f0 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
10400 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
10410 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
10420 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
10430 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
10440 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
10450 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
10460 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
10470 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
10480 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
10490 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
104a0 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
104b0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
104c0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
104d0 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
104e0 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
104f0 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
10500 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
10510 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
10520 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
10530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10540 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
10550 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
10560 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
10570 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
10580 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
10590 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
105a0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
105b0 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
105c0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
105d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
105e0 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
105f0 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
10600 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
10610 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
10620 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10630 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
10640 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
10650 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
10660 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
10670 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
10680 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
10690 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
106a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
106b0 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
106c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
106d0 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
106e0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
106f0 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
10700 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
10710 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
10720 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
10730 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
10740 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
10750 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
10760 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
10770 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
10780 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
107b0 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
107c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
107d0 0a 2a 2a 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 20 20 70 2d                p-
107f0 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
10810 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
10820 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
10830 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
10840 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
10850 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
10860 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
10870 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
10880 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
10890 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  >a[].fg.isRecurs
108a0 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20  ive flag..**.** 
108b0 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  The setup-query 
108c0 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e  runs once to gen
108d0 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c  erate an initial
108e0 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61   set of rows tha
108f0 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51  t go.** into a Q
10900 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77  ueue table.  Row
10910 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
10920 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74  from the Queue t
10930 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f  able one by.** o
10940 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78  ne.  Each row ex
10950 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
10960 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20  ue is output to 
10970 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65  pDest.  Then the
10980 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61   single.** extra
10990 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e  cted row (now in
109a0 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61   the iCurrent ta
109b0 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65  ble) becomes the
109c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
109d0 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  ** recursive-tab
109e0 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69  le for a recursi
109f0 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54  ve-query run.  T
10a00 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
10a10 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
10a20 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63  .** is added bac
10a30 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  k into the Queue
10a40 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e   table.  Then an
10a50 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74  other row is ext
10a60 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
10a70 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65  e.** and the ite
10a80 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ration continues
10a90 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
10aa0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
10ab0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
10ac0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65  mpound query ope
10ad0 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74  rator is UNION t
10ae0 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65  hen no duplicate
10af0 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a   rows are ever.*
10b00 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
10b10 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
10b20 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20    The iDistinct 
10b30 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f  table keeps a co
10b40 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a  py of all rows.*
10b50 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72  * that have ever
10b60 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
10b70 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61  nto Queue and ca
10b80 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20  uses duplicates 
10b90 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64  to be.** discard
10ba0 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72  ed.  If the oper
10bb0 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c  ator is UNION AL
10bc0 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74  L, then duplicat
10bd0 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  es are allowed..
10be0 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ** .** If the qu
10bf0 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52  ery has an ORDER
10c00 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65   BY, then entrie
10c10 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74  s in the Queue t
10c20 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e  able are kept in
10c30 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64  .** ORDER BY ord
10c40 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  er and the first
10c50 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63   entry is extrac
10c60 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63  ted for each cyc
10c70 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20  le.  Without.** 
10c80 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
10c90 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
10ca0 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a  just a FIFO..**.
10cb0 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c  ** If a LIMIT cl
10cc0 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64  ause is provided
10cd0 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
10ce0 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72  tion stops after
10cf0 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68   LIMIT rows.** h
10d00 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20  ave been output 
10d10 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d  to pDest.  A LIM
10d20 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73  IT of zero means
10d30 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f   to output no ro
10d40 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61  ws and a.** nega
10d50 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73  tive LIMIT means
10d60 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72   to output all r
10d70 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ows.  If there i
10d80 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54  s also an OFFSET
10d90 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20   clause.** with 
10da0 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
10db0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
10dc0 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20   OFFSET outputs 
10dd0 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61  are discarded ra
10de0 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69  ther.** than bei
10df0 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74  ng sent to pDest
10e00 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75  .  The LIMIT cou
10e10 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  nt does not begi
10e20 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46  n until after OF
10e30 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76  FSET.** rows hav
10e40 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a  e been skipped..
10e50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
10e60 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
10e70 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72  siveQuery(.  Par
10e80 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
10e90 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
10ea0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
10eb0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
10ec0 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76   /* The recursiv
10ed0 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63  e SELECT to be c
10ee0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
10ef0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
10f00 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
10f10 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
10f20 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
10f30 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
10f40 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
10f50 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
10f60 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
10f70 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   */.  int nCol =
10f80 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
10f90 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  r;  /* Number of
10fa0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
10fb0 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20  recursive table 
10fc0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
10fd0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
10fe0 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
10ff0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
11000 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
11010 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
11020 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  tup = p->pPrior;
11030 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20     /* The setup 
11040 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61  query */.  int a
11050 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
11060 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
11070 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
11080 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61   int addrCont, a
11090 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f  ddrBreak;      /
110a0 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42  * CONTINUE and B
110b0 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a  REAK addresses *
110c0 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  /.  int iCurrent
110d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
110e0 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74    /* The Current
110f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
11100 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20  regCurrent;     
11110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
11120 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75  ister holding Cu
11130 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
11140 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20   int iQueue;    
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11160 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c  * The Queue tabl
11170 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74  e */.  int iDist
11180 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20  inct = 0;       
11190 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72       /* To ensur
111a0 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73  e unique results
111b0 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69   if UNION */.  i
111c0 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46  nt eDest = SRT_F
111d0 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ifo;         /* 
111e0 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20  How to write to 
111f0 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63  Queue */.  Selec
11200 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b  tDest destQueue;
11210 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
11220 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e  ctDest targettin
11230 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  g the Queue tabl
11240 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
11270 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
11280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11290 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
112a0 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  t code */.  Expr
112b0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
112c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
112d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
112e0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
112f0 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20  it, *pOffset;   
11300 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d      /* Saved LIM
11310 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
11320 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c  .  int regLimit,
11330 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20   regOffset;     
11340 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73   /* Registers us
11350 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20  ed by LIMIT and 
11360 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20  OFFSET */..  /* 
11370 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61  Obtain authoriza
11380 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63  tion to do a rec
11390 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
113a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
113b0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
113c0 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c  QLITE_RECURSIVE,
113d0 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
113e0 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73  rn;..  /* Proces
113f0 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  s the LIMIT and 
11400 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20  OFFSET clauses, 
11410 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f  if they exist */
11420 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  .  addrBreak = s
11430 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11440 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74  bel(v);.  comput
11450 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
11460 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42  pParse, p, addrB
11470 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20  reak);.  pLimit 
11480 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70  = p->pLimit;.  p
11490 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
114a0 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20  set;.  regLimit 
114b0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72  = p->iLimit;.  r
114c0 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  egOffset = p->iO
114d0 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d  ffset;.  p->pLim
114e0 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20  it = p->pOffset 
114f0 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  = 0;.  p->iLimit
11500 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20   = p->iOffset = 
11510 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  0;.  pOrderBy = 
11520 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
11530 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75  /* Locate the cu
11540 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
11550 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  he Current table
11560 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41   */.  for(i=0; A
11570 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53  LWAYS(i<pSrc->nS
11580 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rc); i++){.    i
11590 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67  f( pSrc->a[i].fg
115a0 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a  .isRecursive ){.
115b0 20 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d        iCurrent =
115c0 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
115d0 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  sor;.      break
115e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
115f0 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
11600 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51  rs numbers for Q
11610 75 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63  ueue and Distinc
11620 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e  t.  The cursor n
11630 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74  umber for.  ** t
11640 68 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c  he Distinct tabl
11650 65 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  e must be exactl
11660 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68  y one greater th
11670 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65  an Queue in orde
11680 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53  r.  ** for the S
11690 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20  RT_DistFifo and 
116a0 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65  SRT_DistQueue de
116b0 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f  stinations to wo
116c0 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20  rk. */.  iQueue 
116d0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
116e0 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
116f0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65  K_UNION ){.    e
11700 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
11710 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ? SRT_DistQueue 
11720 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a  : SRT_DistFifo;.
11730 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20      iDistinct = 
11740 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
11750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65    }else{.    eDe
11760 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
11770 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f  SRT_Queue : SRT_
11780 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Fifo;.  }.  sqli
11790 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
117a0 74 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44  t(&destQueue, eD
117b0 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  est, iQueue);.. 
117c0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72   /* Allocate cur
117d0 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74  sors for Current
117e0 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73  , Queue, and Dis
117f0 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43  tinct. */.  regC
11800 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73  urrent = ++pPars
11810 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
11820 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11830 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69  OP_OpenPseudo, i
11840 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72  Current, regCurr
11850 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66  ent, nCol);.  if
11860 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
11870 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
11880 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  nfo = multiSelec
11890 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
118a0 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
118b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
118c0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
118d0 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
118e0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
118f0 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
11910 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
11920 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
11930 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72  destQueue.pOrder
11940 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
11950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
11960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11970 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
11980 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29  l, iQueue, nCol)
11990 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d  ;.  }.  VdbeComm
119a0 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74  ent((v, "Queue t
119b0 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69  able"));.  if( i
119c0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
119d0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
119e0 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  0] = sqlite3Vdbe
119f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
11a00 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73  nEphemeral, iDis
11a10 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70  tinct, 0);.    p
11a20 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
11a30 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
11a40 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68    }..  /* Detach
11a50 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11a60 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  ause from the co
11a70 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
11a80 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
11a90 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20   0;..  /* Store 
11aa0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
11ab0 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69  he setup-query i
11ac0 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53  n Queue. */.  pS
11ad0 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  etup->pNext = 0;
11ae0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
11af0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11b00 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65  etup, &destQueue
11b10 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  );.  pSetup->pNe
11b20 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63  xt = p;.  if( rc
11b30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72   ) goto end_of_r
11b40 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a  ecursive_query;.
11b50 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  /* Find the n
11b60 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51  ext row in the Q
11b70 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20  ueue and output 
11b80 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64  that row */.  ad
11b90 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
11ba0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11bb0 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20  Rewind, iQueue, 
11bc0 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
11bd0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
11be0 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
11bf0 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75  next row in Queu
11c00 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e  e over to Curren
11c10 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  t */.  sqlite3Vd
11c20 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
11c30 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74  ullRow, iCurrent
11c40 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63  ); /* To reset c
11c50 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20  olumn cache */. 
11c60 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
11c70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11c80 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
11c90 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  umn, iQueue, pOr
11ca0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
11cb0 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
11cc0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11cd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11ce0 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75  P_RowData, iQueu
11cf0 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  e, regCurrent);.
11d00 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
11d10 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
11d20 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a  lete, iQueue);..
11d30 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
11d40 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
11d50 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43  rrent */.  addrC
11d60 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
11d70 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
11d80 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72   codeOffset(v, r
11d90 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  egOffset, addrCo
11da0 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  nt);.  selectInn
11db0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
11dc0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75  , p->pEList, iCu
11dd0 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20  rrent,.      0, 
11de0 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f  0, pDest, addrCo
11df0 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  nt, addrBreak);.
11e00 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29    if( regLimit )
11e10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11e20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
11e30 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c  crJumpZero, regL
11e40 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29  imit, addrBreak)
11e50 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
11e60 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
11e70 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
11e80 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
11e90 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  );..  /* Execute
11ea0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 53   the recursive S
11eb0 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65  ELECT taking the
11ec0 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43   single row in C
11ed0 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74  urrent as.  ** t
11ee0 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
11ef0 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
11f00 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  . Store the resu
11f10 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65 75 65  lts in the Queue
11f20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
11f30 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
11f40 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73  gregate ){.    s
11f50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11f60 50 61 72 73 65 2c 20 22 72 65 63 75 72 73 69 76  Parse, "recursiv
11f70 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
11f80 69 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  ies not supporte
11f90 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d");.  }else{.  
11fa0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
11fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
11fc0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
11fd0 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61  estQueue);.    a
11fe0 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
11ff0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50  ==0 );.    p->pP
12000 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20  rior = pSetup;. 
12010 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75   }..  /* Keep ru
12020 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75  nning the loop u
12030 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69  ntil the Queue i
12040 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c  s empty */.  sql
12050 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
12060 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
12070 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
12080 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
12090 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
120a0 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
120b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
120c0 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
120d0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
120e0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
120f0 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
12100 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
12110 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
12120 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  fset;.  return;.
12130 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12140 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
12150 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
12160 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
12170 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
12180 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
12190 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
121a0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
121b0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
121c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
121d0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
121e0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
121f0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
12200 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
12210 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
12220 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
12230 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
12240 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
12250 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
12260 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
12270 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
12280 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
12290 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
122a0 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
122b0 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
122c0 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
122d0 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
122e0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
122f0 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
12300 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
12310 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
12320 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
12330 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
12340 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
12350 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
12360 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
12370 2a 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20  **   (1) It has 
12380 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53  no LIMIT or OFFS
12390 45 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20  ET.**   (2) All 
123a0 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
123b0 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
123c0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
123d0 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74  Y clause.*/.stat
123e0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
123f0 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73  ctValues(.  Pars
12400 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12410 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
12420 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
12430 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12440 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
12450 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
12460 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
12470 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
12480 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
12490 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
124a0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ults */.){.  Sel
124b0 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69  ect *pPrior;.  i
124c0 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
124d0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  nt rc = 0;.  ass
124e0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
124f0 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
12500 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73   );.  do{.    as
12510 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
12520 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b  s & SF_Values );
12530 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12540 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70  op==TK_ALL || (p
12550 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
12560 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29  && p->pPrior==0)
12570 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12580 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a  p->pLimit==0 );.
12590 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
125a0 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
125b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78   assert( p->pNex
125c0 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  t==0 || p->pELis
125d0 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65  t->nExpr==p->pNe
125e0 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  xt->pEList->nExp
125f0 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r );.    if( p->
12600 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61  pPrior==0 ) brea
12610 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
12620 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d  ->pPrior->pNext=
12630 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  =p );.    p = p-
12640 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f  >pPrior;.    nRo
12650 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  w++;.  }while(1)
12660 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
12670 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e      pPrior = p->
12680 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
12690 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72  Prior = 0;.    r
126a0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
126b0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
126c0 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  st);.    p->pPri
126d0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
126e0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
126f0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
12700 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70  ow = nRow;.    p
12710 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12720 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12730 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12740 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
12750 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f   process a compo
12760 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66  und query form f
12770 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f  rom.** two or mo
12780 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
12790 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c  ies using UNION,
127a0 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45   UNION ALL, EXCE
127b0 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53  PT, or.** INTERS
127c0 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  ECT.**.** "p" po
127d0 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
127e0 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
127f0 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
12800 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
12810 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
12820 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
12830 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
12840 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
12850 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
12860 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
12870 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
12880 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
12890 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
128a0 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
128b0 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
128c0 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
128d0 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
128e0 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
128f0 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
12900 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
12910 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
12920 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
12930 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
12940 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
12950 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
12960 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
12970 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
12980 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
12990 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
129a0 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
129b0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
129c0 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
129d0 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
129e0 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
129f0 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
12a00 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
12a10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12a20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
12a30 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
12a40 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
12a50 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
12a60 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
12a70 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
12a80 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
12a90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12aa0 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
12ab0 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
12ac0 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
12ad0 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
12ae0 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
12af0 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
12b00 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
12b10 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
12b20 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
12b30 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
12b40 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
12b50 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
12b60 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
12b70 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
12b80 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
12b90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
12ba0 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
12bb0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12bc0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12bd0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12be0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12bf0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
12c00 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
12c10 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
12c20 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
12c30 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
12c40 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
12c50 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
12c60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12c70 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
12c80 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
12c90 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
12ca0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
12cb0 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
12cc0 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
12cd0 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
12ce0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
12cf0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
12d00 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
12d10 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
12d20 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
12d30 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
12d40 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
12d50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c  /.  Select *pDel
12d60 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61  ete = 0;  /* Cha
12d70 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c  in of simple sel
12d80 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ects to delete *
12d90 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
12da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
12db0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12dc0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
12dd0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
12de0 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b    int iSub1 = 0;
12df0 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
12e00 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
12e10 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
12e20 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ub2 = 0;        
12e30 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
12e40 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
12e50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
12e60 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
12e70 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
12e80 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
12e90 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
12ea0 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
12eb0 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
12ec0 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
12ed0 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
12ee0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
12ef0 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
12f00 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
12f10 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
12f20 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
12f30 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
12f40 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  /.  assert( (p->
12f50 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
12f60 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70  cursive)==0 || p
12f70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
12f80 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
12f90 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
12fa0 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d  ->db;.  pPrior =
12fb0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65   p->pPrior;.  de
12fc0 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69  st = *pDest;.  i
12fd0 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
12fe0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
12ff0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13000 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
13010 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
13020 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
13030 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
13040 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
13050 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
13060 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
13070 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
13080 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
13090 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
130a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
130b0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
130c0 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
130d0 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
130e0 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
130f0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
13100 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
13110 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13120 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
13130 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13140 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
13150 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
13160 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
13170 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
13180 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
13190 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
131a0 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
131b0 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
131c0 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
131d0 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
131e0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
131f0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13200 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
13210 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13220 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
13230 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d  dest.iSDParm, p-
13240 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
13250 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
13260 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
13270 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68  ..  /* Special h
13280 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f  andling for a co
13290 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
132a0 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73  at originates as
132b0 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
132c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
132d0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75  selFlags & SF_Mu
132e0 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  ltiValue ){.    
132f0 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
13300 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70  Values(pParse, p
13310 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f  , &dest);.    go
13320 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
13330 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
13340 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
13350 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
13360 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
13370 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
13380 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
13390 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
133a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
133b0 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
133c0 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
133d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
133e0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69  ist->nExpr==pPri
133f0 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
13400 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  r );..#ifndef SQ
13410 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
13420 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
13430 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
13440 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69  {.    generateWi
13450 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
13460 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
13470 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  t);.  }else.#end
13480 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e  if..  /* Compoun
13490 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
134a0 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
134b0 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
134c0 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
134d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
134e0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
134f0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
13500 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
13510 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , pDest);.  }els
13520 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  e..  /* Generate
13530 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
13540 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
13550 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
13560 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
13570 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
13580 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
13590 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
135a0 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
135b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
135c0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
135d0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
135e0 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  iLimit = p->iLim
135f0 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
13600 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
13610 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50  Offset;.      pP
13620 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
13630 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
13640 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
13650 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
13660 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13670 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
13680 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13690 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
136a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
136b0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
136c0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
136d0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
136e0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
136f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
13700 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
13710 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
13720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
13730 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
13740 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
13750 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
13760 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
13770 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
13780 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  t;.      if( p->
13790 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
137a0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
137b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
137c0 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69  _IfNot, p->iLimi
137d0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
137e0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
137f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75  eComment((v, "Ju
13800 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
13810 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
13820 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66        if( p->iOf
13830 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
13840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13850 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74  Op3(v, OP_Offset
13860 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d     p->iLimit, p-
13890 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69  >iOffset+1, p->i
138a0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
138b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
138c0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
138d0 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
138e0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
138f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13900 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
13910 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
13920 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
13930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
13940 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
13950 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
13960 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
13970 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  or;.      p->nSe
13980 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
13990 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53  3LogEstAdd(p->nS
139a0 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72  electRow, pPrior
139b0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
139c0 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d       if( pPrior-
139d0 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26  >pLimit.       &
139e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
139f0 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70  nteger(pPrior->p
13a00 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a  Limit, &nLimit).
13a10 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74         && nLimit
13a20 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  >0 && p->nSelect
13a30 52 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67  Row > sqlite3Log
13a40 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29  Est((u64)nLimit)
13a50 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
13a60 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
13a70 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
13a80 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20  ((u64)nLimit);. 
13a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13aa0 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
13ab0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13ac0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
13ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13ae0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13af0 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
13b00 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
13b10 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
13b20 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
13b30 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
13b40 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
13b50 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
13b60 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20   */.      u8 op 
13b70 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  = 0;       /* On
13b80 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
13b90 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
13ba0 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
13bb0 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
13bc0 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
13bd0 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
13be0 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
13bf0 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
13c00 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
13c10 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
13c20 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
13c30 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
13c40 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
13c50 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
13c60 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
13c70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13c80 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
13c90 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13ca0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
13cb0 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72  NION );.      pr
13cc0 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
13cd0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  n;.      if( des
13ce0 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  t.eDest==priorOp
13cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
13d00 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
13d10 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
13d20 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
13d30 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
13d40 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
13d50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13d60 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
13d70 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
13d80 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
13d90 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
13da0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
13db0 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
13dc0 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
13dd0 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
13de0 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
13df0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
13e00 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
13e10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13e20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
13e30 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
13e40 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
13e50 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
13e60 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
13e70 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
13e80 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
13e90 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
13ea0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13eb0 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
13ec0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
13ed0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
13ee0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
13ef0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
13f00 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
13f10 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
13f20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
13f30 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
13f40 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
13f50 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
13f60 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
13f70 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
13f80 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
13f90 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
13fa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13fb0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
13fc0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
13fd0 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
13fe0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
13ff0 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
14000 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
14010 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
14020 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
14030 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
14040 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
14050 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
14060 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
14070 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
14080 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14090 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
140a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
140b0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
140c0 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
140d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
140e0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
140f0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
14100 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
14110 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
14120 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
14130 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
14140 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
14150 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
14160 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
14170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14180 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
14190 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
141a0 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
141b0 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
141c0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
141d0 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
141e0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
141f0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
14200 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
14210 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
14220 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14230 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
14240 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
14250 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
14260 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
14270 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
14280 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
14290 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
142a0 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
142b0 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
142c0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
142d0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
142e0 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
142f0 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
14300 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
14310 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
14320 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
14330 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
14340 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
14350 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
14360 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
14370 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
14380 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
14390 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
143a0 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
143b0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
143c0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
143d0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
143e0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
143f0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
14400 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  N ){.        p->
14410 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
14420 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
14430 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
14440 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
14450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14460 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14470 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
14480 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14490 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
144a0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
144b0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
144c0 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
144d0 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
144e0 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  0;..      /* Con
144f0 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
14500 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
14510 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
14520 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
14530 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
14540 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
14550 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
14560 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
14570 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
14580 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
14590 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  rOp );.      if(
145a0 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
145b0 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
145c0 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
145d0 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
145e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
145f0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
14600 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
14610 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
14620 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
14630 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
14640 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
14650 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
14660 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
14670 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
14680 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
14690 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 46 69  ames(pParse, pFi
146a0 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73  rst->pSrc, pFirs
146b0 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
146c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
146d0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
146e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
146f0 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
14700 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14710 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
14720 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
14730 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
14740 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
14750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14760 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
14770 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
14780 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
14790 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  ge(v);.        i
147a0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
147b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
147c0 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
147d0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
147e0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
147f0 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20   unionTab,.     
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14810 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
14820 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
14830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14840 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
14850 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
14860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14870 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
14880 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
14890 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
148a0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
148b0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
148c0 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
148d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
148e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
148f0 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
14900 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
14910 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14920 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
14930 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
14940 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20  INTERSECT ); {. 
14950 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
14960 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
14970 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
14980 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
14990 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
149a0 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  et;.      int ad
149b0 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
149c0 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65  Dest intersectde
149d0 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  st;.      int r1
149e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
149f0 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
14a00 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
14a10 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
14a20 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
14a30 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
14a40 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
14a50 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
14a60 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
14a70 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
14a80 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
14a90 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
14aa0 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
14ab0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
14ac0 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
14ad0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
14ae0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
14af0 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rBy==0 );..     
14b00 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
14b10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14b20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
14b30 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
14b40 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
14b50 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
14b60 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
14b70 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
14b80 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69  dr;.      findRi
14b90 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
14ba0 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
14bb0 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
14bc0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
14bd0 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
14be0 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
14bf0 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
14c00 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14c10 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
14c20 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
14c30 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
14c40 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
14c50 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
14c60 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
14c70 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
14c80 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
14c90 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
14ca0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
14cb0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
14cc0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
14cd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
14ce0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
14cf0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
14d00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
14d10 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
14d20 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
14d30 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
14d40 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
14d50 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14d60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14d70 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
14d80 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
14d90 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
14da0 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
14db0 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
14dc0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
14dd0 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
14de0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
14df0 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
14e00 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
14e10 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
14e20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
14e30 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
14e40 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
14e50 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
14e60 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
14e70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
14e80 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
14e90 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14ea0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
14eb0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
14ec0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
14ed0 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
14ee0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14ef0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
14f00 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
14f10 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
14f20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
14f30 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
14f40 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
14f50 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
14f60 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
14f70 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
14f80 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
14f90 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
14fa0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
14fb0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
14fc0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
14fd0 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
14fe0 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
14ff0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
15000 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
15010 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
15020 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
15030 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
15040 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
15050 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
15060 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
15070 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
15080 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
15090 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
150a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
150b0 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
150c0 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
150d0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67  Prior;.        g
150e0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
150f0 65 73 28 70 50 61 72 73 65 2c 20 70 46 69 72 73  es(pParse, pFirs
15100 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d  t->pSrc, pFirst-
15110 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
15120 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
15130 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15140 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
15150 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
15160 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15170 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
15180 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
15190 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
151a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
151b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
151c0 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
151d0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
151e0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20  ge(v);.      r1 
151f0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
15200 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
15210 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
15220 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15230 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
15240 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
15250 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
15260 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
15270 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
15280 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  1, 0); VdbeCover
15290 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
152a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
152b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
152c0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
152d0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
152e0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
152f0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
15300 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
15310 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
15320 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
15330 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15340 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
15350 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15360 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
15370 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
15380 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15390 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
153a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
153b0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
153c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
153d0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
153e0 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
153f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15400 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
15410 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
15420 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15430 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  }..  explainComp
15440 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
15450 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
15460 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  2, p->op!=TK_ALL
15470 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );..  /* Compute
15480 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
15490 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
154a0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
154b0 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
154c0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
154d0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
154e0 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
154f0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
15500 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
15510 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
15520 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
15530 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
15540 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
15550 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
15560 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
15570 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
15580 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
15590 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
155a0 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
155b0 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
155c0 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
155d0 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
155e0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
155f0 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
15600 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
15610 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
15620 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
15630 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
15640 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
15670 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
15680 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
15690 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
156a0 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
156b0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
156c0 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
156d0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
156e0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
156f0 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
15700 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
15710 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
15720 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
15730 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
15740 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
15750 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
15760 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
15790 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
157a0 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
157b0 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  t( p->pNext==0 )
157c0 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e  ;.    nCol = p->
157d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
157e0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
157f0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
15800 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  c(db, nCol, 1);.
15810 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
15820 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
15830 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
15840 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  T;.      goto mu
15850 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
15860 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
15870 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
15880 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
15890 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
158a0 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
158b0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
158c0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
158d0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
158e0 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
158f0 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64       *apColl = d
15900 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
15910 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
15920 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
15930 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
15940 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
15950 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
15960 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
15970 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
15980 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
15990 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
159a0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
159b0 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
159c0 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
159d0 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
159e0 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
159f0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
15a00 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
15a10 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
15a20 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
15a30 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
15a40 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
15a50 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
15a60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
15a70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
15a80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15a90 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
15aa0 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
15ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
15ac0 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
15ad0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
15ae0 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
15af0 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b10 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
15b20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72       pLoop->addr
15b30 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31  OpenEphm[i] = -1
15b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15b50 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
15b60 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
15b70 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
15b80 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
15b90 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  t->iSdst = dest.
15ba0 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  iSdst;.  pDest->
15bb0 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64  nSdst = dest.nSd
15bc0 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  st;.  sqlite3Sel
15bd0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
15be0 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
15bf0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
15c00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
15c10 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
15c20 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73  ./*.** Error mes
15c30 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77  sage for when tw
15c40 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20  o or more terms 
15c50 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
15c60 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65 72  lect have differ
15c70 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75  ent.** size resu
15c80 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lt sets..*/.void
15c90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72   sqlite3SelectWr
15ca0 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72  ongNumTermsError
15cb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15cc0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
15cd0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
15ce0 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20  SF_Values ){.   
15cf0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15d00 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41  (pParse, "all VA
15d10 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74  LUES must have t
15d20 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
15d30 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c  f terms");.  }el
15d40 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
15d50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15d60 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
15d70 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
15d80 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
15d90 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
15da0 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
15db0 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
15dc0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
15dd0 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
15de0 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20   Code an output 
15df0 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  subroutine for a
15e00 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
15e10 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a  mentation of a.*
15e20 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e  * SELECT statmen
15e30 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74  t..**.** The dat
15e40 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69  a to be output i
15e50 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70  s contained in p
15e60 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72  In->iSdst.  Ther
15e70 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53  e are.** pIn->nS
15e80 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  dst columns to b
15e90 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
15ea0 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
15eb0 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
15ec0 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
15ed0 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
15ee0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
15ef0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
15f00 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
15f10 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
15f20 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
15f30 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  >0 then it is th
15f40 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
15f50 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
15f60 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
15f70 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
15f80 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
15f90 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
15fa0 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
15fb0 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
15fc0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
15fd0 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
15fe0 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
15ff0 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
16000 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
16010 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
16020 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
16030 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
16040 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
16050 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
16060 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
16070 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
16080 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
16090 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
160a0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
160b0 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
160c0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
160d0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
160e0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16100 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
16110 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
16120 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
16130 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
16140 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
16150 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
16160 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
16170 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
16180 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
16190 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
161a0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
161b0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
161c0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
161d0 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
161e0 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
161f0 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
16200 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
16210 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
16220 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
16230 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
16240 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
16250 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16270 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
16280 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
16290 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
162a0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
162b0 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
162c0 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
162d0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
162e0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
162f0 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
16300 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
16310 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
16320 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
16330 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
16340 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
16350 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
16360 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
16370 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
16380 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
16390 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
163a0 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50  , OP_IfNot, regP
163b0 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rev); VdbeCovera
163c0 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 32  ge(v);.    addr2
163d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
163e0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
163f0 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  re, pIn->iSdst, 
16400 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
16410 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20  nSdst,.         
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
16440 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
16450 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
16460 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
16470 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16480 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c  P_Jump, addr2+2,
16490 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72   iContinue, addr
164a0 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  2+2); VdbeCovera
164b0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
164c0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
164d0 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
164e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
164f0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d  v, OP_Copy, pIn-
16500 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
16510 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29  1, pIn->nSdst-1)
16520 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16530 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
16540 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65  teger, 1, regPre
16550 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
16560 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
16570 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
16580 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  0;..  /* Suppres
16590 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  s the first OFFS
165a0 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
165b0 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
165c0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
165d0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
165e0 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
165f0 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ue);..  assert( 
16600 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
16610 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73  T_Exists );.  as
16620 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
16630 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st!=SRT_Table );
16640 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74  .  switch( pDest
16650 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ->eDest ){.    /
16660 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
16670 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
16680 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
16690 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
166a0 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
166b0 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
166c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
166d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
166e0 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
166f0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
16700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16710 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16720 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
16730 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
16740 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  dst, r1);.      
16750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16760 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
16770 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16780 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
16790 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
167a0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65  , OP_Insert, pDe
167b0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
167c0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
167d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
167e0 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
167f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16800 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16810 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
16820 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16830 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16840 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
16850 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
16860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16870 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
16880 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
16890 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
168a0 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
168b0 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
168c0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
168d0 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
168e0 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
168f0 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
16900 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
16910 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
16920 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
16930 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
16940 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
16950 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
16960 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
16970 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73  Sdst==1 || pPars
16980 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 20  e->nErr>0 );.   
16990 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
169a0 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  t = .         sq
169b0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
169c0 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  nity(p->pEList->
169d0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
169e0 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20  t->affSdst);.   
169f0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
16a00 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
16a10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16a20 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16a30 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
16a40 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20  ->iSdst, 1, r1, 
16a50 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
16a60 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
16a70 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
16a80 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
16a90 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b   pIn->iSdst, 1);
16aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16ab0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16ac0 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
16ad0 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20  >iSDParm, r1);. 
16ae0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
16af0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16b00 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
16b10 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
16b20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
16b30 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
16b40 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
16b50 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
16b60 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
16b70 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
16b80 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
16b90 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
16ba0 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
16bb0 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
16bc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16bd0 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
16be0 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
16bf0 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73  Sdst==1 || pPars
16c00 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65  e->nErr>0 );  te
16c10 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
16c20 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  st!=1 );.      s
16c30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
16c40 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
16c50 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
16c60 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  DParm, 1);.     
16c70 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
16c80 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
16c90 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
16ca0 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
16cb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
16cc0 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
16cd0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16ce0 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68  RY */..    /* Th
16cf0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
16d00 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
16d10 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ce of registers.
16d20 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
16d30 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e  at pDest->iSdst.
16d40 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f    Then the co-ro
16d50 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20  utine yields..  
16d60 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
16d70 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  T_Coroutine: {. 
16d80 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e       if( pDest->
16d90 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
16da0 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
16db0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16dc0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
16dd0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
16de0 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74      pDest->nSdst
16df0 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20   = pIn->nSdst;. 
16e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
16e10 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
16e20 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
16e30 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  dst, pDest->iSds
16e40 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
16e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16e60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
16e70 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
16e80 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  arm);.      brea
16e90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
16ea0 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
16eb0 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
16ec0 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69  result destinati
16ed0 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a  on must be.    *
16ee0 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54  * SRT_Output.  T
16ef0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
16f00 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
16f10 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a   any other.    *
16f20 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74  * destination ot
16f30 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
16f40 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20  s handled above 
16f50 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20  or SRT_Output.. 
16f60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
16f70 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73   SRT_Output, res
16f80 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
16f90 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
16fa0 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20   registers.  .  
16fb0 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50    ** Then the OP
16fc0 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
16fd0 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75  e is used to cau
16fe0 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  se sqlite3_step(
16ff0 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) to.    ** retu
17000 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  rn the next row 
17010 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a  of result..    *
17020 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
17030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17040 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
17050 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
17060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17070 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
17080 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  ow, pIn->iSdst, 
17090 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
170a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
170b0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
170c0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
170d0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
170e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
170f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
17100 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
17110 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
17120 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
17130 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
17140 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
17150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17160 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
17170 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  pZero, p->iLimit
17180 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
17190 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
171a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
171b0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
171c0 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
171d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
171e0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
171f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17200 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
17210 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
17220 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
17230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
17240 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
17250 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
17260 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
17270 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
17280 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
17290 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
172a0 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
172b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
172c0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
172d0 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
172e0 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
172f0 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
17300 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
17310 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
17320 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
17330 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
17340 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
17350 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
17360 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
17370 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
17380 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
17390 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
173a0 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
173b0 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
173c0 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
173d0 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
173e0 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
173f0 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
17400 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
17410 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
17420 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
17430 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
17440 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
17450 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
17460 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
17470 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
17480 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
17490 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
174a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
174b0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
174c0 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
174d0 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
174e0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
174f0 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
17500 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
17510 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
17520 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
17530 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
17540 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
17550 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
17560 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
17570 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
17580 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
17590 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
175a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
175b0 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
175c0 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
175d0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
175e0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
175f0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
17600 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
17610 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
17620 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
17630 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
17640 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
17650 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
17660 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
17670 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
17680 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
17690 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
176a0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
176b0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
176c0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
176d0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
176e0 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
176f0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
17700 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
17710 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
17720 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
17730 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
17740 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
17750 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
17760 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
17770 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
17780 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
17790 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
177a0 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
177b0 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
177c0 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
177d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
177e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
177f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
17800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
17810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17820 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
17830 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
17840 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
17850 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
17860 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
17870 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
17880 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
17890 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
178a0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
178b0 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
178c0 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
178d0 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
178e0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
178f0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
17900 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
17910 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
17920 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
17930 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
17940 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
17950 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
17960 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
17970 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
17980 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
17990 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
179a0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
179b0 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
179c0 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
179d0 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
179e0 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
179f0 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
17a00 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
17a10 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
17a20 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
17a30 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
17a40 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
17a50 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
17a60 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
17a70 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
17a80 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
17a90 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
17aa0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
17ab0 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
17ac0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
17ad0 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
17ae0 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
17af0 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
17b00 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
17b10 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
17b20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
17b30 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
17b40 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
17b50 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
17b60 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
17b70 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
17b80 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
17b90 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
17ba0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
17bb0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
17bc0 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
17bd0 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
17be0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
17bf0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
17c00 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
17c10 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
17c20 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
17c30 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
17c40 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
17c50 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
17c60 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
17c70 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
17c80 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
17c90 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
17ca0 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
17cb0 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
17cc0 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
17cd0 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
17ce0 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
17cf0 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
17d00 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
17d10 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
17d20 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
17d30 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
17d40 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
17d50 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
17d60 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
17d70 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
17d80 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
17d90 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
17da0 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
17db0 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
17dc0 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
17dd0 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
17de0 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
17df0 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
17e00 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
17e10 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
17e20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
17e30 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
17e40 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
17e50 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
17e60 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
17e70 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
17e80 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
17e90 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
17ea0 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
17eb0 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
17ec0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
17ed0 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
17ee0 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
17ef0 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
17f00 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
17f10 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
17f20 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
17f30 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
17f40 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
17f50 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
17f60 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
17f70 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
17f80 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
17f90 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
17fa0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17fb0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
17fc0 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
17fd0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
17fe0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17ff0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
18000 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18010 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
18020 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
18030 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
18040 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
18050 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
18060 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
18070 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
18080 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
18090 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
180a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
180b0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
180c0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
180d0 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
180e0 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
180f0 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
18100 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
18110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
18120 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
18130 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
18140 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
18150 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
18160 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
18170 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
18180 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
18190 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
181a0 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
181b0 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
181c0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
181d0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
181e0 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
181f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  ne */.  int regA
18200 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
18210 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
18220 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
18230 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
18240 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20  t addrSelectA;  
18250 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18260 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63  f the select-A c
18270 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
18280 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20  t addrSelectB;  
18290 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
182a0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63  f the select-B c
182b0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
182c0 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20  t regOutA;      
182d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
182e0 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
182f0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
18300 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
18310 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f  OutB;          /
18320 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
18330 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
18340 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
18350 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41  /.  int addrOutA
18360 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18370 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
18380 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
18390 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
183a0 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64  B = 0;     /* Ad
183b0 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
183c0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
183d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
183e0 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fA;         /* A
183f0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
18400 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64  lect-A-exhausted
18410 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18420 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f   int addrEofA_no
18430 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  B;     /* Altern
18440 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20  ate addrEofA if 
18450 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a  B is uninitializ
18460 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
18470 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
18480 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18490 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
184a0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
184b0 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
184c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
184d0 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
184e0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
184f0 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
18500 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18510 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
18520 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18530 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
18540 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18550 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
18560 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
18570 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
18580 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
18590 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
185a0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
185b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
185c0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
185d0 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
185e0 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
185f0 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
18600 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
18610 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
18620 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
18630 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
18640 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
18650 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
18660 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
18670 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
18680 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
18690 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
186a0 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
186b0 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
186c0 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
186d0 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
186e0 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
186f0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
18700 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
18710 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
18720 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  stmt */.  int ad
18730 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
18740 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
18750 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
18760 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
18770 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
18780 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
18790 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
187a0 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
187b0 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
187c0 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
187d0 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
187e0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
187f0 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
18800 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
18810 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
18820 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
18830 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
18840 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
18850 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
18860 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
18870 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
18880 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
18890 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
188a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
188b0 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
188c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
188d0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
188e0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
188f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
18900 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
18910 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
18920 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
18930 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
18940 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ns */.#ifndef SQ
18950 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
18960 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20  N.  int iSub1;  
18970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
18980 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
18990 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
189a0 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20  iSub2;          
189b0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
189c0 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
189d0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
189e0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
189f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
18a00 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
18a10 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
18a20 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
18a30 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
18a40 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
18a50 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
18a60 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
18a70 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
18a80 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
18a90 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
18aa0 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
18ab0 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
18ac0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18ad0 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
18ae0 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
18af0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
18b00 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
18b10 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
18b20 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
18b30 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
18b40 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
18b50 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
18b60 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
18b70 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
18b80 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
18b90 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
18ba0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
18bb0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
18bc0 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
18bd0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
18be0 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
18bf0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
18c00 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
18c10 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
18c20 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
18c30 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
18c40 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
18c50 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
18c60 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
18c70 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
18c80 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
18c90 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
18ca0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
18cb0 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
18cc0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
18cd0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
18ce0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
18cf0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
18d00 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
18d10 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
18d20 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
18d30 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
18d40 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18d50 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
18d60 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
18d70 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20  OrderByCol==i ) 
18d80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
18d90 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64       if( j==nOrd
18da0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
18db0 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
18dc0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
18dd0 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20  INTEGER, 0);.   
18de0 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
18df0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18e00 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
18e10 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
18e20 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
18e30 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
18e40 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
18e50 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
18e60 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
18e70 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
18e80 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
18e90 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
18ea0 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
18eb0 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e  a[nOrderBy++].u.
18ec0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
18ed0 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
18ee0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18ef0 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
18f00 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
18f10 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
18f20 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
18f30 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
18f40 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
18f50 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
18f60 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
18f70 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
18f80 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
18f90 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
18fa0 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
18fb0 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
18fc0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18fd0 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
18fe0 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
18ff0 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
19000 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
19010 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
19020 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
19030 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
19040 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
19050 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
19060 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
19070 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f   sizeof(int)*(nO
19080 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20  rderBy + 1));.  
19090 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a  if( aPermute ){.
190a0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
190b0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
190c0 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d  .    aPermute[0]
190d0 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20   = nOrderBy;.   
190e0 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d   for(i=1, pItem=
190f0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d  pOrderBy->a; i<=
19100 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70  nOrderBy; i++, p
19110 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61  Item++){.      a
19120 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
19130 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
19140 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19150 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
19160 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69  erByCol<=p->pELi
19170 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
19180 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d     aPermute[i] =
19190 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
191a0 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  erByCol - 1;.   
191b0 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65   }.    pKeyMerge
191c0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72   = multiSelectOr
191d0 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61  derByKeyInfo(pPa
191e0 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65  rse, p, 1);.  }e
191f0 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72  lse{.    pKeyMer
19200 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ge = 0;.  }..  /
19210 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f  * Reattach the O
19220 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
19230 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  o the query..  *
19240 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
19250 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50  = pOrderBy;.  pP
19260 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rior->pOrderBy =
19270 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
19280 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
19290 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20  pOrderBy, 0);.. 
192a0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72   /* Allocate a r
192b0 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72  ange of temporar
192c0 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  y registers and 
192d0 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64  the KeyInfo need
192e0 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ed.  ** for the 
192f0 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76  logic that remov
19300 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73  es duplicate res
19310 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68  ult rows when th
19320 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20  e.  ** operator 
19330 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  is UNION, EXCEPT
19340 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28  , or INTERSECT (
19350 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c  but not UNION AL
19360 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  L)..  */.  if( o
19370 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
19380 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20   regPrev = 0;.  
19390 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
193a0 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
193b0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->nExpr;.    ass
193c0 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e  ert( nOrderBy>=n
193d0 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
193e0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
193f0 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65  regPrev = pParse
19400 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
19410 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45  arse->nMem += nE
19420 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74  xpr+1;.    sqlit
19430 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19440 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
19450 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65  egPrev);.    pKe
19460 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65  yDup = sqlite3Ke
19470 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
19480 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  Expr, 1);.    if
19490 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20  ( pKeyDup ){.   
194a0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
194b0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
194c0 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b  able(pKeyDup) );
194d0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
194e0 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  i<nExpr; i++){. 
194f0 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
19500 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69  aColl[i] = multi
19510 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
19520 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
19530 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
19540 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b  ortOrder[i] = 0;
19550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19560 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61   }. .  /* Separa
19570 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  te the left and 
19580 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20  the right query 
19590 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72  from one another
195a0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f  .  */.  p->pPrio
195b0 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d  r = 0;.  pPrior-
195c0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71  >pNext = 0;.  sq
195d0 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
195e0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
195f0 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
19600 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28   "ORDER");.  if(
19610 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d   pPrior->pPrior=
19620 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
19630 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
19640 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72  upBy(pParse, pPr
19650 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ior, pPrior->pOr
19660 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
19670 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
19680 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  te the limit reg
19690 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70  isters */.  comp
196a0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
196b0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62  s(pParse, p, lab
196c0 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d  elEnd);.  if( p-
196d0 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54  >iLimit && op==T
196e0 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
196f0 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73  LimitA = ++pPars
19700 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
19710 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73  LimitB = ++pPars
19720 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
19730 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19740 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f  , OP_Copy, p->iO
19750 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73  ffset ? p->iOffs
19760 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74  et+1 : p->iLimit
19770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a      regLimitA);.
197a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
197b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
197c0 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67  , regLimitA, reg
197d0 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65  LimitB);.  }else
197e0 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
197f0 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b  = regLimitB = 0;
19800 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
19810 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
19820 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c  pLimit);.  p->pL
19830 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  imit = 0;.  sqli
19840 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
19850 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20  , p->pOffset);. 
19860 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
19870 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b  ..  regAddrA = +
19880 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
19890 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50   regAddrB = ++pP
198a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
198b0 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  gOutA = ++pParse
198c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
198d0 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
198e0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  em;.  sqlite3Sel
198f0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
19900 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tA, SRT_Coroutin
19910 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  e, regAddrA);.  
19920 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
19930 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52  tInit(&destB, SR
19940 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
19950 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65  AddrB);..  /* Ge
19960 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
19970 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
19980 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
19990 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
199a0 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
199b0 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
199c0 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
199d0 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
199e0 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tA = sqlite3Vdbe
199f0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
19a00 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71   1;.  addr1 = sq
19a10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19a20 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
19a30 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30  ine, regAddrA, 0
19a40 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a  , addrSelectA);.
19a50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
19a60 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29  , "left SELECT")
19a70 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69  );.  pPrior->iLi
19a80 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b  mit = regLimitA;
19a90 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
19aa0 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
19ab0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
19ac0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
19ad0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
19ae0 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73  or, &destA);.  s
19af0 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
19b00 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64  outine(v, regAdd
19b10 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rA);.  sqlite3Vd
19b20 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
19b30 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  dr1);..  /* Gene
19b40 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
19b50 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
19b60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19b70 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72  t on .  ** the r
19b80 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73  ight - the "B" s
19b90 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64  elect.  */.  add
19ba0 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74  rSelectB = sqlit
19bb0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19bc0 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72  r(v) + 1;.  addr
19bd0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
19be0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
19bf0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19c00 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drB, 0, addrSele
19c10 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctB);.  VdbeComm
19c20 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53  ent((v, "right S
19c30 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
19c40 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
19c50 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
19c60 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
19c70 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
19c80 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
19c90 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65  ffset = 0;  .  e
19ca0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
19cb0 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
19cc0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
19cd0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
19ce0 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
19cf0 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
19d00 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
19d10 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
19d20 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
19d30 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
19d40 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29  ine(v, regAddrB)
19d50 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19d60 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
19d70 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
19d80 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
19d90 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
19da0 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
19db0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
19dc0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
19dd0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
19de0 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
19df0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
19e00 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
19e10 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
19e20 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
19e30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19e40 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
19e50 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19e70 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
19e80 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20   labelEnd);.  . 
19e90 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
19ea0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
19eb0 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
19ec0 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a  nt row of the B.
19ed0 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
19ee0 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
19ef0 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
19f00 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
19f10 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
19f20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
19f30 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   ){.    VdbeNoop
19f40 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
19f50 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
19f60 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75  B"));.    addrOu
19f70 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tB = generateOut
19f80 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
19f90 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
19fa0 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42         p, &destB
19fb0 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42  , pDest, regOutB
19fc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19fd0 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
19fe0 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
19ff0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79    }.  sqlite3Key
1a000 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75  InfoUnref(pKeyDu
1a010 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  p);..  /* Genera
1a020 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1a030 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1a040 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1a050 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65  ect A.  ** are e
1a060 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1a070 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1a080 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   B remains..  */
1a090 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
1a0a0 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
1a0b0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1a0c0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61  addrEofA_noB = a
1a0d0 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45  ddrEofA = labelE
1a0e0 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  nd;.  }else{  . 
1a0f0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1a100 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75  nt((v, "eof-A su
1a110 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1a120 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
1a130 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a140 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1a150 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1a160 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
1a170 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a180 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1a190 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c   regAddrB, label
1a1a0 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  End);.          
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1c0 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
1a1d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1a1e0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1a1f0 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  v, addrEofA);.  
1a200 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
1a210 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
1a220 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
1a230 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
1a240 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tRow);.  }..  /*
1a250 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1a260 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1a270 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1a280 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
1a290 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1a2a0 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1a2b0 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
1a2c0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1a2d0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1a2e0 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
1a2f0 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
1a300 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
1a310 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
1a320 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
1a330 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
1a340 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
1a350 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1a360 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a370 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
1a380 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1a390 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1a3a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1a3b0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1a3c0 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
1a3d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a3e0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a3f0 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56  rA, labelEnd); V
1a400 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1a420 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29  oto(v, addrEofB)
1a430 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1a440 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1a450 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1a460 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
1a470 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a480 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
1a490 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
1a4a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a4b0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1a4c0 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1a4d0 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
1a4e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a4f0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1a500 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1a510 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1a520 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1a530 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1a540 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a550 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1a560 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
1a570 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1a580 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
1a590 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1a5a0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
1a5b0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1a5c0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1a5d0 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
1a5e0 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
1a5f0 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1a600 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
1a610 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1a620 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
1a630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a640 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a650 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1a660 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1a670 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1a680 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1a690 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
1a6a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1a6b0 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1a6c0 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
1a6d0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1a6e0 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
1a6f0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1a700 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
1a710 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1a720 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
1a730 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
1a740 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
1a750 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a760 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1a770 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1a780 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1a790 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a7a0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1a7b0 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1a7c0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1a7d0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1a7e0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1a7f0 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
1a800 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
1a810 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
1a820 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1a830 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1a840 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
1a850 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a860 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1a870 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29  A, addrEofA_noB)
1a880 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a890 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a8a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a8b0 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1a8c0 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1a8d0 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1a8e0 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
1a8f0 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
1a900 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1a910 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1a920 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
1a930 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1a940 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
1a950 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
1a960 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
1a970 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
1a980 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a990 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
1a9a0 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42  stA.iSdst, destB
1a9b0 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79  .iSdst, nOrderBy
1a9c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a9d0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1a9e0 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
1a9f0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
1aa00 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1aa10 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  v, OPFLAG_PERMUT
1aa20 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  E);.  sqlite3Vdb
1aa30 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
1aa40 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
1aa50 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
1aa60 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1aa70 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  v);..  /* Jump t
1aa80 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
1aa90 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
1aaa0 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
1aab0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1aac0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1aad0 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
1aae0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
1aaf0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
1ab00 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
1ab10 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1ab20 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
1ab30 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
1ab40 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68  = pPrior;.    wh
1ab50 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
1ab60 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
1ab70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
1ab80 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
1ab90 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1aba0 46 69 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69  First->pSrc, pFi
1abb0 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
1abc0 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62  }..  /* Reassemb
1abd0 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ly the compound 
1abe0 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74  query so that it
1abf0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63   will be freed c
1ac00 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79  orrectly.  ** by
1ac10 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
1ac20 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
1ac30 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1ac40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1ac50 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ete(db, p->pPrio
1ac60 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72  r);.  }.  p->pPr
1ac70 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1ac80 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
1ac90 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20  p;..  /*** TBD: 
1aca0 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69   Insert subrouti
1acb0 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73  ne calls to clos
1acc0 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63  e cursors on inc
1acd0 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73  omplete.  **** s
1ace0 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a  ubqueries ****/.
1acf0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
1ad00 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
1ad10 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
1ad20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  0);.  return pPa
1ad30 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a  rse->nErr!=0;.}.
1ad40 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
1ad50 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ad60 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1ad70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ad80 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77  IT_VIEW)./* Forw
1ad90 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73  ard Declarations
1ada0 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1adb0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71  substExprList(sq
1adc0 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74  lite3*, ExprList
1add0 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
1ade0 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
1adf0 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69  substSelect(sqli
1ae00 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20  te3*, Select *, 
1ae10 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20  int, ExprList*, 
1ae20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  int);../*.** Sca
1ae30 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
1ae40 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
1ae50 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
1ae60 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
1ae70 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
1ae80 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
1ae90 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1aea0 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
1aeb0 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
1aec0 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
1aed0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
1aee0 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
1aef0 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
1af00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1af10 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
1af20 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
1af30 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
1af40 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
1af50 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
1af60 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
1af70 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
1af80 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
1af90 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
1afa0 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
1afb0 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
1afc0 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
1afd0 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
1afe0 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
1aff0 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
1b000 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
1b010 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
1b020 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
1b030 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
1b040 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
1b050 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
1b060 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
1b070 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
1b080 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
1b090 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
1b0a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1b0b0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1b0c0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
1b0d0 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
1b0e0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1b0f0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
1b100 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
1b110 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
1b120 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1b130 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1b140 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
1b150 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
1b160 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
1b170 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
1b180 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
1b190 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1b1a0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1b1b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1b1c0 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1b1d0 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
1b1e0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
1b1f0 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1b200 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1b210 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
1b220 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
1b230 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
1b240 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
1b250 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
1b260 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1b270 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1b280 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
1b290 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
1b2a0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
1b2b0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1b2c0 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  b, pEList->a[pEx
1b2d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1b2e0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
1b2f0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1b300 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
1b310 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1b320 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b330 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
1b340 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b350 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
1b360 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b370 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1b380 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b390 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1b3a0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b3b0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1b3c0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1b3d0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1b3e0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1b3f0 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  ct(db, pExpr->x.
1b400 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1b410 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20   pEList, 1);.   
1b420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
1b430 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b440 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
1b450 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b460 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b470 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61  urn pExpr;.}.sta
1b480 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1b490 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
1b4a0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
1b4b0 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
1b4c0 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
1b4d0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1b4e0 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
1b4f0 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1b500 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1b510 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
1b520 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1b530 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1b540 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
1b550 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1b560 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
1b570 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
1b580 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b590 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1b5a0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1b5b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1b5c0 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
1b5d0 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
1b5e0 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d  tExpr(db, pList-
1b5f0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
1b600 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b610 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1b620 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73  substSelect(.  s
1b630 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1b640 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1b650 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
1b660 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1b670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
1b680 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1b690 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1b6a0 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
1b6b0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1b6c0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1b6d0 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
1b6e0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1b6f0 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20 53 75 62  EList,    /* Sub
1b700 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
1b710 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f 72 20  /.  int doPrior 
1b720 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 73           /* Do s
1b730 75 62 73 74 69 74 75 74 65 73 20 6f 6e 20 70 2d  ubstitutes on p-
1b740 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29  >pPrior too */.)
1b750 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
1b760 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
1b770 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1b780 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b790 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  !p ) return;.  d
1b7a0 6f 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  o{.    substExpr
1b7b0 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
1b7c0 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
1b7d0 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
1b7e0 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47  prList(db, p->pG
1b7f0 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20  roupBy, iTable, 
1b800 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
1b810 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1b820 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  ->pOrderBy, iTab
1b830 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b840 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75   p->pHaving = su
1b850 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
1b860 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
1b870 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
1b880 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1b890 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
1b8a0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b8b0 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d  );.    pSrc = p-
1b8c0 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72  >pSrc;.    asser
1b8d0 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
1b8e0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1b8f0 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
1b900 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
1b910 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
1b920 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74  stSelect(db, pIt
1b930 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  em->pSelect, iTa
1b940 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b  ble, pEList, 1);
1b950 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1b960 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
1b970 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45  {.        substE
1b980 78 70 72 4c 69 73 74 28 64 62 2c 20 70 49 74 65  xprList(db, pIte
1b990 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20  m->u1.pFuncArg, 
1b9a0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b9b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b9c0 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72   }while( doPrior
1b9d0 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69   && (p = p->pPri
1b9e0 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64  or)!=0 );.}.#end
1b9f0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
1ba00 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1ba10 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1ba20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1ba30 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  W) */..#if !defi
1ba40 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1ba50 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1ba60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1ba70 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68  T_VIEW)./*.** Th
1ba80 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
1ba90 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
1baa0 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70  ubqueries as a p
1bab0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d  erformance optim
1bac0 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ization..** This
1bad0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1bae0 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
1baf0 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
1bb00 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63  no flattening oc
1bb10 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
1bb20 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
1bb30 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
1bb40 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
1bb50 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
1bb60 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
1bb70 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
1bb80 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1bb90 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1bba0 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
1bbb0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
1bbc0 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
1bbd0 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
1bbe0 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
1bbf0 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
1bc00 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
1bc10 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
1bc20 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
1bc30 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
1bc40 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
1bc50 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
1bc60 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
1bc70 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
1bc80 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
1bc90 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
1bca0 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
1bcb0 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
1bcc0 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
1bcd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
1bce0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1bcf0 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
1bd00 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
1bd10 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1bd20 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
1bd30 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
1bd40 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
1bd50 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
1bd60 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
1bd70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
1bd80 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
1bd90 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
1bda0 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
1bdb0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
1bdc0 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c  d for this simpl
1bdd0 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
1bde0 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
1bdf0 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
1be00 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
1be10 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
1be20 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
1be30 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
1be40 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
1be50 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
1be60 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
1be70 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
1be80 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
1be90 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
1bea0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
1beb0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1bec0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
1bed0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1bee0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1bef0 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
1bf00 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1bf10 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
1bf20 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
1bf30 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 28 32   aggregate or (2
1bf40 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  a) the outer que
1bf50 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1bf60 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 28  .**        and (
1bf70 32 62 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2b) the outer qu
1bf80 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1bf90 20 73 75 62 71 75 65 72 69 65 73 20 6f 74 68 65   subqueries othe
1bfa0 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 0a 2a  r than the one.*
1bfb0 2a 20 20 20 20 20 20 20 20 46 52 4f 4d 2d 63 6c  *        FROM-cl
1bfc0 61 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68  ause subquery th
1bfd0 61 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  at is a candidat
1bfe0 65 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67  e for flattening
1bff0 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20 20 20 20  .  (2b is.**    
1c000 20 20 20 20 64 75 65 20 74 6f 20 74 69 63 6b 65      due to ticke
1c010 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61  t [2f7170d73bf9a
1c020 62 66 38 30 5d 20 66 72 6f 6d 20 32 30 31 35 2d  bf80] from 2015-
1c030 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  02-09.).**.**   
1c040 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (3)  The subquer
1c050 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
1c060 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1c070 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a  left outer join.
1c080 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69  **        (Origi
1c090 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30  nally ticket #30
1c0a0 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64  6.  Strengthened
1c0b0 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30   by ticket #3300
1c0c0 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ).**.**   (4)  T
1c0d0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1c0e0 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  ot DISTINCT..**.
1c0f0 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65  **  (**)  At one
1c100 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69   point restricti
1c110 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20  ons (4) and (5) 
1c120 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74  defined a subset
1c130 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20   of DISTINCT.** 
1c140 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69         sub-queri
1c150 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63  es that were exc
1c160 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20  luded from this 
1c170 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65  optimization. Re
1c180 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  striction .**   
1c190 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e       (4) has sin
1c1a0 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64  ce been expanded
1c1b0 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20   to exclude all 
1c1c0 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72  DISTINCT subquer
1c1d0 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  ies..**.**   (6)
1c1e0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1c1f0 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
1c200 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
1c210 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1c220 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
1c230 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
1c240 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
1c250 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
1c260 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75  .  TODO:  For su
1c270 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74  bqueries without
1c280 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f  .**        A FRO
1c290 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64  M clause, consid
1c2a0 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d  er adding a FROM
1c2b0 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20   close with the 
1c2c0 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20  special.**      
1c2d0 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f    table sqlite_o
1c2e0 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74  nce that consist
1c2f0 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f  s of a single ro
1c300 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  w containing a.*
1c310 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20  *        single 
1c320 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  NULL..**.**   (8
1c330 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c340 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1c350 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1c360 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1c370 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
1c380 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1c390 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1c3a0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1c3b0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1c3c0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
1c3d0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
1c3e0 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e  **)  Restriction
1c3f0 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65   (10) was remove
1c400 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20  d from the code 
1c410 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75  on 2005-02-05 bu
1c420 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61  t we.**        a
1c430 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65  ccidently carrie
1c440 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f  d the comment fo
1c450 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34  rward until 2014
1c460 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61  -09-15.  Origina
1c470 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 65 78 74  l.**        text
1c480 3a 20 22 54 68 65 20 73 75 62 71 75 65 72 79 20  : "The subquery 
1c490 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
1c4a0 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
1c4b0 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20  uter query .**  
1c4c0 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 75        does not u
1c4d0 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a  se LIMIT.".**.**
1c4e0 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
1c4f0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1c500 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1c510 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
1c520 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
1c530 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70  *  (**)  Not imp
1c540 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75  lemented.  Subsu
1c550 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
1c560 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70  tion (3).  Was p
1c570 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20  reviously.**    
1c580 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72      a separate r
1c590 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76  estriction deriv
1c5a0 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20  ing from ticket 
1c5b0 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350..**.**  (13
1c5c0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c5d0 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
1c5e0 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
1c5f0 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
1c600 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1c610 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46   does not use OF
1c620 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FSET..**.**  (15
1c630 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
1c640 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ry is not part o
1c650 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
1c660 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ect or the.**   
1c670 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f       subquery do
1c680 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49  es not have a LI
1c690 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  MIT clause..**  
1c6a0 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
1c6b0 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
1c6c0 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
1c6d0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54  ..**.**  (16)  T
1c6e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1c6f0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1c700 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65  te or the subque
1c710 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20  ry does.**      
1c720 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52    not contain OR
1c730 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74  DER BY.  (Ticket
1c740 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73   #2942)  This us
1c750 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ed to not matter
1c760 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c  .**        until
1c770 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74   we introduced t
1c780 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
1c790 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a  ) function.  .**
1c7a0 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73  .**  (17)  The s
1c7b0 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20  ub-query is not 
1c7c0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1c7d0 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e  t, or it is a UN
1c7e0 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20  ION ALL .**     
1c7f0 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75     compound clau
1c800 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72  se made up entir
1c810 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65  ely of non-aggre
1c820 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e  gate queries, an
1c830 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  d .**        the
1c840 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a   parent query:.*
1c850 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  *.**          * 
1c860 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61  is not itself pa
1c870 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
1c880 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20   select,.**     
1c890 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e       * is not an
1c8a0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49   aggregate or DI
1c8b0 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e  STINCT query, an
1c8c0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  d.**          * 
1c8d0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a  is not a join.**
1c8e0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70  .**        The p
1c8f0 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75  arent and sub-qu
1c900 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ery may contain 
1c910 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53  WHERE clauses. S
1c920 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20  ubject to.**    
1c930 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20      rules (11), 
1c940 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74  (13) and (14), t
1c950 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e  hey may also con
1c960 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a  tain ORDER BY,.*
1c970 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61  *        LIMIT a
1c980 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
1c990 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79  s.  The subquery
1c9a0 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20   cannot use any 
1c9b0 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1c9c0 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65     operator othe
1c9d0 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
1c9e0 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65   because all the
1c9f0 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a   other compound.
1ca00 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1ca10 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c  ors have an impl
1ca20 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69  ied DISTINCT whi
1ca30 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  ch is disallowed
1ca40 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65   by.**        re
1ca50 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a  striction (4)..*
1ca60 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f  *.**        Also
1ca70 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74  , each component
1ca80 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
1ca90 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68  y must return th
1caa0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
1cab0 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c          of resul
1cac0 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20  t columns. This 
1cad0 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65  is actually a re
1cae0 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e  quirement for an
1caf0 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1cb00 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74       SELECT stat
1cb10 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74  ement, but all t
1cb20 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65  he code here doe
1cb30 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74  s is make sure t
1cb40 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20  hat no.**       
1cb50 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20   such (illegal) 
1cb60 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61  sub-query is fla
1cb70 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  ttened. The call
1cb80 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74  er will detect t
1cb90 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e  he.**        syn
1cba0 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65  tax error and re
1cbb0 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20  turn a detailed 
1cbc0 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20  message..**.**  
1cbd0 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
1cbe0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
1cbf0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1cc00 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1cc10 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
1cc20 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20  ER by clause of 
1cc30 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
1cc40 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
1cc50 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
1cc60 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
1cc70 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
1cc80 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75  **  (19)  The su
1cc90 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1cca0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1ccb0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1ccc0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1ccd0 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
1cce0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
1ccf0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1cd00 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1cd10 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
1cd20 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
1cd30 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
1cd40 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
1cd50 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
1cd60 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
1cd70 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
1cd80 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
1cd90 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
1cda0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1cdb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
1cdc0 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
1cdd0 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
1cde0 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
1cdf0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1ce00 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20  ery.  But we.** 
1ce10 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65         have othe
1ce20 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
1ce30 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20  in mind to deal 
1ce40 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a  with that case..
1ce50 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65  **.**  (21)  The
1ce60 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1ce70 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1ce80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1ce90 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
1cea0 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65   DISTINCT.  (See
1ceb0 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34   ticket [752e164
1cec0 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  6fc])..**.**  (2
1ced0 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1cee0 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
1cef0 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20  ive CTE..**.**  
1cf00 28 32 33 29 20 20 54 68 65 20 70 61 72 65 6e 74  (23)  The parent
1cf10 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
1cf20 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20  ive CTE, or the 
1cf30 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
1cf40 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d   a.**        com
1cf50 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69  pound query. Thi
1cf60 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73  s restriction is
1cf70 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f   because transfo
1cf80 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  rming the.**    
1cf90 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20      parent to a 
1cfa0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63  compound query c
1cfb0 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65  onfuses the code
1cfc0 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a   that handles.**
1cfd0 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76          recursiv
1cfe0 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c  e queries in mul
1cff0 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a  tiSelect()..**.*
1d000 2a 20 20 28 32 34 29 20 20 54 68 65 20 73 75 62  *  (24)  The sub
1d010 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
1d020 61 67 67 72 65 67 61 74 65 20 74 68 61 74 20 75  aggregate that u
1d030 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  ses the built-in
1d040 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20   min() or .**   
1d050 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75       or max() fu
1d060 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f  nctions.  (Witho
1d070 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
1d080 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b  ion, a query lik
1d090 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45  e:.**        "SE
1d0a0 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c  LECT x FROM (SEL
1d0b0 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52  ECT max(y), x FR
1d0c0 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f  OM t1)" would no
1d0d0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a  t necessarily.**
1d0e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1d0f0 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77  he value X for w
1d100 68 69 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d  hich Y was maxim
1d110 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e  al.).**.**.** In
1d120 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
1d130 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
1d140 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1d150 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d160 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
1d170 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
1d180 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
1d190 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
1d1a0 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
1d1b0 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
1d1c0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
1d1d0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
1d1e0 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
1d1f0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
1d200 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
1d210 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
1d220 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1d230 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
1d240 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
1d250 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
1d260 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
1d270 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
1d280 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
1d290 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
1d2a0 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
1d2b0 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
1d2c0 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
1d2d0 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
1d2e0 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
1d2f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1d300 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
1d310 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1d320 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1d330 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1d340 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1d350 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
1d360 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
1d370 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
1d380 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
1d390 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1d3a0 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
1d3b0 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
1d3c0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
1d3d0 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
1d3e0 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
1d3f0 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
1d400 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1d410 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
1d420 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
1d430 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
1d440 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
1d450 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
1d460 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d470 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1d480 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
1d490 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63  Context;.  Selec
1d4a0 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f  t *pParent;    /
1d4b0 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20  * Current UNION 
1d4c0 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ALL term of the 
1d4d0 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  other query */. 
1d4e0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
1d4f0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
1d500 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
1d510 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63  uery" */.  Selec
1d520 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f  t *pSub1;      /
1d530 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
1d540 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63   rightmost selec
1d550 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a  t in sub-query *
1d560 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
1d570 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
1d580 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1d590 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1d5a0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
1d5b0 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
1d5c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1d5d0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
1d5e0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
1d5f0 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
1d600 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
1d610 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
1d620 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
1d630 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
1d640 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
1d650 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
1d660 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
1d670 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1d680 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1d690 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  r */.  Expr *pWh
1d6a0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ere;            
1d6b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1d6c0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1d6d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1d6e0 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20  item *pSubitem; 
1d6f0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
1d700 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
1d710 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d720 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
1d730 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
1d740 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
1d750 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
1d760 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1d770 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
1d780 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
1d790 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f  );  /* Unable to
1d7a0 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e   flatten compoun
1d7b0 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  d queries */.  i
1d7c0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
1d7d0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1d7e0 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65  TE_QueryFlattene
1d7f0 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  r) ) return 0;. 
1d800 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1d810 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
1d820 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
1d830 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
1d840 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
1d850 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
1d860 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
1d870 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
1d880 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
1d890 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
1d8a0 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
1d8b0 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
1d8c0 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20  sAgg ){.    if( 
1d8d0 69 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  isAgg ) return 0
1d8e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d900 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1d910 28 31 29 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  (1)   */.    if(
1d920 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
1d930 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d950 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1d960 20 28 32 61 29 20 20 2a 2f 0a 20 20 20 20 69 66   (2a)  */.    if
1d970 28 20 28 70 2d 3e 70 57 68 65 72 65 20 26 26 20  ( (p->pWhere && 
1d980 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1d990 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f 53 75 62  p->pWhere,EP_Sub
1d9a0 71 75 65 72 79 29 29 0a 20 20 20 20 20 7c 7c 20  query)).     || 
1d9b0 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  (sqlite3ExprList
1d9c0 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69 73 74 29  Flags(p->pEList)
1d9d0 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21   & EP_Subquery)!
1d9e0 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69  =0.     || (sqli
1d9f0 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
1da00 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 20  (p->pOrderBy) & 
1da10 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a  EP_Subquery)!=0.
1da20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1da30 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1da70 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  2b)  */.    }.  
1da80 7d 0a 20 20 20 20 0a 20 20 70 53 75 62 53 72 63  }.    .  pSubSrc
1da90 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
1daa0 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
1dab0 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
1dac0 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
1dad0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1dae0 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
1daf0 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
1db00 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
1db10 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
1db20 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
1db30 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
1db40 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1db50 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
1db60 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
1db70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
1db80 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
1db90 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1dba0 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
1dbb0 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
1dbc0 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
1dbd0 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
1dbe0 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
1dbf0 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
1dc00 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1dc10 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
1dc20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1dc30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1dc40 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
1dc50 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65  if( pSub->pOffse
1dc60 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1dc90 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
1dca0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1dcb0 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21   & SF_Compound)!
1dcc0 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d  =0 && pSub->pLim
1dcd0 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  it ){.    return
1dce0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dd10 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1dd20 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
1dd30 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
1dd40 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dd70 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
1dd80 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1dd90 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72   SF_Distinct ) r
1dda0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1ddb0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1ddc0 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (5)  */.  if( 
1ddd0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1dde0 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
1ddf0 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
1de00 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1de10 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1de20 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a  s (8)(9) */.  }.
1de30 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1de40 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1de50 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79  )!=0 && subquery
1de60 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65  IsAgg ){.     re
1de70 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1de80 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1de90 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  6)  */.  }.  if(
1dea0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
1deb0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1dec0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1def0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1df00 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
1df10 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
1df20 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
1df30 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1df50 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1df60 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
1df70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
1df80 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
1df90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1dfa0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1dfb0 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  9) */.  if( pSub
1dfc0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e  ->pLimit && (p->
1dfd0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1dfe0 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20  stinct)!=0 ){.  
1dff0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1e000 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e010 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a  ion (21) */.  }.
1e020 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1e030 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1e040 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20 74  Recursive );.  t
1e050 65 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73  estcase( pSub->s
1e060 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 69 6e  elFlags & SF_Min
1e070 4d 61 78 41 67 67 20 29 3b 0a 20 20 69 66 28 20  MaxAgg );.  if( 
1e080 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1e090 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 7c 53   (SF_Recursive|S
1e0a0 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b 0a  F_MinMaxAgg) ){.
1e0b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1e0c0 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32   Restrictions (2
1e0d0 32 29 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a 20  2) and (24) */. 
1e0e0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1e0f0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1e100 73 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70  sive) && pSub->p
1e110 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
1e120 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
1e130 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20  ction (23) */.  
1e140 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45  }..  /* OBSOLETE
1e150 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a   COMMENT 1:.  **
1e160 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
1e170 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1e180 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
1e190 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
1e1a0 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
1e1b0 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
1e1c0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
1e1d0 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
1e1e0 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
1e1f0 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
1e200 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1e210 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1e220 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
1e230 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
1e240 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
1e250 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
1e260 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
1e270 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
1e280 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
1e290 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
1e2a0 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
1e2b0 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
1e2c0 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20  e thing..  **.  
1e2d0 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ** OBSOLETE COMM
1e2e0 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74  ENT 2:.  ** Rest
1e2f0 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20  riction 12:  If 
1e300 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1e310 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1e320 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
1e330 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b  r.  ** join, mak
1e340 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
1e350 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45  ery has no WHERE
1e360 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e   clause..  ** An
1e370 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   examples of why
1e380 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c   this is not all
1e390 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
1e3a0 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
1e3b0 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45  OUTER JOIN (SELE
1e3c0 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45  CT * FROM t2 WHE
1e3d0 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a  RE t2.x>0).  **.
1e3e0 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
1e3f0 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
1e400 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
1e410 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
1e420 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1e430 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e   t2) WHERE t2.x>
1e440 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20  0.  **.  ** But 
1e450 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20  the t2.x>0 test 
1e460 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c  will always fail
1e470 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f   on a NULL row o
1e480 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a  f t2, which.  **
1e490 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e   effectively con
1e4a0 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20  verts the OUTER 
1e4b0 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e  JOIN into an INN
1e4c0 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20  ER JOIN..  **.  
1e4d0 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45  ** THIS OVERRIDE
1e4e0 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  S OBSOLETE COMME
1e4f0 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56  NTS 1 AND 2 ABOV
1e500 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  E:.  ** Ticket #
1e510 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20  3300 shows that 
1e520 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72  flattening the r
1e530 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
1e540 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73  EFT JOIN.  ** is
1e550 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61   fraught with da
1e560 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61  nger.  Best to a
1e570 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74  void the whole t
1e580 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20  hing.  If the.  
1e590 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74  ** subquery is t
1e5a0 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
1e5b0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68   a LEFT JOIN, th
1e5c0 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65  en do not flatte
1e5d0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  n..  */.  if( (p
1e5e0 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
1e5f0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
1e600 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
1e610 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
1e620 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49  estriction 17: I
1e630 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1e640 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
1e650 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
1e660 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
1e670 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
1e680 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
1e690 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
1e6a0 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
1e6b0 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
1e6c0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
1e6d0 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
1e6e0 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
1e6f0 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
1e700 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
1e710 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
1e720 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  or ){.    if( pS
1e730 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1e740 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1e750 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e760 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  20 */.    }.    
1e770 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d  if( isAgg || (p-
1e780 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1e790 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70  istinct)!=0 || p
1e7a0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a  Src->nSrc!=1 ){.
1e7b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1e7c0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53      }.    for(pS
1e7d0 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b  ub1=pSub; pSub1;
1e7e0 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50   pSub1=pSub1->pP
1e7f0 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73  rior){.      tes
1e800 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
1e810 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1e820 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1e830 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
1e840 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ct );.      test
1e850 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
1e860 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1e870 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1e880 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
1e890 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  te );.      asse
1e8a0 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d  rt( pSub->pSrc!=
1e8b0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1e8c0 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  t( pSub->pEList-
1e8d0 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70  >nExpr==pSub1->p
1e8e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1e8f0 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31        if( (pSub1
1e900 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1e910 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1e920 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20  regate))!=0.    
1e930 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50     || (pSub1->pP
1e940 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f  rior && pSub1->o
1e950 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20  p!=TK_ALL) .    
1e960 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72     || pSub1->pSr
1e970 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20  c->nSrc<1.      
1e980 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1e990 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
1e9a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75     testcase( pSu
1e9b0 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31  b1->pSrc->nSrc>1
1e9c0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
1e9d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38  * Restriction 18
1e9e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1e9f0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1ea00 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
1ea10 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
1ea20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1ea30 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
1ea40 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
1ea50 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  >a[ii].u.x.iOrde
1ea60 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
1ea70 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1ea80 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a    }.  }..  /****
1ea90 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
1eaa0 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65  is point, flatte
1eab0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1eac0 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45  d. *****/.  SELE
1ead0 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
1eae0 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e  ,p,("flatten %s.
1eaf0 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c  %p from term %d\
1eb00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1eb10 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65         pSub->zSe
1eb20 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72  lName, pSub, iFr
1eb30 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68  om));..  /* Auth
1eb40 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
1eb50 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
1eb60 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1eb70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
1eb80 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
1eb90 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1eba0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1ebb0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1ebc0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
1ebd0 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
1ebe0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1ebf0 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
1ec00 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
1ec10 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
1ec20 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1ec30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ec40 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
1ec50 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
1ec60 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
1ec70 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
1ec80 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
1ec90 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
1eca0 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
1ecb0 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
1ecc0 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
1ecd0 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
1ece0 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
1ecf0 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
1ed00 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
1ed10 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1ed20 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
1ed30 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
1ed40 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
1ed50 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
1ed60 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
1ed70 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
1ed80 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
1ed90 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
1eda0 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
1edb0 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
1edc0 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
1edd0 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
1ede0 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
1edf0 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
1ee00 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
1ee10 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
1ee20 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
1ee30 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
1ee40 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
1ee50 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
1ee60 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
1ee70 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
1ee80 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
1ee90 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
1eea0 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1eeb0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1eec0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
1eed0 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
1eee0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1eef0 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1ef00 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
1ef10 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
1ef20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
1ef30 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
1ef40 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
1ef50 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1ef60 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
1ef70 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
1ef80 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1ef90 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1efa0 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
1efb0 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
1efc0 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
1efd0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1efe0 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
1eff0 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
1f000 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
1f010 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
1f020 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
1f030 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
1f040 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1f050 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
1f060 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
1f070 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
1f080 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1f090 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
1f0a0 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
1f0b0 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
1f0c0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
1f0d0 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
1f0e0 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20  Limit;.    Expr 
1f0f0 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  *pOffset = p->pO
1f100 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63  ffset;.    Selec
1f110 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
1f120 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
1f130 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1f140 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
1f150 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1f160 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
1f170 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  0;.    p->pOffse
1f180 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
1f190 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
1f1a0 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20  up(db, p, 0);.  
1f1b0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
1f1c0 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75  etName(pNew, pSu
1f1d0 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  b->zSelName);.  
1f1e0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
1f1f0 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70  Offset;.    p->p
1f200 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
1f210 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1f220 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
1f230 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
1f240 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
1f250 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
1f260 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1f270 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1f280 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f290 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
1f2a0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
1f2b0 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
1f2c0 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
1f2d0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
1f2e0 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
1f2f0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
1f300 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
1f310 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20  CE(2,pParse,p,. 
1f320 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75          ("compou
1f330 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1f340 74 65 6e 65 72 20 63 72 65 61 74 65 73 20 25 73  tener creates %s
1f350 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a  .%p as peer\n",.
1f360 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a           pNew->z
1f370 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b  SelName, pNew));
1f380 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
1f390 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f3a0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
1f3b0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74  .  /* Begin flat
1f3c0 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d  tening the iFrom
1f3d0 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
1f3e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20   FROM clause .  
1f3f0 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ** in the outer 
1f400 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53  query..  */.  pS
1f410 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75  ub = pSub1 = pSu
1f420 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
1f430 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
1f440 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
1f450 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
1f460 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1f470 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a   ** subquery.  *
1f480 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
1f490 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1f4a0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71  zDatabase);.  sq
1f4b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f4c0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
1f4d0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1f4e0 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1f4f0 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69  zAlias);.  pSubi
1f500 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1f510 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1f520 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75  zName = 0;.  pSu
1f530 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
1f540 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  0;.  pSubitem->p
1f550 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  Select = 0;..  /
1f560 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67  * Defer deleting
1f570 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
1f580 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1f590 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
1f5a0 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  ery until code g
1f5b0 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a  eneration is.  *
1f5c0 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63  * complete, sinc
1f5d0 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c  e there may stil
1f5e0 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61  l exist Expr.pTa
1f5f0 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20  b entries that. 
1f600 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
1f610 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
1f620 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
1f630 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
1f640 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74    **.  ** pSubit
1f650 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61  em->pTab is alwa
1f660 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74  ys non-NULL by t
1f670 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  est restrictions
1f680 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65   and tests above
1f690 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ..  */.  if( ALW
1f6a0 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54  AYS(pSubitem->pT
1f6b0 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61  ab!=0) ){.    Ta
1f6c0 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d  ble *pTabToDel =
1f6d0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
1f6e0 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44  .    if( pTabToD
1f6f0 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20  el->nRef==1 ){. 
1f700 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
1f710 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1f720 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1f730 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
1f740 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
1f750 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
1f760 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
1f770 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
1f780 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
1f790 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
1f7a0 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
1f7b0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20  >nRef--;.    }. 
1f7c0 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61     pSubitem->pTa
1f7d0 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 0;.  }..  /*
1f7e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
1f7f0 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
1f800 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61  r each term in a
1f810 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
1f820 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  ry.  ** flatteni
1f830 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64  ng (as described
1f840 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20   above).  If we 
1f850 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66  are doing a diff
1f860 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20  erent kind.  ** 
1f870 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20  of flattening - 
1f880 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68  a flattening oth
1f890 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75  er than a compou
1f8a0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1f8b0 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68  tening -.  ** th
1f8c0 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  en this loop onl
1f8d0 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
1f8e0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
1f8f0 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68   moves all of th
1f900 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
1f910 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1f920 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
1f930 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1f940 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f950 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
1f960 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
1f970 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
1f980 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
1f990 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
1f9a0 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
1f9b0 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
1f9c0 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
1f9d0 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
1f9e0 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
1f9f0 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
1fa00 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
1fa10 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
1fa20 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
1fa30 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
1fa40 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
1fa50 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
1fa60 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
1fa70 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
1fa80 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
1fa90 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
1faa0 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
1fab0 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74  */.  for(pParent
1fac0 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61  =p; pParent; pPa
1fad0 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50  rent=pParent->pP
1fae0 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d  rior, pSub=pSub-
1faf0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e  >pPrior){.    in
1fb00 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75  t nSubSrc;.    u
1fb10 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  8 jointype = 0;.
1fb20 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
1fb30 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  ub->pSrc;     /*
1fb40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1fb50 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
1fb60 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
1fb70 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d  c->nSrc;  /* Num
1fb80 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
1fb90 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  subquery FROM cl
1fba0 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63  ause */.    pSrc
1fbb0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
1fbc0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
1fbd0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1fbe0 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20  r query */..    
1fbf0 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
1fc00 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1fc10 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73  t==p );  /* Firs
1fc20 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74  t time through t
1fc30 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
1fc40 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
1fc50 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
1fc60 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
1fc70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1fc80 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
1fc90 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
1fca0 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
1fcb0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
1fcc0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
1fcd0 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
1fce0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
1fcf0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
1fd00 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
1fd10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1fd20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1fd30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
1fd40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1fd50 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
1fd60 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
1fd70 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
1fd80 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1fd90 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
1fda0 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
1fdb0 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
1fdc0 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
1fdd0 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
1fde0 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
1fdf0 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
1fe00 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
1fe10 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
1fe20 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
1fe30 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
1fe40 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1fe50 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
1fe60 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1fe70 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1fe80 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
1fe90 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
1fea0 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
1feb0 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
1fec0 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
1fed0 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
1fee0 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
1fef0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
1ff00 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
1ff10 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
1ff20 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
1ff30 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
1ff40 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
1ff50 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
1ff60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1ff70 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20   FROM clause to 
1ff80 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20  4 slots..    ** 
1ff90 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20  The middle slot 
1ffa0 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
1ffb0 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
1ffc0 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a  r to make space.
1ffd0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74      ** for the t
1ffe0 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1fff0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
20000 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
20010 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
20020 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
20030 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
20040 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  = pSrc = sqlite3
20050 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
20060 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63  b, pSrc, nSubSrc
20070 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20  -1,iFrom+1);.   
20080 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
20090 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
200a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
200b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
200c0 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f  Transfer the FRO
200d0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  M clause terms f
200e0 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
200f0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
20100 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
20110 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
20120 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
20130 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20140 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
20150 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
20160 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20  ].pUsing);.     
20170 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61   assert( pSrc->a
20180 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54  [i+iFrom].fg.isT
20190 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
201a0 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
201b0 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
201c0 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
201d0 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
201e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
201f0 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
20200 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
20210 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  From].fg.jointyp
20220 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
20230 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  .    /* Now begi
20240 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
20250 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
20260 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
20270 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  or .    ** refer
20280 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
20290 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
202a0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20  r query..    ** 
202b0 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
202c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
202d0 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
202e0 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
202f0 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
20300 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
20310 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20  E a>b;.    **   
20320 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
20330 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
20340 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
20350 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
20360 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c     /.    **    \
20370 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20380 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
20390 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
203a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
203b0 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  /.    **.    ** 
203c0 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
203d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
203e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
203f0 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
20400 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22  e see.    ** "a"
20410 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
20420 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
20430 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
20440 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
20450 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  +10"..    */.   
20460 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74   pList = pParent
20470 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
20480 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
20490 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
204a0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
204b0 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  i].zName==0 ){. 
204c0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
204d0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
204e0 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
204f0 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
20500 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
20510 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
20520 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
20530 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
20540 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
20550 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
20560 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
20570 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
20580 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
20590 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
205a0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
205b0 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
205c0 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
205d0 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
205e0 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
205f0 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
20600 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
20610 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
20620 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
20630 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
20640 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
20650 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
20660 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
20670 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
20680 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
20690 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
206a0 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
206b0 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
206c0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
206d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
206e0 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
206f0 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
20700 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
20710 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
20720 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
20730 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
20740 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
20750 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
20760 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
20770 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
20780 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
20790 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
207a0 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
207b0 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
207c0 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
207d0 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
207e0 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
207f0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
20800 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
20810 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
20820 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
20830 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
20840 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
20850 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
20860 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
20870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
20880 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
20890 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
208a0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
208b0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
208c0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
208d0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
208e0 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
208f0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
20900 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20   }.    pWhere = 
20910 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
20920 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
20930 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 75 62   0);.    if( sub
20940 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
20950 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
20960 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ent->pHaving==0 
20970 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
20980 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72  ->pHaving = pPar
20990 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  ent->pWhere;.   
209a0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
209b0 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
209c0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
209d0 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
209e0 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
209f0 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20  ->pHaving, .    
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
20a20 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
20a30 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20   pSub->pHaving, 
20a40 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0));.      asser
20a50 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  t( pParent->pGro
20a60 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
20a70 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
20a80 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
20a90 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
20aa0 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a  ->pGroupBy, 0);.
20ab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20ac0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
20ad0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
20ae0 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
20af0 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a  Where, pWhere);.
20b00 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74 53      }.    substS
20b10 65 6c 65 63 74 28 64 62 2c 20 70 50 61 72 65 6e  elect(db, pParen
20b20 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
20b30 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  ->pEList, 0);.  
20b40 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
20b50 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
20b60 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
20b70 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
20b80 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
20b90 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
20ba0 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
20bb0 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73  Parent->selFlags
20bc0 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61   |= pSub->selFla
20bd0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
20be0 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ;.  .    /*.    
20bf0 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
20c00 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
20c10 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
20c20 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
20c30 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
20c40 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
20c50 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
20c60 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
20c70 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
20c80 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
20c90 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
20ca0 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
20cb0 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
20cc0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
20cd0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
20ce0 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
20cf0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
20d00 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
20d10 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
20d20 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
20d30 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
20d40 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
20d50 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
20d60 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
20d70 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
20d80 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
20d90 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  1);..#if SELECTT
20da0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
20db0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
20dc0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
20dd0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
20de0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
20df0 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69  ("After flatteni
20e00 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  ng:\n"));.    sq
20e10 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
20e20 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
20e30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
20e40 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
20e50 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
20e60 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
20e70 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
20e80 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
20e90 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
20ea0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
20eb0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
20ec0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
20ed0 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  VIEW)./*.** Make
20ee0 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76   copies of relev
20ef0 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65  ant WHERE clause
20f00 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75   terms of the ou
20f10 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a  ter query into.*
20f20 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
20f30 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20  se of subquery. 
20f40 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
20f50 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
20f60 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c   (SELECT a AS x,
20f70 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74   c-d AS y FROM t
20f80 31 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44  1) WHERE x=5 AND
20f90 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61   y=10;.**.** Tra
20fa0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a  nsformed into:.*
20fb0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
20fc0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
20fd0 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
20fe0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
20ff0 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20   AND c-d=10).** 
21000 20 20 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e      WHERE x=5 AN
21010 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68  D y=10;.**.** Th
21020 65 20 68 6f 70 65 20 69 73 20 74 68 61 74 20 74  e hope is that t
21030 68 65 20 74 65 72 6d 73 20 61 64 64 65 64 20 74  he terms added t
21040 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72  o the inner quer
21050 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d  y will make it m
21060 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74  ore.** efficient
21070 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ..**.** Do not a
21080 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69  ttempt this opti
21090 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a  mization if:.**.
210a0 2a 2a 20 20 20 28 31 29 20 54 68 65 20 69 6e 6e  **   (1) The inn
210b0 65 72 20 71 75 65 72 79 20 69 73 20 61 6e 20 61  er query is an a
210c0 67 67 72 65 67 61 74 65 2e 20 20 28 49 6e 20 74  ggregate.  (In t
210d0 68 61 74 20 63 61 73 65 2c 20 77 65 27 64 20 72  hat case, we'd r
210e0 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20  eally want.**   
210f0 20 20 20 20 74 6f 20 63 6f 70 79 20 74 68 65 20      to copy the 
21100 6f 75 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75  outer WHERE-clau
21110 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  se terms onto th
21120 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
21130 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  of the.**       
21140 69 6e 6e 65 72 20 71 75 65 72 79 2e 20 20 42 75  inner query.  Bu
21150 74 20 74 68 65 79 20 70 72 6f 62 61 62 6c 79 20  t they probably 
21160 77 6f 6e 27 74 20 68 65 6c 70 20 74 68 65 72 65  won't help there
21170 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65   so do not bothe
21180 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  r.).**.**   (2) 
21190 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
211a0 69 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65  is the recursive
211b0 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f   part of a commo
211c0 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69  n table expressi
211d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  on..**.**   (3) 
211e0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
211f0 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  has a LIMIT clau
21200 73 65 20 28 73 69 6e 63 65 20 74 68 65 20 63 68  se (since the ch
21210 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45  anges to the WHE
21220 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73  RE.**       clos
21230 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74  e would change t
21240 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
21250 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20  e LIMIT)..**.** 
21260 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20    (4) The inner 
21270 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
21280 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
21290 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65  LEFT JOIN.  (The
212a0 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20   caller.**      
212b0 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72   enforces this r
212c0 65 73 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65  estriction since
212d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
212e0 65 73 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75  es not have enou
212f0 67 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f  gh.**       info
21300 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e  rmation to know.
21310 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68  ).**.**   (5) Th
21320 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  e WHERE clause e
21330 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
21340 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ates in the ON o
21350 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a  r USING clause.*
21360 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46  *       of a LEF
21370 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65  T JOIN..**.** Re
21380 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61  turn 0 if no cha
21390 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e  nges are made an
213a0 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e  d non-zero if on
213b0 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20  e or more WHERE 
213c0 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20  clause.** terms 
213d0 61 72 65 20 64 75 70 6c 69 63 61 74 65 64 20 69  are duplicated i
213e0 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79  nto the subquery
213f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21400 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
21410 6d 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ms(.  sqlite3 *d
21420 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  b,          /* T
21430 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
21440 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c  ection (for mall
21450 6f 63 28 29 29 20 2a 2f 0a 20 20 53 65 6c 65 63  oc()) */.  Selec
21460 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20  t *pSubq,       
21470 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
21480 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61   whose WHERE cla
21490 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67  use is to be aug
214a0 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  mented */.  Expr
214b0 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
214c0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
214d0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
214e0 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
214f0 74 20 69 43 75 72 73 6f 72 20 20 20 20 20 20 20  t iCursor       
21500 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
21510 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71  mber of the subq
21520 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  uery */.){.  Exp
21530 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
21540 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  Chng = 0;.  if( 
21550 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75  pWhere==0 ) retu
21560 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75  rn 0;.  if( (pSu
21570 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  bq->selFlags & (
21580 53 46 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f  SF_Aggregate|SF_
21590 52 65 63 75 72 73 69 76 65 29 29 21 3d 30 20 29  Recursive))!=0 )
215a0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
215b0 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73   /* restrictions
215c0 20 28 31 29 20 61 6e 64 20 28 32 29 20 2a 2f 0a   (1) and (2) */.
215d0 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d    }.  if( pSubq-
215e0 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20  >pLimit!=0 ){.  
215f0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
21600 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20  restriction (3) 
21610 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
21620 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
21630 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20  ND ){.    nChng 
21640 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  += pushDownWhere
21650 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62 71 2c  Terms(db, pSubq,
21660 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c   pWhere->pRight,
21670 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70   iCursor);.    p
21680 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
21690 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
216a0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
216b0 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
216c0 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
216d0 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
216e0 35 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  5 */.  if( sqlit
216f0 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
21700 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
21710 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
21720 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
21730 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
21740 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
21750 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72  xprDup(db, pWher
21760 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  e, 0);.      pNe
21770 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  w = substExpr(db
21780 2c 20 70 4e 65 77 2c 20 69 43 75 72 73 6f 72 2c  , pNew, iCursor,
21790 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 29 3b   pSubq->pEList);
217a0 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57  .      pSubq->pW
217b0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
217c0 70 72 41 6e 64 28 64 62 2c 20 70 53 75 62 71 2d  prAnd(db, pSubq-
217d0 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a  >pWhere, pNew);.
217e0 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53        pSubq = pS
217f0 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  ubq->pPrior;.   
21800 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21810 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20  nChng;.}.#endif 
21820 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
21830 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
21840 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
21850 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
21860 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20  */../*.** Based 
21870 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
21880 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  of the AggInfo s
21890 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
218a0 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a  ed by the first.
218b0 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69  ** argument, thi
218c0 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
218d0 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
218e0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
218f0 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72  **    * the quer
21900 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20  y contains just 
21910 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61  a single aggrega
21920 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20  te function,.** 
21930 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61     * the aggrega
21940 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  te function is e
21950 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d  ither min() or m
21960 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  ax(), and.**    
21970 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * the argument t
21980 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
21990 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f  function is a co
219a0 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  lumn value..**.*
219b0 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
219c0 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20  above are true, 
219d0 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  then WHERE_ORDER
219e0 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
219f0 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69  ORDERBY_MAX.** i
21a00 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70  s returned as ap
21a10 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c  propriate. Also,
21a20 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
21a30 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
21a40 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72  e .** list of ar
21a50 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
21a60 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
21a70 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
21a80 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
21a90 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
21aa0 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c  ove are not met,
21ab0 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
21ac0 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48  t to 0 and.** WH
21ad0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
21ae0 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  AL is returned..
21af0 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
21b00 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f  MaxQuery(AggInfo
21b10 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72   *pAggInfo, Expr
21b20 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29  List **ppMinMax)
21b30 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57  {.  int eRet = W
21b40 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
21b50 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  MAL;          /*
21b60 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
21b70 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  ..  *ppMinMax = 
21b80 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  0;.  if( pAggInf
21b90 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  o->nFunc==1 ){. 
21ba0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
21bb0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
21bc0 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67  [0].pExpr; /* Ag
21bd0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
21be0 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
21bf0 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72   *pEList = pExpr
21c00 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20  ->x.pList;      
21c10 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
21c20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  agg function */.
21c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
21c40 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
21c50 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69  UNCTION );.    i
21c60 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
21c70 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26  ist->nExpr==1 &&
21c80 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
21c90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
21ca0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
21cb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
21cc0 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  c = pExpr->u.zTo
21cd0 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ken;.      if( s
21ce0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
21cf0 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29  unc, "min")==0 )
21d00 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
21d10 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
21d20 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  IN;.        *ppM
21d30 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
21d40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21d50 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
21d60 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
21d70 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
21d80 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
21d90 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MAX;.        *pp
21da0 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
21db0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21dc0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
21dd0 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a  pMinMax==0 || (*
21de0 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72  ppMinMax)->nExpr
21df0 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
21e00 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eRet;.}../*.** T
21e10 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
21e20 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
21e30 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
21e40 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
21e50 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
21e60 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
21e70 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
21e80 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20   aggregate-info 
21e90 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a  object. This .**
21ea0 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20   function tests 
21eb0 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
21ec0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
21ed0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75  .**   SELECT cou
21ee0 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
21ef0 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
21f00 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65  le is a database
21f10 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75   table, not a su
21f20 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
21f30 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a  . If the query.*
21f40 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69  * does match thi
21f50 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
21f60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
21f70 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   Table object re
21f80 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74  presenting.** <t
21f90 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  bl> is returned.
21fa0 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
21fb0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
21fc0 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69  atic Table *isSi
21fd0 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74  mpleCount(Select
21fe0 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41   *p, AggInfo *pA
21ff0 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65  ggInfo){.  Table
22000 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a   *pTab;.  Expr *
22010 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74  pExpr;..  assert
22020 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  ( !p->pGroupBy )
22030 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  ;..  if( p->pWhe
22040 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  re || p->pEList-
22050 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c  >nExpr!=1 .   ||
22060 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
22070 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  1 || p->pSrc->a[
22080 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a  0].pSelect.  ){.
22090 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
220a0 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53  }.  pTab = p->pS
220b0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
220c0 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
220d0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
220e0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
220f0 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  & !pTab->pSelect
22100 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20   && pExpr );..  
22110 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
22120 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
22130 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
22140 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
22150 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
22160 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66  f( NEVER(pAggInf
22170 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72  o->nFunc==0) ) r
22180 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
22190 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
221a0 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  0].pFunc->funcFl
221b0 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ags&SQLITE_FUNC_
221c0 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75  COUNT)==0 ) retu
221d0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
221e0 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74  r->flags&EP_Dist
221f0 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
22200 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
22210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
22220 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
22230 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
22240 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
22250 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
22260 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
22270 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
22280 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
22290 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
222a0 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
222b0 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
222c0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
222d0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
222e0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
222f0 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
22300 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
22310 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
22320 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
22330 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
22340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
22350 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
22360 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
22370 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
22380 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
22390 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
223a0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
223b0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pFrom->fg.isInde
223c0 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62  xedBy ){.    Tab
223d0 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
223e0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
223f0 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70   *zIndexedBy = p
22400 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  From->u1.zIndexe
22410 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dBy;.    Index *
22420 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
22430 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
22440 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
22450 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
22460 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
22470 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20  ndexedBy); .    
22480 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70      pIdx=pIdx->p
22490 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Next.    );.    
224a0 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20  if( !pIdx ){.   
224b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
224c0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
224d0 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  uch index: %s", 
224e0 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a  zIndexedBy, 0);.
224f0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
22500 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
22510 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22520 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
22530 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e      pFrom->pIBIn
22540 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
22550 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22560 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65  OK;.}./*.** Dete
22570 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  ct compound SELE
22580 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  CT statements th
22590 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20  at use an ORDER 
225a0 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a  BY clause with .
225b0 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  ** an alternativ
225c0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
225d0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  ence..**.**    S
225e0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
225f0 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
22600 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  ... FROM t2 ORDE
22610 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20  R BY .. COLLATE 
22620 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ....**.** These 
22630 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73  are rewritten as
22640 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a   a subquery:.**.
22650 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
22660 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
22670 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
22680 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
22690 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  2).**     ORDER 
226a0 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e  BY ... COLLATE .
226b0 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  ...**.** This tr
226c0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
226d0 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
226e0 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63  e the multiSelec
226f0 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69  tOrderBy() routi
22700 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74  ne.** above that
22710 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
22720 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ode for a compou
22730 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61  nd SELECT with a
22740 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
22750 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67  e.** uses a merg
22760 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
22770 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61   requires the sa
22780 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
22790 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  uence on the.** 
227a0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61  result columns a
227b0 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s on the ORDER B
227c0 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74  Y clause.  See t
227d0 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f  icket.** http://
227e0 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
227f0 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64  rc/info/6709574d
22800 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  2a.**.** This tr
22810 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
22820 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
22830 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43  EXCEPT, INTERSEC
22840 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a  T, and UNION..**
22850 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
22860 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69  perator works fi
22870 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c  ne with multiSel
22880 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65  ectOrderBy() eve
22890 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20  n when.** there 
228a0 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d  are COLLATE term
228b0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
228c0 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
228d0 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
228e0 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
228f0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
22900 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
22910 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20  int i;.  Select 
22920 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
22930 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *pX;.  sqlite3 *
22940 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  db;.  struct Exp
22950 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
22960 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72   SrcList *pNewSr
22970 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c;.  Parse *pPar
22980 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  se;.  Token dumm
22990 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  y;..  if( p->pPr
229a0 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
229b0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
229c0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
229d0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
229e0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28  Continue;.  for(
229f0 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d  pX=p; pX && (pX-
22a00 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
22a10 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  X->op==TK_SELECT
22a20 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  ); pX=pX->pPrior
22a30 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20  ){}.  if( pX==0 
22a40 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
22a50 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e  tinue;.  a = p->
22a60 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66  pOrderBy->a;.  f
22a70 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79  or(i=p->pOrderBy
22a80 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b  ->nExpr-1; i>=0;
22a90 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
22aa0 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73  [i].pExpr->flags
22ab0 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20   & EP_Collate ) 
22ac0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
22ad0 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52   i<0 ) return WR
22ae0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f  C_Continue;..  /
22af0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
22b00 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
22b10 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f  eans the transfo
22b20 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  rmation is requi
22b30 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73  red. */..  pPars
22b40 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
22b50 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
22b60 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
22b70 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
22b80 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
22b90 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
22ba0 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
22bb0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65   WRC_Abort;.  me
22bc0 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20  mset(&dummy, 0, 
22bd0 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a  sizeof(dummy));.
22be0 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69    pNewSrc = sqli
22bf0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
22c00 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
22c10 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65  0,0,0,&dummy,pNe
22c20 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e  w,0,0);.  if( pN
22c30 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  ewSrc==0 ) retur
22c40 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a  n WRC_Abort;.  *
22c50 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e  pNew = *p;.  p->
22c60 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a  pSrc = pNewSrc;.
22c70 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71    p->pEList = sq
22c80 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
22c90 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
22ca0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
22cb0 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b  K_ASTERISK, 0));
22cc0 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  .  p->op = TK_SE
22cd0 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72  LECT;.  p->pWher
22ce0 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  e = 0;.  pNew->p
22cf0 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70  GroupBy = 0;.  p
22d00 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30  New->pHaving = 0
22d10 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
22d20 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72  By = 0;.  p->pPr
22d30 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e  ior = 0;.  p->pN
22d40 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57  ext = 0;.  p->pW
22d50 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65  ith = 0;.  p->se
22d60 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
22d70 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74  mpound;.  assert
22d80 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
22d90 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d   SF_Converted)==
22da0 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
22db0 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74  gs |= SF_Convert
22dc0 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  ed;.  assert( pN
22dd0 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b  ew->pPrior!=0 );
22de0 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d  .  pNew->pPrior-
22df0 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
22e00 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
22e10 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  0;.  pNew->pOffs
22e20 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  et = 0;.  return
22e30 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
22e40 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
22e50 20 73 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d   see if the FROM
22e60 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72   clause term pFr
22e70 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c  om has table-val
22e80 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ued function.** 
22e90 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69  arguments.  If i
22ea0 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e  t does, leave an
22eb0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
22ec0 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
22ed0 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c  urn.** non-zero,
22ee0 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20   since pFrom is 
22ef0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  not allowed to b
22f00 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  e a table-valued
22f10 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
22f20 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42  atic int cannotB
22f30 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  eFunction(Parse 
22f40 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
22f50 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
22f60 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
22f70 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
22f80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
22f90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
22fa0 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75  '%s' is not a fu
22fb0 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e  nction", pFrom->
22fc0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
22fd0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
22fe0 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 0;.}..#ifndef
22ff0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
23000 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
23010 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79  pWith (which may
23020 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73   be NULL) points
23030 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   to a linked lis
23040 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20  t of nested .** 
23050 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66  WITH contexts, f
23060 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74  rom inner to out
23070 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74  ermost. If the t
23080 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  able identified 
23090 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  by .** FROM clau
230a0 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d  se element pItem
230b0 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d   is really a com
230c0 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73  mon-table-expres
230d0 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74  sion (CTE) .** t
230e0 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
230f0 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20  nter to the CTE 
23100 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74  definition for t
23110 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72  hat table. Other
23120 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e  wise.** return N
23130 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
23140 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
23150 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20  s returned, set 
23160 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f  *ppContext to po
23170 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a  int to the With.
23180 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74  ** object that t
23190 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20  he returned CTE 
231a0 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73  belongs to..*/.s
231b0 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65  tatic struct Cte
231c0 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20   *searchWith(.  
231d0 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72  /* Current inner
23200 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
23210 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
23220 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23230 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ,     /* FROM cl
23240 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20  ause element to 
23250 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74  resolve */.  Wit
23260 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20  h **ppContext   
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23280 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65  OUT: WITH clause
23290 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65   return value be
232a0 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20  longs to */.){. 
232b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
232c0 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d  me;.  if( pItem-
232d0 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26  >zDatabase==0 &&
232e0 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d   (zName = pItem-
232f0 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
23300 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66    With *p;.    f
23310 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70  or(p=pWith; p; p
23320 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20  =p->pOuter){.   
23330 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
23340 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
23350 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
23360 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
23370 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61  ICmp(zName, p->a
23380 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
23390 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f  .          *ppCo
233a0 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  ntext = p;.     
233b0 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e       return &p->
233c0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
233d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
233e0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
233f0 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  ./* The code gen
23400 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73  erator maintains
23410 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69   a stack of acti
23420 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a  ve WITH clauses.
23430 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65  ** with the inne
23440 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  r-most WITH clau
23450 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20  se being at the 
23460 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
23470 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
23480 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20  tine pushes the 
23490 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73  WITH clause pass
234a0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
234b0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74   argument.** ont
234c0 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  o the top of the
234d0 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d   stack. If argum
234e0 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75  ent bFree is tru
234f0 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
23500 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c  WITH clause will
23510 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64   never be popped
23520 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
23530 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
23540 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72  .** should be fr
23550 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
23560 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
23570 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c   In other cases,
23580 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d   when.** bFree==
23590 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  0, the With obje
235a0 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  ct will be freed
235b0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
235c0 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
235d0 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20  ment with which 
235e0 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  it is associated
235f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23600 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20  3WithPush(Parse 
23610 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70  *pParse, With *p
23620 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b  With, u8 bFree){
23630 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65  .  assert( bFree
23640 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e  ==0 || (pParse->
23650 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72  pWith==0 && pPar
23660 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d  se->pWithToFree=
23670 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69  =0) );.  if( pWi
23680 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  th ){.    assert
23690 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21  ( pParse->pWith!
236a0 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57  =pWith );.    pW
236b0 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50  ith->pOuter = pP
236c0 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
236d0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
236e0 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20   pWith;.    if( 
236f0 62 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e  bFree ) pParse->
23700 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57  pWithToFree = pW
23710 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ith;.  }.}../*.*
23720 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23730 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65  checks if argume
23740 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20  nt pFrom refers 
23750 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65  to a CTE declare
23760 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20  d by .** a WITH 
23770 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74  clause on the st
23780 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61  ack currently ma
23790 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  intained by the 
237a0 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20  parser. And,.** 
237b0 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  if currently pro
237c0 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78  cessing a CTE ex
237d0 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20  pression, if it 
237e0 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a  is a recursive.*
237f0 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  * reference to t
23800 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a  he current CTE..
23810 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66  **.** If pFrom f
23820 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72  alls into either
23830 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65   of the two cate
23840 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46  gories above, pF
23850 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64  rom->pTab.** and
23860 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
23870 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f  e populated acco
23880 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c  rdingly. The cal
23890 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b  ler should check
238a0 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62  .** (pFrom->pTab
238b0 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  !=0) to determin
238c0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
238d0 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61   a successful ma
238e0 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64  tch.** was found
238f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
23900 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69  or not a match i
23910 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f  s found, SQLITE_
23920 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
23930 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f no error.** oc
23940 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
23950 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e  r does occur, an
23960 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
23970 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a  s stored in the.
23980 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f  ** parser and so
23990 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  me error code ot
239a0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
239b0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
239c0 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45  static int withE
239d0 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20  xpand(.  Walker 
239e0 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72  *pWalker, .  str
239f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23a00 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72   *pFrom.){.  Par
23a10 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
23a20 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
23a30 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
23a40 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75  arse->db;.  stru
23a50 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20  ct Cte *pCte;   
23a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
23a70 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e  atched CTE (or N
23a80 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29  ULL if no match)
23a90 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
23aa0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
23ab0 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c        /* WITH cl
23ac0 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62  ause that pCte b
23ad0 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
23ae0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23af0 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74  Tab==0 );..  pCt
23b00 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70  e = searchWith(p
23b10 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46  Parse->pWith, pF
23b20 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20  rom, &pWith);.  
23b30 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20  if( pCte ){.    
23b40 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
23b50 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
23b60 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
23b70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  Sel;.    Select 
23b80 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
23b90 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d         /* Left-m
23ba0 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
23bb0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
23bc0 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20  bMayRecursive;  
23bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
23be0 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f  e if compound jo
23bf0 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41  ined by UNION [A
23c00 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20  LL] */.    With 
23c10 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20  *pSavedWith;    
23c20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
23c30 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ial value of pPa
23c40 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20  rse->pWith */.. 
23c50 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a     /* If pCte->z
23c60 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55  CteErr is non-NU
23c70 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  LL at this point
23c80 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  , then this is a
23c90 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a  n illegal.    **
23ca0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
23cb0 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65  ence to CTE pCte
23cc0 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  . Leave an error
23cd0 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
23ce0 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72  eturn.    ** ear
23cf0 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74  ly. If pCte->zCt
23d00 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68  eErr is NULL, th
23d10 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  en this is not a
23d20 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
23d30 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  ence..    ** In 
23d40 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65  this case, proce
23d50 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
23d60 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b  pCte->zCteErr ){
23d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
23d80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
23d90 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43  Cte->zCteErr, pC
23da0 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
23db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23dc0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
23dd0 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e   if( cannotBeFun
23de0 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46  ction(pParse, pF
23df0 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51  rom) ) return SQ
23e00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20  LITE_ERROR;..   
23e10 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
23e20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pTab==0 );.    p
23e30 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
23e40 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
23e50 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
23e60 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
23e70 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
23e80 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
23e90 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
23ea0 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e   1;.    pTab->zN
23eb0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
23ec0 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  trDup(db, pCte->
23ed0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62  zName);.    pTab
23ee0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
23ef0 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
23f00 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
23f10 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
23f20 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
23f30 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
23f40 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
23f50 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  ral | TF_NoVisib
23f60 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72  leRowid;.    pFr
23f70 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
23f80 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
23f90 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
23fa0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
23fb0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23fc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23fd0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61  OMEM_BKPT;.    a
23fe0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
23ff0 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  elect );..    /*
24000 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
24010 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  s a recursive CT
24020 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d  E. */.    pSel =
24030 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
24040 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69  .    bMayRecursi
24050 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d  ve = ( pSel->op=
24060 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d  =TK_ALL || pSel-
24070 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
24080 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
24090 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
240a0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63  int i;.      Src
240b0 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72  List *pSrc = pFr
240c0 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  om->pSelect->pSr
240d0 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  c;.      for(i=0
240e0 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
240f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
24100 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
24110 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63  m *pItem = &pSrc
24120 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
24130 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
24140 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20  base==0 .       
24150 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d    && pItem->zNam
24160 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e!=0 .         &
24170 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
24180 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  Cmp(pItem->zName
24190 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20  , pCte->zName). 
241a0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
241b0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
241c0 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
241d0 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
241e0 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  Recursive = 1;. 
241f0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
24200 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
24210 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
24220 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b  |= SF_Recursive;
24230 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24240 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
24250 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73   Only one recurs
24260 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73  ive reference is
24270 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a   permitted. */ .
24280 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
24290 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ef>2 ){.      sq
242a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20  lite3ErrorMsg(. 
242b0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
242c0 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72   "multiple refer
242d0 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69  ences to recursi
242e0 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ve table: %s", p
242f0 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Cte->zName.     
24300 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
24310 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
24320 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24330 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c   pTab->nRef==1 |
24340 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  | ((pSel->selFla
24350 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29  gs&SF_Recursive)
24360 20 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d   && pTab->nRef==
24370 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d  2 ));..    pCte-
24380 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63  >zCteErr = "circ
24390 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20  ular reference: 
243a0 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57  %s";.    pSavedW
243b0 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ith = pParse->pW
243c0 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
243d0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
243e0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
243f0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62  elect(pWalker, b
24400 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f 20 70  MayRecursive ? p
24410 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53  Sel->pPrior : pS
24420 65 6c 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  el);.    pParse-
24430 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
24440 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70  .    for(pLeft=p
24450 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69  Sel; pLeft->pPri
24460 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d  or; pLeft=pLeft-
24470 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45  >pPrior);.    pE
24480 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45  List = pLeft->pE
24490 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43  List;.    if( pC
244a0 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20  te->pCols ){.   
244b0 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
244c0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
244d0 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
244e0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
244f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24500 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
24510 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f  has %d values fo
24520 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20  r %d columns",. 
24530 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d             pCte-
24540 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e  >zName, pEList->
24550 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f  nExpr, pCte->pCo
24560 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  ls->nExpr.      
24570 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61    );.        pPa
24580 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
24590 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20  vedWith;.       
245a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
245b0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
245c0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74      pEList = pCt
245d0 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a  e->pCols;.    }.
245e0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
245f0 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
24600 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
24610 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
24620 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->aCol);.    i
24630 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
24640 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
24650 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
24660 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
24670 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74         pCte->zCt
24680 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65  eErr = "multiple
24690 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
246a0 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20  ences: %s";.    
246b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
246c0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
246d0 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65   "recursive refe
246e0 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75  rence in a subqu
246f0 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ery: %s";.      
24700 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
24710 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
24720 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
24730 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
24740 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  r = 0;.    pPars
24750 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
24760 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65  dWith;.  }..  re
24770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24780 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
24790 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
247a0 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  E./*.** If the S
247b0 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73 20  ELECT passed as 
247c0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
247d0 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63  ent has an assoc
247e0 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63  iated WITH .** c
247f0 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72  lause, pop it fr
24800 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f  om the stack sto
24810 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
24820 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
24830 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
24840 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
24850 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  the xSelectCallb
24860 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20  ack2() callback 
24870 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  by.** sqlite3Sel
24880 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e  ectExpand() when
24890 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43   walking a SELEC
248a0 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76  T tree to resolv
248b0 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
248c0 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20   and other FROM 
248d0 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e  clause elements.
248e0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
248f0 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57   selectPopWith(W
24900 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
24910 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
24920 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
24930 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
24940 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66   With *pWith = f
24950 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
24960 3e 70 57 69 74 68 3b 0a 20 20 69 66 28 20 70 57  >pWith;.  if( pW
24970 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ith!=0 ){.    as
24980 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
24990 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith==pWith );.  
249a0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
249b0 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  = pWith->pOuter;
249c0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
249d0 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
249e0 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
249f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24a00 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
24a10 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
24a20 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
24a30 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
24a40 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
24a50 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
24a60 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
24a70 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
24a80 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
24a90 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
24aa0 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
24ab0 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
24ac0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24ad0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
24ae0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
24af0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
24b00 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
24b10 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
24b20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
24b30 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
24b40 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
24b50 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24b60 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
24b70 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
24b80 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
24b90 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
24ba0 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
24bb0 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
24bc0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
24bd0 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
24be0 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
24bf0 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
24c00 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
24c10 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
24c20 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
24c30 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
24c40 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
24c50 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
24c60 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
24c70 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70  e persistent rep
24c80 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
24c90 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
24ca0 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
24cb0 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
24cc0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
24cd0 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74  to accommodate t
24ce0 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
24cf0 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
24d00 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
24d10 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
24d20 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
24d30 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
24d40 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
24d50 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
24d60 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
24d70 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
24d80 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
24d90 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
24da0 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
24db0 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
24dc0 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
24dd0 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
24de0 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
24df0 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
24e00 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
24e10 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
24e20 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
24e30 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
24e40 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
24e50 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
24e60 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
24e70 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
24e80 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
24e90 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
24ea0 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
24eb0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
24ec0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
24ed0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
24ee0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
24ef0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
24f00 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
24f10 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
24f20 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
24f30 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
24f40 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c  ags;..  p->selFl
24f50 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
24f60 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ed;.  if( db->ma
24f70 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20  llocFailed  ){. 
24f80 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
24f90 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  ort;.  }.  if( N
24fa0 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29  EVER(p->pSrc==0)
24fb0 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20   || (selFlags & 
24fc0 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
24fd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
24fe0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
24ff0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
25000 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
25010 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
25020 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43  Walker->xSelectC
25030 61 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c 65 63 74  allback2==select
25040 50 6f 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73  PopWith ){.    s
25050 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
25060 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67 68 74  Parse, findRight
25070 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 2c 20  most(p)->pWith, 
25080 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  0);.  }..  /* Ma
25090 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
250a0 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
250b0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
250c0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
250d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
250e0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
250f0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
25100 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
25110 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
25120 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
25130 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
25140 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
25150 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
25160 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
25170 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
25180 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
25190 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
251a0 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
251b0 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
251c0 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
251d0 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
251e0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
251f0 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
25200 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
25210 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
25220 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
25230 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
25240 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
25250 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
25260 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
25270 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d  fg.isRecursive==
25280 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  0 || pFrom->pTab
25290 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
252a0 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
252b0 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sive ) continue;
252c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
252d0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23  om->pTab==0 );.#
252e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
252f0 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77  IT_CTE.    if( w
25300 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65  ithExpand(pWalke
25310 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75  r, pFrom) ) retu
25320 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25330 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
25340 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64  b ) {} else.#end
25350 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  if.    if( pFrom
25360 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
25370 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25380 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
25390 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
253a0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
253b0 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
253c0 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
253d0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
253e0 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
253f0 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a  ert( pSel!=0 );.
25400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
25410 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
25420 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
25430 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
25440 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74  ker, pSel) ) ret
25450 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
25460 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
25470 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
25480 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
25490 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
254a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
254b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
254c0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
254d0 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
254e0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
254f0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
25500 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f  (db, "sqlite_sq_
25510 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  %p", (void*)pTab
25520 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
25530 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
25540 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
25550 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  ior; }.      sql
25560 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
25570 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
25580 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
25590 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
255a0 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
255b0 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
255c0 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
255d0 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
255e0 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
255f0 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
25600 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   );.      pTab->
25610 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
25620 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
25630 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25640 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
25650 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
25660 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
25670 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
25680 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
25690 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
256a0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
256b0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
256c0 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
256d0 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
256e0 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
256f0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
25700 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
25710 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66  Tab->nRef==0xfff
25720 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
25730 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
25740 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
25750 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
25760 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
25770 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
25780 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
25790 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
257a0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
257b0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
257c0 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
257d0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69  >nRef++;.      i
257e0 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
257f0 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46  ab) && cannotBeF
25800 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
25810 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
25820 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
25830 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  rt;.      }.#if 
25840 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25850 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
25860 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
25870 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
25880 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69  ).      if( IsVi
25890 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70  rtual(pTab) || p
258a0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
258b0 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c          i16 nCol
258c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
258d0 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
258e0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
258f0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
25900 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
25910 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
25920 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
25930 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
25940 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
25950 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
25960 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
25970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
25980 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72  electSetName(pFr
25990 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61  om->pSelect, pTa
259a0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
259b0 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     nCol = pTab->
259c0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54  nCol;.        pT
259d0 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  ab->nCol = -1;. 
259e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
259f0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
25a00 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
25a10 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  );.        pTab-
25a20 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
25a30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25a40 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74   }..    /* Locat
25a50 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  e the index name
25a60 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44  d by the INDEXED
25a70 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61   BY clause, if a
25a80 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ny. */.    if( s
25a90 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
25aa0 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46  ookup(pParse, pF
25ab0 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65  rom) ){.      re
25ac0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25ad0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
25ae0 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
25af0 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
25b00 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
25b10 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
25b20 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
25b30 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69  ocFailed || sqli
25b40 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
25b50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
25b60 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
25b70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
25b80 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
25b90 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
25ba0 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
25bb0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
25bc0 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
25bd0 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
25be0 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
25bf0 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
25c00 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
25c10 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
25c20 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
25c30 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
25c40 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
25c50 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
25c60 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72  STERISK operator
25c70 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
25c80 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
25c90 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c  he column.  ** l
25ca0 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ist.  The follow
25cb0 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
25cc0 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
25cd0 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a  TK_ASTERISK.  **
25ce0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
25cf0 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65   expand each one
25d00 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
25d10 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20  all columns in. 
25d20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   ** all tables..
25d30 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
25d40 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
25d50 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
25d60 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
25d70 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
25d80 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
25d90 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
25da0 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
25db0 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
25dc0 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
25dd0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
25de0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45   pE->op==TK_ASTE
25df0 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  RISK ) break;.  
25e00 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
25e10 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
25e20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
25e30 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
25e40 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
25e50 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
25e60 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
25e70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
25e80 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
25e90 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
25ea0 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
25eb0 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  ak;.  }.  if( k<
25ec0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
25ed0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
25ee0 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
25ef0 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
25f00 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
25f10 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
25f20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
25f30 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
25f40 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
25f50 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
25f60 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
25f70 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
25f80 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
25f90 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
25fa0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
25fb0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
25fc0 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
25fd0 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
25fe0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
25ff0 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
26000 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
26010 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
26020 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
26030 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26050 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
26060 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
26070 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f  mes)==0;..    fo
26080 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
26090 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
260a0 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
260b0 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68  xpr;.      pRigh
260c0 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a  t = pE->pRight;.
260d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
260e0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
260f0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
26100 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
26110 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20  K_ASTERISK.     
26120 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b    && (pE->op!=TK
26130 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e  _DOT || pRight->
26140 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29  op!=TK_ASTERISK)
26150 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
26160 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
26170 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
26180 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
26190 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
261a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
261b0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
261c0 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
261d0 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
261e0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
261f0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
26200 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
26210 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
26220 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
26230 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
26240 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
26250 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e  1].zSpan = a[k].
26260 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20  zSpan;.         
26270 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
26280 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
26290 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20  zSpan = 0;.     
262a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b     }.        a[k
262b0 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
262c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
262d0 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
262e0 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
262f0 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
26300 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
26310 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
26320 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
26330 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
26340 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
26350 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
26360 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
26370 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b  har *zTName = 0;
26380 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
26390 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
263a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
263b0 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  E->op==TK_DOT ){
263c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
263d0 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  t( pE->pLeft!=0 
263e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
263f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
26400 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c  perty(pE->pLeft,
26410 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
26420 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
26430 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75  e = pE->pLeft->u
26440 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
26450 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
26460 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
26470 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
26480 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
26490 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
264a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
264b0 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
264c0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
264d0 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sub = pFrom->pSe
264e0 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20  lect;.          
264f0 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
26500 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
26510 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
26520 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d  char *zSchemaNam
26530 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
26540 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
26550 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
26560 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
26570 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
26580 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
26590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
265a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
265b0 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
265c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
265d0 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73  b==0 || (pSub->s
265e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
265f0 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20  tedFrom)==0 ){. 
26600 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20             pSub 
26610 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
26620 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73   if( zTName && s
26630 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
26640 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
26650 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26660 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26670 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26680 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71          iDb = sq
26690 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
266a0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
266b0 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
266c0 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d     zSchemaName =
266d0 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44   iDb>=0 ? db->aD
266e0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22  b[iDb].zName : "
266f0 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  *";.          }.
26700 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
26710 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
26720 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
26730 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
26740 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
26750 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
26760 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65    char *zColname
26770 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74  ;  /* The comput
26780 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ed column name *
26790 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  /.            ch
267a0 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f  ar *zToFree;   /
267b0 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e  * Malloced strin
267c0 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  g that needs to 
267d0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
267e0 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43          Token sC
267f0 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70  olname;  /* Comp
26800 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
26810 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a   as a token */..
26820 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
26830 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20  rt( zName );.   
26840 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
26850 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20  ame && pSub.    
26860 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
26870 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65  te3MatchSpanName
26880 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61  (pSub->pEList->a
26890 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54  [j].zSpan, 0, zT
268a0 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20  Name, 0)==0.    
268b0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
268c0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
268d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
268e0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
268f0 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
26900 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
26910 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d  n', omit it from
26920 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
26930 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
26940 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c  ult-set list unl
26950 65 73 73 20 74 68 65 20 53 45 4c 45 43 54 20 68  ess the SELECT h
26960 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64  as the SF_Includ
26970 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20  eHidden.        
26980 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a      ** bit set..
26990 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
269a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
269b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
269c0 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d  _IncludeHidden)=
269d0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
269e0 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  && IsHiddenColum
269f0 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
26a00 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ) .            )
26a10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26a20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
26a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26a40 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
26a50 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  1;..            
26a60 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d  if( i>0 && zTNam
26a70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
26a80 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d        if( (pFrom
26a90 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
26aa0 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20  JT_NATURAL)!=0. 
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
26ac0 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  & tableAndColumn
26ad0 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20  Index(pTabList, 
26ae0 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a  i, zName, 0, 0).
26af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
26b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26b10 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
26b20 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
26b30 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
26b40 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
26b50 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
26b60 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
26b70 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20  the join */.    
26b80 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
26b90 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
26ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26bb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
26bc0 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d  dListIndex(pFrom
26bd0 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
26be0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
26bf0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
26c00 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
26c10 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
26c20 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
26c40 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
26c50 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
26c60 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
26c70 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
26c80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
26c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26ca0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26cb0 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
26cc0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
26cd0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
26ce0 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
26cf0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
26d00 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a     zToFree = 0;.
26d10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26d20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
26d30 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
26d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
26d50 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  xpr *pLeft;.    
26d60 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
26d70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
26d80 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d  , TK_ID, zTabNam
26d90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26da0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
26db0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
26dc0 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
26dd0 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
26de0 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
26df0 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  emaName ){.     
26e00 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
26e10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
26e20 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d  b, TK_ID, zSchem
26e30 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  aName);.        
26e40 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
26e50 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
26e60 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
26e70 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ft, pExpr, 0);. 
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
26ea0 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
26ec0 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  olname = sqlite3
26ed0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
26ee0 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
26ef0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
26f00 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
26f10 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
26f20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26f30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26f40 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
26f50 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
26f60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26f70 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
26f80 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
26f90 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
26fa0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
26fb0 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
26fc0 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c  nInit(&sColname,
26fd0 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
26fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26ff0 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
27000 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43  Parse, pNew, &sC
27010 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  olname, 0);.    
27020 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
27030 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
27040 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
27050 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
27060 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
27070 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d  rList_item *pX =
27080 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e   &pNew->a[pNew->
27090 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20  nExpr-1];.      
270a0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
270b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
270c0 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
270d0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
270e0 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
270f0 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[j].zSpan);. 
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
27110 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
27120 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
27130 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
27150 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
27160 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
27170 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20  .%s.%s",.       
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271a0 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c      zSchemaName,
271b0 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e   zTabName, zColn
271c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
271d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
271e0 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
27210 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31  ->bSpanIsTab = 1
27220 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
27230 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27240 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
27250 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  oFree);.        
27260 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
27270 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
27280 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
27290 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
272a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
272b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
272c0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
272d0 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
272e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
272f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
27300 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27310 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
27320 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
27330 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27340 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27350 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
27360 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
27370 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d   pEList);.    p-
27380 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
27390 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
273a0 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
273b0 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
273c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
273d0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
273e0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
273f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
27400 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
27410 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
27420 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
27430 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
27440 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  bort;.  }.#endif
27450 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
27460 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
27470 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
27480 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
27490 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20  e walker..**.** 
274a0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
274b0 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e  e is the Walker.
274c0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
274d0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  en expression tr
274e0 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65  ees.** are walke
274f0 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63  d without any ac
27500 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65  tions being take
27510 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20  n at each node. 
27520 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20   Presumably,.** 
27530 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
27540 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61  e is used for Wa
27550 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
27560 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b  ck then .** Walk
27570 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
27580 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20  ck is set to do 
27590 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c  something useful
275a0 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73   for every .** s
275b0 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
275c0 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69  arser tree..*/.i
275d0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61  nt sqlite3ExprWa
275e0 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
275f0 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f  otUsed, Expr *No
27600 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
27610 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
27620 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
27630 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
27640 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
27650 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65   This routine "e
27660 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54  xpands" a SELECT
27670 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61   statement and a
27680 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65  ll of its subque
27690 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64  ries..** For add
276a0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
276b0 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d  ion on what it m
276c0 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22  eans to "expand"
276d0 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61   a SELECT.** sta
276e0 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20  tement, see the 
276f0 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73  comment on the s
27700 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b  electExpand work
27710 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76  er callback abov
27720 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69  e..**.** Expandi
27730 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ng a SELECT stat
27740 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ement is the fir
27750 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65  st step in proce
27760 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43  ssing a.** SELEC
27770 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  T statement.  Th
27780 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
27790 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e  nt must be expan
277a0 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61  ded before.** na
277b0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  me resolution is
277c0 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a   performed..**.*
277d0 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
277e0 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72  es wrong, an err
277f0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
27800 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73  itten into pPars
27810 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  e..** The callin
27820 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64  g function can d
27830 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65  etect the proble
27840 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  m by looking at 
27850 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20  pParse->nErr.** 
27860 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64  and/or pParse->d
27870 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e  b->mallocFailed.
27880 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27890 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
278a0 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  and(Parse *pPars
278b0 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
278c0 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ct){.  Walker w;
278d0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
278e0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
278f0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
27900 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
27910 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
27920 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
27930 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70   pParse->hasComp
27940 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53  ound ){.    w.xS
27950 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
27960 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
27970 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b  electToSubquery;
27980 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
27990 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
279a0 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65  ct);.  }.  w.xSe
279b0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
279c0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
279d0 20 69 66 28 20 28 70 53 65 6c 65 63 74 2d 3e 73   if( (pSelect->s
279e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
279f0 74 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20  tiValue)==0 ){. 
27a00 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
27a10 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f  back2 = selectPo
27a20 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c  pWith;.  }.  sql
27a30 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
27a40 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
27a50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27a60 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
27a70 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
27a80 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
27a90 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
27aa0 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
27ab0 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
27ac0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
27ad0 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
27ae0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
27af0 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
27b00 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
27b10 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
27b20 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
27b30 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
27b40 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
27b50 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
27b60 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
27b70 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
27b80 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
27b90 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
27ba0 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
27bb0 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
27bc0 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
27bd0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
27be0 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
27bf0 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
27c00 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
27c10 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
27c20 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
27c30 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
27c40 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
27c50 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
27c60 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
27c70 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
27c80 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
27c90 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
27ca0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
27cb0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
27cc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
27cd0 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
27ce0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
27cf0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
27d00 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
27d10 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
27d20 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
27d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
27d40 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
27d50 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29  asTypeInfo)==0 )
27d60 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
27d70 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
27d80 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
27d90 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
27da0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
27db0 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Src;.  for(i=0, 
27dc0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
27dd0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
27de0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
27df0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
27e00 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
27e10 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
27e20 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
27e30 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
27e40 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
27e50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
27e60 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
27e70 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
27e80 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
27e90 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
27ea0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
27eb0 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ct;.      if( pS
27ec0 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  el ){.        wh
27ed0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
27ee0 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
27ef0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
27f00 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
27f10 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
27f20 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
27f30 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
27f40 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
27f50 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
27f60 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
27f70 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
27f80 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
27f90 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
27fa0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
27fb0 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
27fc0 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
27fd0 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
27fe0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
27ff0 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
28000 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
28010 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
28020 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
28030 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
28040 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
28050 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
28060 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28070 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
28080 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
28090 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
280a0 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63  (w));.  w.xSelec
280b0 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
280c0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
280d0 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
280e0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
280f0 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
28100 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
28110 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
28120 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
28130 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
28140 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
28150 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
28160 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28170 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
28180 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
28190 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
281a0 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
281b0 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
281c0 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
281d0 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
281e0 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
281f0 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
28200 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
28210 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
28220 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
28230 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
28240 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
28250 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
28260 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
28270 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
28280 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
28290 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
282a0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
282b0 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
282c0 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
282d0 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
282e0 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
282f0 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
28300 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
28310 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
28320 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
28330 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
28340 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
28350 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
28360 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
28370 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
28380 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
28390 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
283a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
283b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
283c0 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
283d0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
283e0 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
283f0 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
28400 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73  tainer */.){.  s
28410 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
28420 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
28430 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
28440 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
28450 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28460 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
28470 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
28480 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
28490 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
284a0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
284b0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
284c0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
284d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
284e0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
284f0 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
28500 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
28510 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
28520 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
28530 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
28540 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
28550 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
28560 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
28570 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
28580 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
28590 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
285a0 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
285b0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
285c0 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
285d0 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
285e0 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
285f0 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
28600 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
28610 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
28620 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
28630 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
28640 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
28650 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
28660 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
28670 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
28680 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
28690 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
286a0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
286b0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
286c0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
286d0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
286e0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
286f0 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
28700 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
28710 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
28720 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
28730 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
28740 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
28750 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
28760 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
28770 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
28780 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
28790 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
287a0 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
287b0 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
287c0 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
287d0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
287e0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
287f0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
28800 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
28810 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
28820 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
28830 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
28840 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
28850 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
28860 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
28870 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
28880 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
28890 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
288a0 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
288b0 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
288c0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
288d0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
288e0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
288f0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
28900 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
28910 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
28920 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
28930 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
28940 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
28950 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
28960 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
28970 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
28980 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
28990 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
289a0 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
289b0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
289c0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
289d0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
289e0 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
289f0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
28a00 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
28a10 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
28a20 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
28a30 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
28a40 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
28a50 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
28a60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28a70 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
28a80 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
28a90 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
28aa0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
28ab0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
28ac0 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
28ad0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
28ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
28af0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
28b00 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
28b10 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
28b20 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  E->x.pList, 0, 0
28b30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28b40 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
28b50 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
28b60 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
28b70 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
28ba0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
28bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28bc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
28bd0 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
28be0 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
28bf0 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
28c00 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
28c10 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
28c20 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
28c30 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
28c40 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
28c50 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
28c60 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
28c70 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
28c80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
28c90 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
28ca0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
28cb0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
28cc0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
28cd0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
28ce0 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
28cf0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
28d00 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
28d10 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
28d20 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
28d30 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
28d40 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
28d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28d60 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
28d70 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
28d80 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
28d90 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28db0 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
28dc0 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
28dd0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
28de0 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
28df0 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
28e00 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
28e10 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
28e20 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
28e30 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
28e40 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
28e50 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
28e60 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
28e70 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
28e80 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
28e90 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
28ea0 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
28eb0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
28ec0 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
28ed0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
28ee0 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
28ef0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
28f00 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
28f10 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
28f20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
28f30 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
28f40 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
28f50 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
28f60 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
28f70 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
28f80 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
28f90 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
28fa0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
28fb0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
28fc0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
28fd0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
28fe0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
28ff0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
29000 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
29010 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
29020 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
29030 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
29040 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
29050 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
29060 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
29070 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
29080 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45  egAgg, 0, SQLITE
29090 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
290a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
290b0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
290c0 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
290d0 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
290e0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
290f0 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
29100 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
29110 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
29120 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20  ase( nArg==0 ); 
29130 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74   /* Error condit
29140 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ion */.      tes
29150 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b  tcase( nArg>1 );
29160 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72     /* Also an er
29170 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64  ror */.      cod
29180 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
29190 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
291a0 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
291b0 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
291c0 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
291d0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
291e0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
291f0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
29200 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
29210 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
29220 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
29230 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
29240 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
29250 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
29260 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
29270 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
29280 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
29290 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
292a0 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
292b0 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
292c0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
292d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
292e0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
292f0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
29300 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
29310 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
29320 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
29330 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
29340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
29350 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
29360 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
29370 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20  ator ) regHit = 
29380 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
29390 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
293a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
293b0 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30  llSeq, regHit, 0
293c0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
293d0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
293e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
293f0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
29400 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20  OP_AggStep0, 0, 
29410 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
29420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29430 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
29440 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
29450 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
29460 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
29470 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
29480 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
29490 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
294a0 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
294b0 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
294c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
294d0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
294e0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
294f0 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
29500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
29510 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
29520 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
29530 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29540 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
29550 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
29560 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67  efore populating
29570 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
29580 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61   registers, clea
29590 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  r the column cac
295a0 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  he..  ** Otherwi
295b0 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68  se, if any of th
295c0 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d  e required colum
295d0 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72  n values are alr
295e0 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20  eady present .  
295f0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c  ** in registers,
29600 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
29610 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43  () may use OP_SC
29620 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  opy to copy the 
29630 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43  value.  ** to pC
29640 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74  ->iMem. But by t
29650 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75  he time the valu
29660 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f  e is used, the o
29670 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72  riginal register
29680 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62  .  ** may have b
29690 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69  een used, invali
296a0 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72  dating the under
296b0 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c  lying buffer hol
296c0 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65  ding the.  ** te
296d0 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65  xt or blob value
296e0 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38  . See ticket [88
296f0 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a  3034dcb5]..  **.
29700 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c    ** Another sol
29710 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74  ution would be t
29720 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  o change the OP_
29730 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f  SCopy used to co
29740 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76  py cached.  ** v
29750 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43  alues to an OP_C
29760 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  opy..  */.  if( 
29770 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64  regHit ){.    ad
29780 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69  drHitTest = sqli
29790 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
297a0 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b   OP_If, regHit);
297b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
297c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
297d0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
297e0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
297f0 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
29800 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
29810 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
29820 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
29830 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
29840 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
29850 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
29860 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
29870 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
29880 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
29890 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
298a0 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
298b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
298c0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
298d0 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
298e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
298f0 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
29900 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
29910 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
29920 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
29930 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
29940 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
29950 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
29960 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29970 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
29980 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
29990 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
299a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
299c0 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
299d0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
299e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
299f0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
29a00 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
29a10 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a30 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
29a40 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
29a50 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
29a60 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
29a70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69  lain==2 ){.    i
29a80 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64  nt bCover = (pId
29a90 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69  x!=0 && (HasRowi
29aa0 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72  d(pTab) || !IsPr
29ab0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
29ac0 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20  dx)));.    char 
29ad0 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d  *zEqp = sqlite3M
29ae0 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
29af0 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  b, "SCAN TABLE %
29b00 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
29b10 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
29b20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20       bCover ? " 
29b30 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
29b40 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
29b50 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49       bCover ? pI
29b60 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20  dx->zName : "". 
29b70 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
29b80 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
29b90 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64       pParse->pVd
29ba0 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  be, OP_Explain, 
29bb0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
29bc0 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50  d, 0, 0, zEqp, P
29bd0 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b  4_DYNAMIC.    );
29be0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
29bf0 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d  efine explainSim
29c00 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a  pleCount(a,b,c).
29c10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
29c20 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
29c30 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
29c40 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
29c50 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
29c60 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
29c70 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61  s are returned a
29c80 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
29c90 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
29ca0 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  ture..** See com
29cb0 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49  ments in sqliteI
29cc0 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72  nt.h for further
29cd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
29ce0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29cf0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
29d00 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
29d10 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
29d20 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
29d30 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
29d40 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
29d50 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
29d60 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
29d70 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
29d80 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
29d90 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
29da0 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
29db0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
29dc0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
29dd0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
29de0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
29df0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
29e00 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
29e10 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
29e20 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
29e30 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
29e40 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
29e50 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
29e60 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
29e70 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
29e80 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
29e90 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
29ea0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
29eb0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
29ec0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
29ed0 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
29ee0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
29ef0 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
29f00 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
29f10 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
29f20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
29f30 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
29f40 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
29f50 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
29f60 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
29f70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
29f80 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
29f90 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
29fa0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
29fb0 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c  EList = 0;  /* L
29fc0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
29fd0 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
29fe0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
29ff0 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
2a000 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
2a010 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
2a020 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
2a030 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2a040 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2a050 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
2a060 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
2a070 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
2a080 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
2a090 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2a0a0 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
2a0b0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
2a0c0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2a0d0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
2a0e0 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
2a0f0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
2a100 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
2a110 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  unction */.  Dis
2a120 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
2a130 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
2a140 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
2a150 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2a160 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f  */.  SortCtx sSo
2a170 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt;         /* I
2a180 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
2a190 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  de the ORDER BY 
2a1a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49  clause */.  AggI
2a1b0 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
2a1c0 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
2a1d0 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
2a1e0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
2a1f0 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
2a200 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2a210 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
2a220 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
2a230 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2a240 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2a250 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a260 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  n */..#ifndef SQ
2a270 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2a280 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65  N.  int iRestore
2a290 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
2a2a0 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20  e->iSelectId;.  
2a2b0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2a2c0 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  d = pParse->iNex
2a2d0 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e  tSelectId++;.#en
2a2e0 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72  dif..  db = pPar
2a2f0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d  se->db;.  if( p=
2a300 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
2a310 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
2a320 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
2a330 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2a340 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
2a350 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
2a360 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
2a370 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
2a380 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
2a390 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
2a3a0 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c  gInfo));.#if SEL
2a3b0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2a3c0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65  .  pParse->nSele
2a3d0 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45  ctIndent++;.  SE
2a3e0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
2a3f0 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72  se,p, ("begin pr
2a400 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a  ocessing:\n"));.
2a410 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2a420 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2a430 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
2a440 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2a450 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2a460 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
2a470 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2a480 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2a490 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
2a4a0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2a4b0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2a4c0 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f  >eDest!=SRT_Fifo
2a4d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2a4e0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2a4f0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2a500 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20  T_DistQueue );. 
2a510 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2a520 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2a530 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ->eDest!=SRT_Que
2a540 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f  ue );.  if( Igno
2a550 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
2a560 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
2a570 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
2a580 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
2a590 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a5a0 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
2a5b0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2a5c0 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
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 63 61 72 64 20 7c 7c 0a 20 20  RT_Discard ||.  
2a5f0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2a600 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65  eDest==SRT_Queue
2a610 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73    || pDest->eDes
2a620 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
2a630 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
2a640 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a650 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65  DistQueue || pDe
2a660 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46  st->eDest==SRT_F
2a670 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ifo);.    /* If 
2a680 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
2a690 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
2a6a0 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
2a6b0 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
2a6c0 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
2a6d0 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
2a6e0 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
2a6f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2a700 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
2a710 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
2a720 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
2a730 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2a740 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
2a750 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
2a760 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
2a770 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  );.  memset(&sSo
2a780 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
2a790 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
2a7a0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2a7b0 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
2a7c0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  t = p->pSrc;.  i
2a7d0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2a7e0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2a7f0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2a800 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
2a810 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
2a820 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67  ist!=0 );.  isAg
2a830 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
2a840 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2a850 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  !=0;.#if SELECTT
2a860 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2a870 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2a880 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2a890 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2a8a0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2a8b0 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65   ("after name re
2a8c0 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  solution:\n"));.
2a8d0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2a8e0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2a8f0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2a900 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
2a910 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
2a920 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
2a930 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
2a940 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
2a950 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
2a960 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a970 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
2a980 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
2a990 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
2a9a0 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 2d  Parse, pDest, p-
2a9b0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
2a9c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
2a9d0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
2a9e0 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  if..  /* Try to 
2a9f0 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
2aa00 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2aa10 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68  lause up into th
2aa20 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a  e main query.  *
2aa30 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2aa40 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2aa50 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2aa60 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2aa70 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
2aa80 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
2aa90 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2aaa0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2aab0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2aac0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2aad0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
2aae0 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
2aaf0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
2ab00 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20 54   isAggSub;.    T
2ab10 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
2ab20 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
2ab30 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2ab40 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
2ab50 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
2ab60 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
2ab70 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
2ab80 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
2ab90 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
2aba0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
2abb0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
2abc0 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
2abd0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
2abe0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
2abf0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2ac00 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
2ac10 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
2ac20 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
2ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac40 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2ac50 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
2ac60 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
2ac70 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
2ac80 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2ac90 7d 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  }..    isAggSub 
2aca0 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
2acb0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2acc0 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
2acd0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
2ace0 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
2acf0 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
2ad00 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
2ad10 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
2ad20 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
2ad30 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2ad40 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
2ad50 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
2ad60 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
2ad70 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
2ad80 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
2ad90 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
2ada0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
2adb0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
2adc0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2add0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2ade0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2adf0 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
2ae00 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2ae10 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2ae20 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2ae30 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2ae40 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  f..  /* Get a po
2ae50 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75  inter the VDBE u
2ae60 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2ae70 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  n, allocating a 
2ae80 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a  new VDBE if one.
2ae90 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c    ** does not al
2aea0 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20  ready exist */. 
2aeb0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
2aec0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
2aed0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
2aee0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e  elect_end;..#ifn
2aef0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2af00 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
2af10 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
2af20 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
2af30 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
2af40 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
2af50 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
2af60 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
2af70 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
2af80 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
2af90 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
2afa0 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c  pDest);.    expl
2afb0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
2afc0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2afd0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2afe0 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  d);.#if SELECTTR
2aff0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2b000 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
2b010 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
2b020 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
2b030 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
2b040 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2b050 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
2b060 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  f.    return rc;
2b070 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2b080 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2b090 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
2b0a0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2b0b0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
2b0c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2b0d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
2b0e0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
2b0f0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
2b100 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2b110 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2b120 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2b130 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2b140 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2b150 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
2b160 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
2b170 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2b180 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
2b190 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2b1a0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
2b1b0 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
2b1c0 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
2b1d0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
2b1e0 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
2b1f0 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
2b200 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
2b210 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2b220 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
2b230 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
2b240 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
2b250 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
2b260 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
2b270 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
2b280 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
2b290 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
2b2a0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
2b2b0 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
2b2c0 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
2b2d0 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
2b2e0 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
2b2f0 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
2b300 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
2b310 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
2b320 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
2b330 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2b340 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
2b350 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2b360 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2b370 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2b380 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2b390 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
2b3a0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
2b3b0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2b3c0 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
2b3d0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2b3e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
2b3f0 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
2b400 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
2b410 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
2b420 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
2b430 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
2b440 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
2b450 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
2b460 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
2b470 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
2b480 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
2b490 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
2b4a0 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
2b4b0 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
2b4c0 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
2b4d0 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
2b4e0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
2b4f0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
2b500 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
2b510 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
2b520 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
2b530 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
2b540 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
2b550 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
2b560 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2b570 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
2b580 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
2b590 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
2b5a0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
2b5b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2b5c0 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
2b5d0 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
2b5e0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
2b5f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
2b600 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
2b610 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
2b620 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67    if( (pItem->fg
2b630 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
2b640 55 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26  UTER)==0.     &&
2b650 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
2b660 72 6d 73 28 64 62 2c 20 70 53 75 62 2c 20 70 2d  rms(db, pSub, p-
2b670 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
2b680 69 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a  iCursor).    ){.
2b690 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2b6a0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66  ENABLED.      if
2b6b0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2b6c0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2b6d0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52          SELECTTR
2b6e0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2b6f0 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45  ,p,("After WHERE
2b700 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77  -clause push-dow
2b710 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  n:\n"));.       
2b720 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2b730 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2b740 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2b750 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
2b760 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69  nerate code to i
2b770 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62  mplement the sub
2b780 71 75 65 72 79 0a 20 20 20 20 2a 2f 0a 20 20 20  query.    */.   
2b790 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
2b7a0 53 72 63 3d 3d 31 0a 20 20 20 20 20 26 26 20 28  Src==1.     && (
2b7b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2b7c0 5f 41 6c 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  _All)==0.     &&
2b7d0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2b7e0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2b7f0 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20  SubqCoroutine). 
2b800 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
2b810 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f  mplement a co-ro
2b820 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2b830 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
2b840 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
2b850 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f  t.      ** set o
2b860 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
2b870 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
2b880 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20    int addrTop = 
2b890 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2b8a0 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20  ntAddr(v)+1;.   
2b8b0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
2b8c0 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
2b8d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
2b8e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2b8f0 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
2b900 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
2b910 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  urn, 0, addrTop)
2b920 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2b930 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
2b940 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2b950 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ));.      pItem-
2b960 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61  >addrFillSub = a
2b970 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71  ddrTop;.      sq
2b980 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
2b990 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
2b9a0 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
2b9b0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2b9c0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
2b9d0 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
2b9e0 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
2b9f0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
2ba00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ba10 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2ba20 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
2ba30 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
2ba40 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
2ba50 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
2ba60 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76       pItem->fg.v
2ba70 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
2ba80 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2ba90 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69  gResult = dest.i
2baa0 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sdst;.      sqli
2bab0 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
2bac0 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65  ine(v, pItem->re
2bad0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2bae0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2baf0 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
2bb00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bb10 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
2bb20 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
2bb30 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
2bb40 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
2bb50 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
2bb60 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
2bb70 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
2bb80 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
2bb90 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
2bba0 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
2bbb0 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
2bbc0 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
2bbd0 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
2bbe0 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
2bbf0 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
2bc00 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
2bc10 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
2bc20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
2bc30 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
2bc40 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
2bc50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2bc60 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
2bc70 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
2bc80 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
2bc90 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73  tAddr;.      ass
2bca0 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72  ert( pItem->addr
2bcb0 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20  FillSub==0 );.  
2bcc0 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
2bcd0 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
2bce0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70  >nMem;.      top
2bcf0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
2bd00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2bd10 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d  nteger, 0, pItem
2bd20 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2bd30 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
2bd40 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72  illSub = topAddr
2bd50 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +1;.      if( pI
2bd60 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  tem->fg.isCorrel
2bd70 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ated==0 ){.     
2bd80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2bd90 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72  query is not cor
2bda0 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77  related and if w
2bdb0 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65  e are not inside
2bdc0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
2bdd0 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77   trigger, then w
2bde0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63  e only need to c
2bdf0 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65  ompute the value
2be00 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
2be10 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65  .        ** once
2be20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63  . */.        onc
2be30 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  eAddr = sqlite3C
2be40 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
2be50 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2be60 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2be70 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
2be80 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
2be90 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2bea0 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  me));.      }els
2beb0 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e  e{.        VdbeN
2bec0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
2bed0 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
2bee0 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
2bef0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2bf00 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2bf10 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
2bf20 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54  dest, SRT_EphemT
2bf30 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  ab, pItem->iCurs
2bf40 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  or);.      expla
2bf50 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74  inSetInteger(pIt
2bf60 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28  em->iSelectId, (
2bf70 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  u8)pParse->iNext
2bf80 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
2bf90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
2bfa0 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
2bfb0 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  st);.      pItem
2bfc0 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  ->pTab->nRowLogE
2bfd0 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65  st = pSub->nSele
2bfe0 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
2bff0 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69   onceAddr ) sqli
2c000 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2c010 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20  v, onceAddr);.  
2c020 20 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71      retAddr = sq
2c030 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2c040 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49  v, OP_Return, pI
2c050 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2c060 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2c070 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c  nt((v, "end %s",
2c080 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2c090 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
2c0a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
2c0b0 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74  (v, topAddr, ret
2c0c0 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Addr);.      sql
2c0d0 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
2c0e0 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
2c0f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
2c100 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2c110 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2c120 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
2c130 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53  ight -= sqlite3S
2c140 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
2c150 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
2c160 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c 65    /* Various ele
2c170 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c  ments of the SEL
2c180 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  ECT copied into 
2c190 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
2c1a0 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69  for.  ** conveni
2c1b0 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  ence */.  pEList
2c1c0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
2c1d0 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
2c1e0 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
2c1f0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
2c200 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
2c210 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63  ving;.  sDistinc
2c220 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73  t.isTnct = (p->s
2c230 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
2c240 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20  tinct)!=0;..#if 
2c250 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2c260 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
2c270 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2c280 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x400 ){.    SELE
2c290 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
2c2a0 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61  arse,p,("After a
2c2b0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61  ll FROM-clause a
2c2c0 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20  nalysis:\n"));. 
2c2d0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2c2e0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2c2f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2c300 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
2c310 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74   is DISTINCT wit
2c320 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75  h an ORDER BY bu
2c330 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  t is not an aggr
2c340 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a  egate, and .  **
2c350 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c   if the select-l
2c360 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ist is the same 
2c370 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  as the ORDER BY 
2c380 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20  list, then this 
2c390 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62  query.  ** can b
2c3a0 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
2c3b0 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74   GROUP BY. In ot
2c3c0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a  her words, this:
2c3d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
2c3e0 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
2c3f0 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45  yz FROM ... ORDE
2c400 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
2c410 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** is transforme
2c420 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d to:.  **.  ** 
2c430 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46      SELECT xyz F
2c440 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59  ROM ... GROUP BY
2c450 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79   xyz ORDER BY xy
2c460 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  z.  **.  ** The 
2c470 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70  second form is p
2c480 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69  referred as a si
2c490 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74  ngle index (or t
2c4a0 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62  emp-table) may b
2c4b0 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  e .  ** used for
2c4c0 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20   both the ORDER 
2c4d0 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
2c4e0 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f  processing. As o
2c4f0 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20  riginally .  ** 
2c500 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72  written the quer
2c510 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d  y must use a tem
2c520 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c  p-table for at l
2c530 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
2c540 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61  ORDER .  ** BY a
2c550 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64  nd DISTINCT, and
2c560 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70   an index or sep
2c570 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65  arate temp-table
2c580 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a   for the other..
2c590 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73    */.  if( (p->s
2c5a0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
2c5b0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
2c5c0 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
2c5d0 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ct .   && sqlite
2c5e0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
2c5f0 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c  (sSort.pOrderBy,
2c600 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a   pEList, -1)==0.
2c610 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46    ){.    p->selF
2c620 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
2c630 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70  inct;.    pGroup
2c640 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
2c650 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
2c660 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  stDup(db, pEList
2c670 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74  , 0);.    /* Not
2c680 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ice that even th
2c690 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63  ought SF_Distinc
2c6a0 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  t has been clear
2c6b0 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c  ed from p->selFl
2c6c0 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20  ags,.    ** the 
2c6d0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2c6e0 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20   is still set.  
2c6f0 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65  Hence, isTnct re
2c700 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20  presents the.   
2c710 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74   ** original set
2c720 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44  ting of the SF_D
2c730 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f  istinct flag, no
2c740 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  t the current se
2c750 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73  tting */.    ass
2c760 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69  ert( sDistinct.i
2c770 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20  sTnct );.  }..  
2c780 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
2c790 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2c7a0 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e, then create a
2c7b0 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
2c7c0 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65  x to.  ** do the
2c7d0 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74   sorting.  But t
2c7e0 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65  his sorting ephe
2c7f0 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68  meral index migh
2c800 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65  t end up.  ** be
2c810 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
2c820 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 65 78  e data can be ex
2c830 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
2c840 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a  orted order..  *
2c850 2a 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65  * If that is the
2c860 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
2c870 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2c880 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
2c890 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65  l be.  ** change
2c8a0 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
2c8b0 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65 20 6f  once we figure o
2c8c0 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
2c8d0 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a  ing index is.  *
2c8e0 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  * not needed.  T
2c8f0 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  he sSort.addrSor
2c900 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20  tIndex variable 
2c910 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
2c920 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20  itate.  ** that 
2c930 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
2c940 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
2c950 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
2c960 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
2c970 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
2c980 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2c990 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Parse, sSort.pOr
2c9a0 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74  derBy, 0, pEList
2c9b0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53  ->nExpr);.    sS
2c9c0 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70  ort.iECursor = p
2c9d0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2c9e0 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
2c9f0 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
2ca00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2ca10 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2ca20 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
2ca30 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20  sSort.iECursor, 
2ca40 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
2ca50 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e  nExpr+1+pEList->
2ca60 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20  nExpr, 0,.      
2ca70 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
2ca80 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a  nfo, P4_KEYINFO.
2ca90 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65        );.  }else
2caa0 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72  {.    sSort.addr
2cab0 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
2cac0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2cad0 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
2cae0 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
2caf0 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
2cb00 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
2cb10 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
2cb20 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
2cb30 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
2cb40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2cb50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
2cb60 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
2cb70 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
2cb80 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
2cb90 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
2cba0 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
2cbb0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2cbc0 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ;.  p->nSelectRo
2cbd0 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62  w = 320;  /* 4 b
2cbe0 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20  illion rows */. 
2cbf0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
2cc00 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
2cc10 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  , iEnd);.  if( p
2cc20 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73  ->iLimit==0 && s
2cc30 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2cc40 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex>=0 ){.    sql
2cc50 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
2cc60 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64  code(v, sSort.ad
2cc70 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f  drSortIndex, OP_
2cc80 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20  SorterOpen);.   
2cc90 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73   sSort.sortFlags
2cca0 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65   |= SORTFLAG_Use
2ccb0 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  Sorter;.  }..  /
2ccc0 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65  * Open an epheme
2ccd0 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ral index to use
2cce0 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
2ccf0 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
2cd00 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2cd10 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  SF_Distinct ){. 
2cd20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
2cd30 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Tnct = pParse->n
2cd40 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74  Tab++;.    sDist
2cd50 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20  inct.addrTnct = 
2cd60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2cd70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
2cd80 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
2cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cda0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
2cdb0 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  bTnct, 0, 0,.   
2cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdd0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2cde0 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  )keyInfoFromExpr
2cdf0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
2ce00 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20  pEList,0,0),.   
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
2ce30 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
2ce40 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2ce50 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
2ce60 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  D);.    sDistinc
2ce70 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
2ce80 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
2ce90 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b  RDERED;.  }else{
2cea0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
2ceb0 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
2cec0 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a  _DISTINCT_NOOP;.
2ced0 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67    }..  if( !isAg
2cee0 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
2cef0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67   ){.    /* No ag
2cf00 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2cf10 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  s and no GROUP B
2cf20 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
2cf30 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d  u16 wctrlFlags =
2cf40 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
2cf50 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f  ct ? WHERE_WANT_
2cf60 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 20  DISTINCT : 0);. 
2cf70 20 20 20 61 73 73 65 72 74 28 20 57 48 45 52 45     assert( WHERE
2cf80 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46  _USE_LIMIT==SF_F
2cf90 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20 20 20  ixedLimit );.   
2cfa0 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 70   wctrlFlags |= p
2cfb0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2cfc0 46 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20 20 20  FixedLimit;..   
2cfd0 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
2cfe0 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a  tabase scan. */.
2cff0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
2d000 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
2d010 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2d020 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70   pWhere, sSort.p
2d030 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d050 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73          p->pELis
2d060 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70  t, wctrlFlags, p
2d070 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
2d080 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
2d090 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2d0a0 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  nd;.    if( sqli
2d0b0 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
2d0c0 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c  wCount(pWInfo) <
2d0d0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29   p->nSelectRow )
2d0e0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
2d0f0 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57  ctRow = sqlite3W
2d100 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
2d110 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nt(pWInfo);.    
2d120 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74 69  }.    if( sDisti
2d130 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71  nct.isTnct && sq
2d140 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
2d150 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a  inct(pWInfo) ){.
2d160 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
2d170 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69  eTnctType = sqli
2d180 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
2d190 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ct(pWInfo);.    
2d1a0 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  }.    if( sSort.
2d1b0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2d1c0 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d    sSort.nOBSat =
2d1d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
2d1e0 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a  rdered(pWInfo);.
2d1f0 20 20 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e        if( sSort.
2d200 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f  nOBSat==sSort.pO
2d210 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
2d220 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
2d230 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2d240 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2d250 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e  /* If sorting in
2d260 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65  dex that was cre
2d270 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
2d280 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2d290 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63   .    ** instruc
2d2a0 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f  tion ended up no
2d2b0 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20  t being needed, 
2d2c0 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
2d2d0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2d2e0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  .    ** into an 
2d2f0 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  OP_Noop..    */.
2d300 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64      if( sSort.ad
2d310 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
2d320 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  & sSort.pOrderBy
2d330 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2d340 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
2d350 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  Noop(v, sSort.ad
2d360 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
2d370 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
2d380 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
2d390 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20  er loop. */.    
2d3a0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
2d3b0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
2d3c0 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26  t, -1, &sSort, &
2d3d0 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
2d3e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d3f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2d400 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28  reContinueLabel(
2d410 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  pWInfo),.       
2d420 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2d430 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
2d440 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20  bel(pWInfo));.. 
2d450 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61     /* End the da
2d460 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
2d470 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
2d480 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
2d490 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
2d4a0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
2d4b0 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74  when there exist
2d4c0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2d4d0 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20  ions or a GROUP 
2d4e0 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  BY clause.    **
2d4f0 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20   or both */.    
2d500 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
2d510 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
2d520 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
2d530 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
2d540 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
2d550 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
2d560 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
2d570 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
2d580 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
2d590 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
2d5a0 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
2d5b0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
2d5c0 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
2d5d0 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
2d5e0 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
2d5f0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
2d600 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
2d610 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
2d620 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
2d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d640 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
2d650 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
2d660 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
2d670 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
2d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2d690 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
2d6a0 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
2d6b0 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
2d6c0 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
2d6d0 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
2d6e0 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
2d6f0 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
2d700 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
2d710 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
2d720 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
2d730 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
2d740 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  End;        /* E
2d750 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  nd of processing
2d760 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
2d770 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
2d780 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50  PTab = 0;   /* P
2d790 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20  seudotable used 
2d7a0 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e  to decode sortin
2d7b0 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  g results */.   
2d7c0 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30   int sortOut = 0
2d7d0 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72  ;    /* Output r
2d7e0 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65  egister from the
2d7f0 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69   sorter */.    i
2d800 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20  nt orderByGrp = 
2d810 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68  0; /* True if th
2d820 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f  e GROUP BY and O
2d830 52 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20  RDER BY are the 
2d840 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  same */..    /* 
2d850 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61  Remove any and a
2d860 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65  ll aliases betwe
2d870 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  en the result se
2d880 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  t and the.    **
2d890 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2d8a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d8b0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
2d8c0 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20     int k;       
2d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8e0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2d8f0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
2d900 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2d910 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c  pItem;  /* For l
2d920 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72  ooping over expr
2d930 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74  ession in a list
2d940 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b   */..      for(k
2d950 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
2d960 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69  r, pItem=p->pELi
2d970 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  st->a; k>0; k--,
2d980 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2d990 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
2d9a0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
2d9b0 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47  }.      for(k=pG
2d9c0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70  roupBy->nExpr, p
2d9d0 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
2d9e0 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
2d9f0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
2da00 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20  tem->u.x.iAlias 
2da10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2da20 20 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73     assert( 66==s
2da30 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30  qlite3LogEst(100
2da40 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
2da50 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20  ->nSelectRow>66 
2da60 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
2da70 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = 66;.    }else{
2da80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
2da90 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2daa0 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  1) );.      p->n
2dab0 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20  SelectRow = 0;. 
2dac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2dad0 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20  there is both a 
2dae0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20  GROUP BY and an 
2daf0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2db00 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20  and they are.   
2db10 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74   ** identical, t
2db20 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f  hen it may be po
2db30 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c  ssible to disabl
2db40 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
2db50 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e  lause .    ** on
2db60 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61   the grounds tha
2db70 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77  t the GROUP BY w
2db80 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e  ill cause elemen
2db90 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a  ts to come out .
2dba0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f      ** in the co
2dbb0 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20  rrect order. It 
2dbc0 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74  also may not - t
2dbd0 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68  he GROUP BY migh
2dbe0 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64  t use a.    ** d
2dbf0 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68  atabase index th
2dc00 61 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74  at causes rows t
2dc10 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67  o be grouped tog
2dc20 65 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65  ether as require
2dc30 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74  d.    ** but not
2dc40 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64   actually sorted
2dc50 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65  . Either way, re
2dc60 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
2dc70 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52  at the.    ** OR
2dc80 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50  DER BY and GROUP
2dc90 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20   BY clauses are 
2dca0 74 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74  the same by sett
2dcb0 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47  ing the orderByG
2dcc0 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  rp.    ** variab
2dcd0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
2dce0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2dcf0 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c  ompare(pGroupBy,
2dd00 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
2dd10 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2dd20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b   orderByGrp = 1;
2dd30 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
2dd40 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74  Create a label t
2dd50 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77  o jump to when w
2dd60 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20  e want to abort 
2dd70 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  the query */.   
2dd80 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74   addrEnd = sqlit
2dd90 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2dda0 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  v);..    /* Conv
2ddb0 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ert TK_COLUMN no
2ddc0 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  des into TK_AGG_
2ddd0 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20  COLUMN and make 
2dde0 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a  entries in.    *
2ddf0 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61  * sAggInfo for a
2de00 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ll TK_AGG_FUNCTI
2de10 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72  ON nodes in expr
2de20 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  essions of the. 
2de30 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
2de40 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  tement..    */. 
2de50 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
2de60 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
2de70 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
2de80 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
2de90 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
2dea0 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70  bList;.    sNC.p
2deb0 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49  AggInfo = &sAggI
2dec0 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  nfo;.    sAggInf
2ded0 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65  o.mnReg = pParse
2dee0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41  ->nMem+1;.    sA
2def0 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
2df00 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
2df10 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
2df20 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67  pr : 0;.    sAgg
2df30 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20  Info.pGroupBy = 
2df40 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71  pGroupBy;.    sq
2df50 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2df60 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45  AggList(&sNC, pE
2df70 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
2df80 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2df90 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74  List(&sNC, sSort
2dfa0 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
2dfb0 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
2dfc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2dfd0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2dfe0 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
2dff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
2e000 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
2e010 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
2e020 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
2e030 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
2e040 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
2e050 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2e060 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e  sProperty(sAggIn
2e070 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
2e080 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2e090 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63   );.      sNC.nc
2e0a0 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67  Flags |= NC_InAg
2e0b0 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  gFunc;.      sql
2e0c0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2e0d0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
2e0e0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
2e0f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
2e100 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2e110 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75  s &= ~NC_InAggFu
2e120 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  nc;.    }.    sA
2e130 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70  ggInfo.mxReg = p
2e140 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2e150 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2e160 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2e170 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
2e180 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
2e190 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
2e1a0 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
2e1b0 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
2e1c0 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
2e1d0 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
2e1e0 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
2e1f0 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
2e200 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
2e210 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
2e220 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
2e230 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
2e240 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
2e250 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
2e260 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2e270 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  1;          /* A
2e280 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f  -vs-B comparisio
2e290 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20  n jump */.      
2e2a0 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
2e2b0 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  w;  /* Start of 
2e2c0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2e2d0 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
2e2e0 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e   row */.      in
2e2f0 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20  t regOutputRow; 
2e300 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
2e310 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
2e320 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
2e330 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
2e340 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
2e350 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
2e360 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
2e370 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2e380 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a  drTopOfLoop;  /*
2e390 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
2e3a0 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  t loop */.      
2e3b0 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
2e3c0 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70  dx; /* The OP_Op
2e3d0 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
2e3e0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2e3f0 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  x */.      int a
2e400 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  ddrReset;      /
2e410 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  * Subroutine for
2e420 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61   resetting the a
2e430 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20  ccumulator */.  
2e440 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74      int regReset
2e450 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  ;       /* Retur
2e460 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
2e470 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62  er for reset sub
2e480 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20  routine */..    
2e490 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2e4a0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
2e4b0 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
2e4c0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
2e4d0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
2e4e0 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
2e4f0 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
2e500 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
2e510 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
2e520 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
2e530 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
2e540 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f  ter all, the OP_
2e550 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72  SorterOpen instr
2e560 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
2e570 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
2e580 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
2e590 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e5a0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2e5b0 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
2e5c0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
2e5d0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
2e5e0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2e5f0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  e, pGroupBy, 0, 
2e600 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2e610 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
2e620 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
2e630 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2e640 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20  P_SorterOpen, . 
2e650 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
2e660 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
2e670 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
2e680 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
2e690 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
2e6a0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2e6b0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
2e6c0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
2e6d0 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
2e6e0 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
2e6f0 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
2e700 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
2e710 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
2e720 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
2e730 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
2e740 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2e750 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
2e760 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2e770 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
2e780 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
2e790 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2e7a0 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
2e7b0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2e7c0 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
2e7d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2e7e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2e7f0 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
2e800 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
2e810 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2e820 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2e830 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
2e840 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
2e850 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
2e860 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
2e870 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2e880 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e890 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2e8a0 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
2e8b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2e8c0 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
2e8d0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
2e8e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e8f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2e900 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
2e910 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2e920 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
2e930 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
2e940 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
2e950 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2e960 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
2e970 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f  AMem, iAMem+pGro
2e980 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
2e990 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
2e9a0 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
2e9b0 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
2e9c0 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
2e9d0 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
2e9e0 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
2e9f0 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
2ea00 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
2ea10 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
2ea20 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
2ea30 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
2ea40 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
2ea50 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
2ea60 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
2ea70 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
2ea80 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
2ea90 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
2eaa0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2eab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2eac0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2ead0 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
2eae0 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
2eaf0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
2eb00 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
2eb10 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
2eb20 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20   pGroupBy, 0,.  
2eb30 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52          WHERE_GR
2eb40 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79  OUPBY | (orderBy
2eb50 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54  Grp ? WHERE_SORT
2eb60 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a  BYGROUP : 0), 0.
2eb70 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
2eb80 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
2eb90 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2eba0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2ebb0 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
2ebc0 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42  pWInfo)==pGroupB
2ebd0 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
2ebe0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
2ebf0 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
2ec00 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
2ec10 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
2ec20 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
2ec30 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
2ec40 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
2ec50 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
2ec60 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
2ec70 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
2ec80 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
2ec90 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
2eca0 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
2ecb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ecc0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
2ecd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2ece0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
2ecf0 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
2ed00 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
2ed10 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
2ed20 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
2ed30 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
2ed40 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
2ed50 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
2ed60 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
2ed70 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
2ed80 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
2ed90 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
2eda0 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
2edb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
2edc0 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
2edd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2ede0 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20  nt regBase;.    
2edf0 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72      int regRecor
2ee00 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
2ee10 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Col;.        int
2ee20 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20   nGroupBy;..    
2ee30 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
2ee40 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20  able(pParse, .  
2ee50 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74            (sDist
2ee60 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28  inct.isTnct && (
2ee70 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44  p->selFlags&SF_D
2ee80 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20  istinct)==0) ?. 
2ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eea0 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20     "DISTINCT" : 
2eeb0 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20  "GROUP BY");..  
2eec0 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
2eed0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  t = 1;.        n
2eee0 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
2eef0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
2ef00 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70     nCol = nGroup
2ef10 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  By;.        j = 
2ef20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2ef30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2ef40 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
2ef50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2ef60 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
2ef70 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
2ef80 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
2ef90 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
2efa0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
2efb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2efc0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
2efd0 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
2efe0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2eff0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
2f000 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2f010 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
2f020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2f030 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2f040 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
2f050 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b   regBase, 0, 0);
2f060 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2f070 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
2f080 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2f090 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
2f0a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2f0b0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
2f0c0 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
2f0d0 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
2f0e0 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
2f0f0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
2f100 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2f110 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61  t r1 = j + regBa
2f120 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
2f130 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
2f140 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50  etColumnToReg(pP
2f150 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
2f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f170 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
2f180 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pCol->iColumn,
2f190 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72   pCol->iTable, r
2f1a0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
2f1b0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
2f1c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f1d0 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
2f1e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2f1f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2f200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f210 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
2f220 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
2f230 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
2f240 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f250 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2f260 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73  _SorterInsert, s
2f270 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2f280 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
2f290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
2f2a0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
2f2b0 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
2f2c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f2d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2f2e0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
2f2f0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
2f300 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2f310 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2f320 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
2f330 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72  ingIdxPTab = sor
2f340 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  tPTab = pParse->
2f350 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
2f360 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65  sortOut = sqlite
2f370 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2f380 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2f390 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f3a0 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
2f3b0 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f   sortPTab, sortO
2f3c0 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ut, nCol);.     
2f3d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f3e0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2f3f0 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rSort, sAggInfo.
2f400 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
2f410 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
2f420 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
2f430 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
2f440 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2f450 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
2f460 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
2f470 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
2f480 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2f490 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ear(pParse);..  
2f4a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2f4b0 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20  If the index or 
2f4c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
2f4d0 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55  used by the GROU
2f4e0 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20  P BY sort.      
2f4f0 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c  ** will naturall
2f500 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  y deliver rows i
2f510 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75  n the order requ
2f520 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45  ired by the ORDE
2f530 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c  R BY.      ** cl
2f540 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65  ause, cancel the
2f550 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2f560 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c   open coded earl
2f570 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ier..      **.  
2f580 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
2f590 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
2f5a0 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
2f5b0 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c  wer should resul
2f5c0 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  t regardless..  
2f5d0 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53      ** Use the S
2f5e0 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
2f5f0 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
2f600 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
2f610 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20  IMIZER to .     
2f620 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73   ** disable this
2f630 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
2f640 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
2f650 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  es.  */.      if
2f660 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20  ( orderByGrp && 
2f670 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2f680 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47  led(db, SQLITE_G
2f690 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20  roupByOrder) .  
2f6a0 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79       && (groupBy
2f6b0 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57  Sort || sqlite3W
2f6c0 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49  hereIsSorted(pWI
2f6d0 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20  nfo)).      ){. 
2f6e0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
2f6f0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2f700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2f710 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
2f720 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2f730 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
2f740 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
2f750 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
2f760 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
2f770 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
2f780 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
2f790 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
2f7a0 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
2f7b0 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
2f7c0 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
2f7d0 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
2f7e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2f7f0 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
2f800 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
2f810 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
2f820 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
2f830 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
2f840 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
2f850 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
2f860 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
2f870 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
2f880 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2f890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2f8a0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2f8b0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
2f8c0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2f8d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f8e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2f8f0 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67  SorterData, sAgg
2f900 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2f910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f920 20 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f             sortO
2f930 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20  ut, sortPTab);. 
2f940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
2f950 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
2f960 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
2f970 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
2f980 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
2f990 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f9a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
2f9b0 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c  mn, sortPTab, j,
2f9c0 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
2f9d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f9e0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
2f9f0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
2fa00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2fa10 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
2fa20 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
2fa30 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  xpr, iBMem+j);. 
2fa40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2fa50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fa60 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
2fa70 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69  ompare, iAMem, i
2fa80 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  BMem, pGroupBy->
2fa90 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
2faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fab0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
2fac0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
2fad0 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
2fae0 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
2faf0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2fb00 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2fb10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fb20 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
2fb30 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31  ddr1+1, 0, addr1
2fb40 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
2fb50 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e(v);..      /* 
2fb60 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
2fb70 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72  at runs whenever
2fb80 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68   the GROUP BY ch
2fb90 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  anges..      ** 
2fba0 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47  Changes in the G
2fbb0 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65  ROUP BY are dete
2fbc0 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  cted by the prev
2fbd0 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20  ious code.      
2fbe0 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68  ** block.  If th
2fbf0 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e  ere were no chan
2fc00 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20  ges, this block 
2fc10 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  is skipped..    
2fc20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
2fc30 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63  is code copies c
2fc40 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20  urrent group by 
2fc50 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62  terms in b0,b1,b
2fc60 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f  2,....      ** o
2fc70 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e  ver to a0,a1,a2.
2fc80 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20    It then calls 
2fc90 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
2fca0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61  utine.      ** a
2fcb0 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67  nd resets the ag
2fcc0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
2fcd0 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e  tor registers in
2fce0 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20   preparation.   
2fcf0 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65     ** for the ne
2fd00 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63  xt GROUP BY batc
2fd10 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
2fd20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2fd30 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42  eMove(pParse, iB
2fd40 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f  Mem, iAMem, pGro
2fd50 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  upBy->nExpr);.  
2fd60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fd70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2fd80 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
2fd90 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
2fda0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2fdb0 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f  nt((v, "output o
2fdc0 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  ne row"));.     
2fdd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fde0 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
2fdf0 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
2fe00 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61  End); VdbeCovera
2fe10 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
2fe20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68  eComment((v, "ch
2fe30 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29  eck abort flag")
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 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
2fe70 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
2fe80 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2fe90 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d  (v, "reset accum
2fea0 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
2feb0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
2fec0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2fed0 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20  lators based on 
2fee0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20  the content of. 
2fef0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
2ff00 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f  ent row.      */
2ff10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ff20 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2ff30 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61  dr1);.      upda
2ff40 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
2ff50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2ff60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2ff70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2ff80 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
2ff90 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2ffa0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
2ffb0 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
2ffc0 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
2ffd0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2ffe0 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
2fff0 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
30000 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
30010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30020 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
30030 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rNext, sAggInfo.
30040 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
30050 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
30060 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
30070 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
30080 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30090 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
300a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
300b0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
300c0 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e  op(v, addrSortin
300d0 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  gIdx);.      }..
300e0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
300f0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
30100 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
30110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30120 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
30130 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
30140 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
30150 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
30160 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
30170 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
30180 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f  .      /* Jump o
30190 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69  ver the subrouti
301a0 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nes.      */.   
301b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
301c0 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  to(v, addrEnd);.
301d0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
301e0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
301f0 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
30200 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
30210 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
30220 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
30230 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
30240 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
30250 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
30260 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
30270 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
30280 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
30290 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
302a0 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
302b0 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
302c0 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
302d0 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
302e0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
302f0 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
30300 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
30310 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
30320 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
30330 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
30340 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
30350 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
30360 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
30370 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
30380 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
30390 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
303a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
303b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
303c0 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
303d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
303e0 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
303f0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
30400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30410 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
30420 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
30430 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30440 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
30450 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  v, addrOutputRow
30460 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
30470 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
30480 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
30490 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
304a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
304b0 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
304c0 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
304d0 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
304e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
304f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
30500 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
30510 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
30520 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
30530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30540 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
30550 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
30560 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
30570 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
30580 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
30590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
305a0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
305b0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
305c0 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
305d0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
305e0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
305f0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
30600 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p->pEList, -1, &
30610 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20  sSort,.         
30620 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44               &sD
30630 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
30640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30650 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
30660 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
30670 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
30680 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
30690 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
306a0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
306b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
306c0 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
306d0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
306e0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
306f0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
30700 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
30710 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
30720 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
30730 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
30740 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
30750 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
30760 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
30770 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
30780 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
30790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
307a0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
307b0 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
307c0 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
307d0 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65  if pGroupBy.  Be
307e0 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75  gin aggregate qu
307f0 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52  eries without GR
30800 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65  OUP BY: */.    e
30810 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72  lse {.      Expr
30820 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  List *pDel = 0;.
30830 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30840 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20  MIT_BTREECOUNT. 
30850 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
30860 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  ;.      if( (pTa
30870 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e  b = isSimpleCoun
30880 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29  t(p, &sAggInfo))
30890 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
308a0 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75  * If isSimpleCou
308b0 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70  nt() returns a p
308c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c  ointer to a Tabl
308d0 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  e structure, the
308e0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
308f0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
30900 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
30910 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
30920 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f    **   SELECT co
30930 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
30940 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  >.        **.   
30950 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68       ** where th
30960 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
30970 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65  e returned repre
30980 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c  sents table <tbl
30990 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  >..        **.  
309a0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74        ** This st
309b0 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f  atement is so co
309c0 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20  mmon that it is 
309d0 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61  optimized specia
309e0 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20  lly. The.       
309f0 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73   ** OP_Count ins
30a00 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63  truction is exec
30a10 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74  uted either on t
30a20 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  he intkey table 
30a30 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
30a40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
30a50 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c  a for table <tbl
30a60 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69  > or on one of i
30a70 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20  ts indexes. It. 
30a80 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74         ** is bet
30a90 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74  ter to execute t
30aa0 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65  he op on an inde
30ab0 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72  x, as indexes ar
30ac0 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20  e almost.       
30ad0 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61   ** always sprea
30ae0 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61  d across less pa
30af0 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63  ges than their c
30b00 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
30b10 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  les..        */.
30b20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
30b30 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
30b40 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
30b50 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
30b60 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
30b70 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20   const int iCsr 
30b80 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
30b90 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ;     /* Cursor 
30ba0 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a  to scan b-tree *
30bb0 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
30bc0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
30bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30be0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
30bf0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b  ble */.        K
30c00 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
30c10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30c20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66      /* Keyinfo f
30c30 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78  or scanned index
30c40 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
30c50 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20  x *pBest = 0;   
30c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c70 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66   /* Best index f
30c80 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ound so far */. 
30c90 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74         int iRoot
30ca0 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20   = pTab->tnum;  
30cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
30cc0 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e  oot page of scan
30cd0 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20  ned b-tree */.. 
30ce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
30cf0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
30d00 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
30d10 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
30d20 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
30d30 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
30d40 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
30d50 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
30d60 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ch for the index
30d70 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f   that has the lo
30d80 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a  west scan cost..
30d90 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30da0 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31     ** (2011-04-1
30db0 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66  5) Do not do a f
30dc0 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75  ull scan of an u
30dd0 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a  nordered index..
30de0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30df0 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30     ** (2013-10-0
30e00 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20  3) Do not count 
30e10 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61  the entries in a
30e20 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a   partial index..
30e30 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30e40 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63     ** In practic
30e50 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  e the KeyInfo st
30e60 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74  ructure will not
30e70 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20   be used. It is 
30e80 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  only .        **
30e90 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20   passed to keep 
30ea0 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70  OP_OpenRead happ
30eb0 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
30ec0 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
30ed0 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73  wid(pTab) ) pBes
30ee0 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  t = sqlite3Prima
30ef0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
30f00 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  ;.        for(pI
30f10 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
30f20 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
30f30 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
30f40 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55      if( pIdx->bU
30f50 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
30f60 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
30f70 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
30f80 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20  zTabRow.        
30f90 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72     && pIdx->pPar
30fa0 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20  tIdxWhere==0.   
30fb0 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65          && (!pBe
30fc0 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64  st || pIdx->szId
30fd0 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64  xRow<pBest->szId
30fe0 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20  xRow).          
30ff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
31000 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  Best = pIdx;.   
31010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31020 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
31030 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
31040 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d    iRoot = pBest-
31050 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  >tnum;.         
31060 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
31070 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
31080 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  x(pParse, pBest)
31090 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
310a0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
310b0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
310c0 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
310d0 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
310e0 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
310f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31100 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f  ddOp4Int(v, OP_O
31110 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69  penRead, iCsr, i
31120 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20  Root, iDb, 1);. 
31130 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
31140 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
31150 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
31160 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
31170 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  r *)pKeyInfo, P4
31180 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
31190 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
311a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
311b0 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72  , OP_Count, iCsr
311c0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
311d0 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  [0].iMem);.     
311e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
311f0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
31200 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20  , iCsr);.       
31210 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
31220 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  unt(pParse, pTab
31230 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
31240 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
31250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
31260 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
31270 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
31280 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ck if the query 
31290 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
312a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
312b0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
312c0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
312d0 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   min(x) FROM ...
312e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
312f0 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
31300 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   ....        **.
31310 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74          ** If it
31320 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
31330 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
31340 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
31350 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
31360 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
31370 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
31380 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
31390 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
313a0 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  use. .        **
313b0 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
313c0 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
313d0 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
313e0 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
313f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  n.        ** add
31400 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72   vdbe code to br
31410 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70  eak out of the p
31420 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61  rocessing loop a
31430 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
31440 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
31450 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
31460 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
31470 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
31480 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
31490 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65  nteed to operate
314a0 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68   on the row with
314b0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20   the minimum or 
314c0 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20  maximum .       
314d0 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20   ** value of x, 
314e0 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71  the only row req
314f0 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20  uired)..        
31500 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20  **.        ** A 
31510 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
31520 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
31530 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
31540 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
31550 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
31560 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c   behavior as fol
31570 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  lows:.        **
31580 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
31590 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
315a0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
315b0 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
315c0 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
315d0 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
315e0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
315f0 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
31600 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
31610 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
31620 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20       for x..    
31630 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31640 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
31650 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
31660 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
31670 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
31680 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  h.        **    
31690 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
316a0 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
316b0 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
316c0 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
316d0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73          **     s
316e0 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
316f0 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
31700 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
31710 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
31720 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
31730 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
31740 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
31750 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
31760 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31770 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
31780 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Max = 0;.       
31790 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45   u8 flag = WHERE
317a0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
317b0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
317c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
317d0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
317e0 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
317f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
31800 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  f( p->pHaving==0
31810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
31820 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
31830 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69  (&sAggInfo, &pMi
31840 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  nMax);.        }
31850 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31860 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69   flag==0 || (pMi
31870 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d  nMax!=0 && pMinM
31880 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b  ax->nExpr==1) );
31890 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  ..        if( fl
318a0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
318b0 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
318c0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
318d0 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20   pMinMax, 0);.  
318e0 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
318f0 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20  MinMax;.        
31900 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
31910 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 4d  llocFailed || pM
31920 69 6e 4d 61 78 21 3d 30 20 29 3b 0a 20 20 20 20  inMax!=0 );.    
31930 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
31940 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
31950 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
31960 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  ax->a[0].sortOrd
31970 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45  er = flag!=WHERE
31980 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a  _ORDERBY_MIN ?1:
31990 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  0;.            p
319a0 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78  MinMax->a[0].pEx
319b0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
319c0 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  MN;.          }.
319d0 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
319e0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
319f0 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
31a00 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
31a10 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
31a20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
31a30 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
31a40 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
31a50 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
31a60 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
31a70 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74      ** of output
31a80 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
31a90 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
31aa0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
31ab0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
31ac0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
31ad0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
31ae0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
31af0 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30  Where, pMinMax,0
31b00 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20  ,flag,0);.      
31b10 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
31b20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
31b30 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
31b40 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
31b50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
31b60 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
31b70 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74   }.        updat
31b80 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
31b90 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
31ba0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31bb0 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70   pMinMax==0 || p
31bc0 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
31bd0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
31be0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
31bf0 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20  dered(pWInfo)>0 
31c00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
31c10 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
31c20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
31c30 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
31c40 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
31c50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29  omment((v, "%s()
31c60 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20   by index",.    
31c70 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
31c80 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
31c90 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
31ca0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  )));.        }. 
31cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
31cc0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
31cd0 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65          finalize
31ce0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
31cf0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
31d00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31d10 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
31d20 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
31d30 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
31d40 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
31d50 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55  drEnd, SQLITE_JU
31d60 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
31d70 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
31d80 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
31d90 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c  EList, -1, 0, 0,
31da0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
31db0 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61          pDest, a
31dc0 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29  ddrEnd, addrEnd)
31dd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
31de0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
31df0 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pDel);.    }. 
31e00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
31e10 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
31e20 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d  drEnd);.    .  }
31e30 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67   /* endif aggreg
31e40 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ate query */..  
31e50 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54  if( sDistinct.eT
31e60 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44  nctType==WHERE_D
31e70 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
31e80 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  D ){.    explain
31e90 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
31ea0 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20  , "DISTINCT");. 
31eb0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
31ec0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
31ed0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
31ee0 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
31ef0 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
31f00 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
31f10 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
31f20 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
31f30 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
31f40 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  By ){.    explai
31f50 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
31f60 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
31f70 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f          sSort.nO
31f80 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20  BSat>0 ? "RIGHT 
31f90 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59  PART OF ORDER BY
31fa0 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20  ":"ORDER BY");. 
31fb0 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
31fc0 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ail(pParse, p, &
31fd0 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  sSort, pEList->n
31fe0 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20  Expr, pDest);.  
31ff0 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  }..  /* Jump her
32000 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71  e to skip this q
32010 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
32020 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
32030 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20  bel(v, iEnd);.. 
32040 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68   /* The SELECT h
32050 61 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49  as been coded. I
32060 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72  f there is an er
32070 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65  ror in the Parse
32080 20 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a   structure,.  **
32090 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   set the return 
320a0 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72  code to 1. Other
320b0 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20  wise 0. */.  rc 
320c0 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  = (pParse->nErr>
320d0 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f  0);..  /* Contro
320e0 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
320f0 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
32100 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
32110 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
32120 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
32130 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
32140 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
32150 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
32160 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
32170 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
32180 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a  SelectId);..  /*
32190 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
321a0 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74   names if result
321b0 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
321c0 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74  are to be output
321d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
321e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
321f0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
32200 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
32210 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
32220 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
32230 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
32240 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
32250 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
32260 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Col);.  sqlite3D
32270 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
32280 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53  fo.aFunc);.#if S
32290 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
322a0 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  ED.  SELECTTRACE
322b0 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
322c0 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  d processing\n")
322d0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  );.  pParse->nSe
322e0 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65  lectIndent--;.#e
322f0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
32300 3b 0a 7d 0a                                      ;.}.