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

Artifact d9b8628acb98f1a38921888d823a6b70c7a7774b:


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 43  zType = sqlite3C
c650: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
c660: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
c670: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
c680: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
c690: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
c6a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
c6b0: 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e  OrigTab = pTab->
c6c0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
c6d0: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
c6e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
c6f0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
c700: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
c710: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
c720: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
c730: 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20        zOrigDb = 
c740: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
c750: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
c760: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  .        }.#else
c770: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c780: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
c790: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
c7a0: 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  R";.        }els
c7b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
c7c0: 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75  pe = sqlite3Colu
c7d0: 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43  mnType(&pTab->aC
c7e0: 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20  ol[iCol],0);.   
c7f0: 20 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20         estWidth 
c800: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c810: 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20  l].szEst;.      
c820: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
c830: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c840: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
c850: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c860: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
c870: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
c880: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
c890: 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
c8a0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
c8b0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
c8c0: 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69  d.      ** origi
c8d0: 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73  n info for the s
c8e0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
c8f0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
c900: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  f the SELECT.   
c910: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e     ** statement.
c920: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c930: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
c940: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
c950: 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  S = pExpr->x.pSe
c960: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
c970: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
c980: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
c990: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
c9a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
c9b0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
c9c0: 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53   );.      sNC.pS
c9d0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
c9e0: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
c9f0: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
ca00: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
ca10: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
ca20: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
ca30: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
ca40: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
ca50: 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74   &zOrigCol, &est
ca60: 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 62  Width); .      b
ca70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
ca80: 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  if.  }..#ifdef S
ca90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
caa0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20  UMN_METADATA  . 
cab0: 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b   if( pzOrigDb ){
cac0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f  .    assert( pzO
cad0: 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67  rigTab && pzOrig
cae0: 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72  Col );.    *pzOr
caf0: 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a  igDb = zOrigDb;.
cb00: 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d      *pzOrigTab =
cb10: 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a   zOrigTab;.    *
cb20: 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69  pzOrigCol = zOri
cb30: 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gCol;.  }.#endif
cb40: 0a 20 20 69 66 28 20 70 45 73 74 57 69 64 74 68  .  if( pEstWidth
cb50: 20 29 20 2a 70 45 73 74 57 69 64 74 68 20 3d 20   ) *pEstWidth = 
cb60: 65 73 74 57 69 64 74 68 3b 0a 20 20 72 65 74 75  estWidth;.  retu
cb70: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
cb80: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cb90: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
cba0: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
cbb0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
cbc0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
cbd0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
cbe0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
cbf0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
cc00: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
cc10: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
cc20: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
cc30: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
cc40: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
cc50: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
cc60: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
cc70: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
cc80: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
cc90: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  lt set */.){.#if
cca0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ccb0: 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65  _DECLTYPE.  Vdbe
ccc0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
ccd0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
cce0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
ccf0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
cd00: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e  = pTabList;.  sN
cd10: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
cd20: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
cd30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
cd40: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
cd50: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
cd60: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
cd70: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69   char *zType;.#i
cd80: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cd90: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
cda0: 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  TA.    const cha
cdb0: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
cdc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cdd0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
cde0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
cdf0: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
ce00: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
ce10: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
ce20: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
ce30: 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a   &zOrigCol, 0);.
ce40: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
ce50: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
ce60: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
ce70: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
ce80: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
ce90: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
cea0: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
ceb0: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
cec0: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
ced0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
cee0: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
cef0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
cf00: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
cf10: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
cf20: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
cf30: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
cf40: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
cf50: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
cf60: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41  v, i, COLNAME_TA
cf70: 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53  BLE, zOrigTab, S
cf80: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cf90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cfa0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cfb0: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
cfc0: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49  , zOrigCol, SQLI
cfd0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
cfe0: 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d  else.    zType =
cff0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
d000: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , p, 0, 0, 0, 0)
d010: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
d020: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d030: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d040: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
d050: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d060: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
d070: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
d080: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
d090: 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ) */.}../*.** Ge
d0a0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
d0b0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
d0c0: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
d0d0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
d0e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
d0f0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
d100: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
d110: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
d120: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
d130: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
d140: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
d150: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
d160: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d170: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
d180: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
d190: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
d1a0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
d1b0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
d1c0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
d1d0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
d1e0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
d1f0: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
d200: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d210: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
d220: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d230: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
d240: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
d250: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
d260: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
d270: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
d280: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
d290: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
d2a0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
d2b0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
d2c0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
d2d0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  if..  if( pParse
d2e0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
d2f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d300: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
d310: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
d320: 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
d330: 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  !=0 );.  pParse-
d340: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
d350: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
d360: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d370: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
d380: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
d390: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
d3a0: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
d3b0: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
d3c0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
d3d0: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
d3e0: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
d3f0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d400: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d410: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
d420: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d430: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d440: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
d450: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d460: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
d470: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d480: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
d490: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
d4a0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d4b0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d4c0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d4d0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d4e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d4f0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
d500: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47   || p->op==TK_AG
d510: 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
d520: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
d530: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
d540: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
d550: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
d560: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57      for(j=0; ALW
d570: 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  AYS(j<pTabList->
d580: 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nSrc); j++){.   
d590: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
d5a0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d  t->a[j].iCursor=
d5b0: 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65  =p->iTable ) bre
d5c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
d5d0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
d5e0: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
d5f0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
d600: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
d610: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
d620: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
d630: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
d640: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
d650: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
d660: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
d670: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
d680: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
d690: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
d6a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d6b0: 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
d6c0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
d6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d6e0: 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  f( !shortNames &
d6f0: 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  & !fullNames ){.
d700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d710: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d720: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d730: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
d740: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
d750: 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  b, pEList->a[i].
d760: 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44  zSpan), SQLITE_D
d770: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
d780: 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d  else if( fullNam
d790: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  es ){.        ch
d7a0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
d7b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
d7c0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d7d0: 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
d7e0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20  >zName, zCol);. 
d7f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d800: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d810: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d820: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44   zName, SQLITE_D
d830: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
d840: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d850: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d860: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d870: 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51  E_NAME, zCol, SQ
d880: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
d890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d8a0: 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
d8b0: 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74  char *z = pEList
d8c0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20  ->a[i].zSpan;.  
d8d0: 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73      z = z==0 ? s
d8e0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d8f0: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
d900: 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74  1) : sqlite3DbSt
d910: 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20  rDup(db, z);.   
d920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d930: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d940: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20  OLNAME_NAME, z, 
d950: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
d960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
d970: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
d980: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
d990: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  t, pEList);.}../
d9a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
d9b0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77  pression list (w
d9c0: 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74  hich is really t
d9d0: 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
d9e0: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66  ssions.** that f
d9f0: 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73  orm the result s
da00: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  et of a SELECT s
da10: 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74  tatement) comput
da20: 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
da30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
da40: 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77  r a table that w
da50: 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78  ould hold the ex
da60: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
da70: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20  *.** All column 
da80: 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e  names will be un
da90: 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ique..**.** Only
daa0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
dab0: 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20  s are computed. 
dac0: 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43   Column.zType, C
dad0: 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20  olumn.zColl,.** 
dae0: 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
daf0: 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a   of Column are z
db00: 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  eroed..**.** Ret
db10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
db20: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20   success.  If a 
db30: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
db40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
db50: 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e  ** store NULL in
db60: 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e   *paCol and 0 in
db70: 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75   *pnCol and retu
db80: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
db90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
dba0: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
dbb0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
dbc0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
dbd0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
dbe0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
dbf0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
dc00: 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20   Expr list from 
dc10: 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20  which to derive 
dc20: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
dc30: 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20    i16 *pnCol,   
dc40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
dc50: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
dc60: 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f   columns here */
dc70: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f  .  Column **paCo
dc80: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
dc90: 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ite the new colu
dca0: 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a  mn list here */.
dcb0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
dcc0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
dcd0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
dce0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
dcf0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
dd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
dd10: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75   counters */.  u
dd20: 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  32 cnt;         
dd30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
dd40: 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b  dex added to mak
dd50: 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75  e the name uniqu
dd60: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  e */.  Column *a
dd70: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20  Col, *pCol;     
dd80: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
dd90: 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f  g over result co
dda0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
ddb0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
ddc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ddd0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
dde0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
ddf0: 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20  .  Expr *p;     
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de10: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
de20: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
de30: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
de40: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
de50: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
de60: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  mn name */.  int
de70: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
de80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
de90: 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d   of name in zNam
dea0: 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74  e[] */.  Hash ht
deb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dec0: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
ded0: 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  le of column nam
dee0: 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  es */..  sqlite3
def0: 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20  HashInit(&ht);. 
df00: 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
df10: 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74     nCol = pEList
df20: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f  ->nExpr;.    aCo
df30: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
df40: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
df50: 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
df60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
df70: 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65   aCol==0 );.  }e
df80: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
df90: 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
dfa0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
dfb0: 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29  Col==(i16)nCol )
dfc0: 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  ;.  *pnCol = nCo
dfd0: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
dfe0: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
dff0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
e000: 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  l && !db->malloc
e010: 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f  Failed; i++, pCo
e020: 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
e030: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
e040: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
e050: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  umn.    */.    p
e060: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
e070: 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74  ipCollate(pEList
e080: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
e090: 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
e0a0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
e0b0: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
e0c0: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
e0d0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53   contains an "AS
e0e0: 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c   <name>" phrase,
e0f0: 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74   use <name> as t
e100: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d  he name */.    }
e110: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
e120: 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20   *pColExpr = p; 
e130: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
e140: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72  on that is the r
e150: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
e160: 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
e170: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
e180: 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61  /* Table associa
e190: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78  ted with this ex
e1a0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
e1b0: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
e1c0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
e1d0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
e1e0: 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
e1f0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
e200: 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
e210: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
e220: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
e230: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
e240: 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70  & ALWAYS(pColExp
e250: 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  r->pTab!=0) ){. 
e260: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
e270: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
e280: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
e290: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
e2a0: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
e2b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
e2c0: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
e2d0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
e2e0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
e2f0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
e300: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
e310: 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
e320: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
e330: 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
e340: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
e350: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
e360: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
e370: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
e380: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
e390: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
e3a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
e3b0: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
e3c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e3d0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
e3e0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
e3f0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
e400: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
e410: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
e420: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
e430: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
e440: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e    }.    }.    zN
e450: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
e460: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 7a  intf(db, "%s", z
e470: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  Name);..    /* M
e480: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
e490: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
e4a0: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
e4b0: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
e4c0: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
e4d0: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
e4e0: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
e4f0: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
e500: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
e510: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
e520: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
e530: 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
e540: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
e550: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
e560: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
e570: 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
e580: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
e590: 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
e5a0: 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
e5b0: 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
e5c0: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
e5d0: 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
e5e0: 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
e5f0: 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
e600: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e610: 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
e620: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
e630: 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
e640: 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
e650: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
e660: 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
e670: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
e680: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
e690: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
e6a0: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
e6b0: 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
e6c0: 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
e6d0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
e6e0: 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
e6f0: 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
e700: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
e710: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
e720: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
e730: 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
e740: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e750: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
e760: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
e770: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e780: 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
e790: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e7a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
e7b0: 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
e7c0: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
e7d0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
e7e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
e7f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e800: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e810: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
e820: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
e830: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
e840: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
e850: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
e860: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
e870: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
e880: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
e890: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
e8a0: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
e8b0: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
e8c0: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
e8d0: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
e8e0: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
e8f0: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
e900: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
e910: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
e920: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
e930: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e940: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
e950: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
e960: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
e970: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
e980: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69  resolved..*/.voi
e990: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
e9a0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
e9b0: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
e9c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e9d0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e9e0: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
e9f0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
ea00: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
ea10: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
ea20: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
ea30: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
ea40: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
ea50: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
ea60: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
ea70: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
ea80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ea90: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
eaa0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
eab0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
eac0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
ead0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
eae0: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
eaf0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
eb00: 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b    u64 szAll = 0;
eb10: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
eb20: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
eb30: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
eb40: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
eb50: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
eb60: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
eb70: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
eb80: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
eb90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
eba0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
ebb0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
ebc0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
ebd0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
ebe0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
ebf0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
ec00: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
ec10: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
ec20: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
ec30: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
ec40: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
ec50: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
ec60: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e  r *zType;.    in
ec70: 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20  t n, m;.    p = 
ec80: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
ec90: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
eca0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
ecb0: 2c 20 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73  , 0, &pCol->szEs
ecc0: 74 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d  t);.    szAll +=
ecd0: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20   pCol->szEst;.  
ece0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
ecf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
ed00: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69  finity(p);.    i
ed10: 66 28 20 7a 54 79 70 65 20 26 26 20 28 6d 20 3d  f( zType && (m =
ed20: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ed30: 28 7a 54 79 70 65 29 29 3e 30 20 29 7b 0a 20 20  (zType))>0 ){.  
ed40: 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
ed50: 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e  trlen30(pCol->zN
ed60: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  ame);.      pCol
ed70: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
ed80: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
ed90: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  (db, pCol->zName
eda0: 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20  , n+m+2);.      
edb0: 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  if( pCol->zName 
edc0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
edd0: 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e  y(&pCol->zName[n
ede0: 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29  +1], zType, m+1)
edf0: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e  ;.        pCol->
ee00: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
ee10: 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 20  LAG_HASTYPE;.   
ee20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ee30: 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  f( pCol->affinit
ee40: 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66  y==0 ) pCol->aff
ee50: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
ee60: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f  FF_BLOB;.    pCo
ee70: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
ee80: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ee90: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
eea0: 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  l && pCol->zColl
eeb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  ==0 ){.      pCo
eec0: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
eed0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
eee0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
eef0: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
ef00: 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74  szTabRow = sqlit
ef10: 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34  e3LogEst(szAll*4
ef20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
ef30: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
ef40: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
ef50: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
ef60: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
ef70: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
ef80: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
ef90: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
efa0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
efb0: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
efc0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
efd0: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
efe0: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
eff0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
f000: 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
f010: 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
f020: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
f030: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
f040: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
f050: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
f060: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
f070: 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
f080: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
f090: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
f0a0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
f0b0: 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
f0c0: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
f0d0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
f0e0: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
f0f0: 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
f100: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
f110: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
f120: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f130: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
f140: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
f150: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
f160: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
f170: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
f180: 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
f190: 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
f1a0: 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
f1b0: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
f1c0: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  d */.  assert( d
f1d0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
f1e0: 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d  sable );.  pTab-
f1f0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
f200: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
f210: 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
f220: 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
f230: 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
f240: 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
f250: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
f260: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
f270: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
f280: 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
f290: 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
f2a0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
f2b0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
f2c0: 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
f2d0: 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b   pTab, pSelect);
f2e0: 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
f2f0: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
f300: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f310: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
f320: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
f330: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f340: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
f350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
f360: 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
f370: 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
f380: 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
f390: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
f3a0: 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
f3b0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
f3c0: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
f3d0: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
f3e0: 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
f3f0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
f400: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
f410: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
f420: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76  ->pVdbe;.  if( v
f430: 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70  ==0 ){.    v = p
f440: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73  Parse->pVdbe = s
f450: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
f460: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
f470: 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62  ( v ) sqlite3Vdb
f480: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e  eAddOp0(v, OP_In
f490: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  it);.    if( pPa
f4a0: 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d  rse->pToplevel==
f4b0: 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  0.     && Optimi
f4c0: 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50  zationEnabled(pP
f4d0: 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f  arse->db,SQLITE_
f4e0: 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a  FactorOutConst).
f4f0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61      ){.      pPa
f500: 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
f510: 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  or = 1;.    }.. 
f520: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
f530: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
f540: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
f550: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
f560: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
f570: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
f580: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
f590: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
f5a0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
f5b0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
f5c0: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
f5d0: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
f5e0: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
f5f0: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
f600: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
f610: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
f620: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
f630: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
f640: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
f650: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
f660: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
f670: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
f680: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
f690: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
f6a0: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
f6b0: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
f6c0: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
f6d0: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
f6e0: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
f6f0: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
f700: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
f710: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
f720: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
f730: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
f740: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
f750: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
f760: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
f770: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
f780: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
f790: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
f7a0: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
f7b0: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
f7c0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
f7d0: 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20  (zero).** prior 
f7e0: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
f7f0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
f800: 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73  he iOffset regis
f810: 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74  ter (if it exist
f820: 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  s) is initialize
f830: 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a  d to the value.*
f840: 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e  * of the OFFSET.
f850: 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67    The iLimit reg
f860: 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
f870: 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20  ized to LIMIT.  
f880: 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66  Register.** iOff
f890: 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c  set+1 is initial
f8a0: 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46  ized to LIMIT+OF
f8b0: 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  FSET..**.** Only
f8c0: 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72   if pLimit!=0 or
f8d0: 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74   pOffset!=0 do t
f8e0: 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
f8f0: 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
f900: 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
f910: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
f920: 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
f930: 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
f940: 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
f950: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
f960: 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
f970: 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
f980: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f990: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
f9a0: 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
f9b0: 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
f9c0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
f9d0: 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
f9e0: 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
f9f0: 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
fa00: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
fa10: 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d   int n;.  if( p-
fa20: 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
fa30: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
fa40: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
fa50: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
fa60: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
fa70: 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20   ** controversy 
fa80: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
fa90: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
faa0: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
fab0: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
fac0: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
fad0: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
fae0: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
faf0: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rows..  */.  sql
fb00: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
fb10: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  ar(pParse);.  as
fb20: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
fb30: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74  ==0 || p->pLimit
fb40: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
fb50: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
fb60: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
fb70: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
fb80: 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
fb90: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
fba0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
fbb0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73  !=0 );.    if( s
fbc0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
fbd0: 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26  ger(p->pLimit, &
fbe0: 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
fbf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fc00: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
fc10: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
fc20: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
fc30: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
fc40: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
fc50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
fc60: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69  te3VdbeGoto(v, i
fc70: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65  Break);.      }e
fc80: 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20  lse if( n>=0 && 
fc90: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71  p->nSelectRow>sq
fca0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
fcb0: 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  )n) ){.        p
fcc0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
fcd0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
fce0: 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  4)n);.        p-
fcf0: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
fd00: 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20  FixedLimit;.    
fd10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
fd20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fd30: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
fd40: 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b  pLimit, iLimit);
fd50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fd60: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
fd70: 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74  ustBeInt, iLimit
fd80: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
fd90: 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
fda0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
fdb0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
fdc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fdd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
fde0: 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
fdf0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
fe00: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  v);.    }.    if
fe10: 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
fe20: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
fe30: 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70   = iOffset = ++p
fe40: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
fe50: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b     pParse->nMem+
fe60: 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  +;   /* Allocate
fe70: 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74   an extra regist
fe80: 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66  er for limit+off
fe90: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  set */.      sql
fea0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
feb0: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  rse, p->pOffset,
fec0: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
fed0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fee0: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
fef0: 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64  nt, iOffset); Vd
ff00: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ff10: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
ff20: 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75  ((v, "OFFSET cou
ff30: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
ff40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ff50: 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d  (v, OP_OffsetLim
ff60: 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66  it, iLimit, iOff
ff70: 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b  set+1, iOffset);
ff80: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
ff90: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46  nt((v, "LIMIT+OF
ffa0: 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20  FSET"));.    }. 
ffb0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
ffc0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
ffd0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
ffe0: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
fff0: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
10000 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
10010 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
10020 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
10030 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
10040 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
10050 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
10060 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
10070 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
10080 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
10090 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
100a0 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
100b0 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
100c0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
100d0 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
100e0 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
100f0 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
10100 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
10110 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10120 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
10130 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
10140 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
10150 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
10160 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
10170 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
10180 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
10190 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
101a0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
101b0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
101c0 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
101d0 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
101e0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
101f0 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20  iCol>=0 );.  /* 
10200 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73  iCol must be les
10210 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74  s than p->pEList
10220 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77  ->nExpr.  Otherw
10230 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75  ise an error wou
10240 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ld.  ** have bee
10250 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20  n thrown during 
10260 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
10270 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74  and we would not
10280 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a   have gotten.  *
10290 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20  * this far */.  
102a0 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41  if( pRet==0 && A
102b0 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45  LWAYS(iCol<p->pE
102c0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
102d0 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
102e0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
102f0 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
10300 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
10310 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
10320 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
10330 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
10340 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
10350 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
10360 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
10370 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e  ELECT.** with an
10380 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
10390 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
103a0 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65  allocates and re
103b0 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a  turns a KeyInfo.
103c0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73 75 69  ** structure sui
103d0 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d  table for implem
103e0 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
103f0 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65   BY..**.** Space
10400 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
10410 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
10420 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
10430 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c  malloc. The call
10440 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
10450 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
10460 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  or ensuring that
10470 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
10480 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
10490 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
104a0 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69  c KeyInfo *multi
104b0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
104c0 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
104d0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
104e0 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78  nt nExtra){.  Ex
104f0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
10500 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
10510 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d    int nOrderBy =
10520 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45   p->pOrderBy->nE
10530 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr;.  sqlite3 *
10540 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10550 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74  .  KeyInfo *pRet
10560 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
10570 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65  oAlloc(db, nOrde
10580 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a  rBy+nExtra, 1);.
10590 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
105a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
105b0 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
105c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
105d0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
105e0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72  em *pItem = &pOr
105f0 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20  derBy->a[i];.   
10600 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d     Expr *pTerm =
10610 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
10620 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
10630 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  oll;..      if( 
10640 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
10650 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
10660 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
10670 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
10680 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a  pParse, pTerm);.
10690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
106a0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c       pColl = mul
106b0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
106c0 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d  pParse, p, pItem
106d0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
106e0 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l-1);.        if
106f0 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f  ( pColl==0 ) pCo
10700 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
10710 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  ll;.        pOrd
10720 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
10730 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   =.          sql
10740 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
10750 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c  teString(pParse,
10760 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a   pTerm, pColl->z
10770 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
10780 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
10790 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
107a0 74 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a  teable(pRet) );.
107b0 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c        pRet->aCol
107c0 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
107d0 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f      pRet->aSortO
107e0 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72  rder[i] = pOrder
107f0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
10800 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  er;.    }.  }.. 
10810 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
10820 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10830 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54  OMIT_CTE./*.** T
10840 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
10850 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20  rates VDBE code 
10860 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
10870 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48  ontent of a WITH
10880 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75   RECURSIVE.** qu
10890 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ery of the form:
108a0 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73  .**.**   <recurs
108b0 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c  ive-table> AS (<
108c0 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49  setup-query> UNI
108d0 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73  ON [ALL] <recurs
108e0 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20  ive-query>).**  
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
10910 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20  ___/            
10920 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
10930 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10950 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20  p->pPrior       
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10970 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  .**.**.** There 
10980 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72  is exactly one r
10990 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
109a0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
109b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
109c0 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69  se.** of recursi
109d0 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64  ve-query, marked
109e0 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73   with the SrcLis
109f0 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75  t->a[].fg.isRecu
10a00 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a  rsive flag..**.*
10a10 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72  * The setup-quer
10a20 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67  y runs once to g
10a30 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69  enerate an initi
10a40 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74  al set of rows t
10a50 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61  hat go.** into a
10a60 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52   Queue table.  R
10a70 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ows are extracte
10a80 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65  d from the Queue
10a90 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a   table one by.**
10aa0 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20   one.  Each row 
10ab0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
10ac0 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74  ueue is output t
10ad0 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74  o pDest.  Then t
10ae0 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74  he single.** ext
10af0 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20  racted row (now 
10b00 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20  in the iCurrent 
10b10 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74  table) becomes t
10b20 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
10b30 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74  e.** recursive-t
10b40 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72  able for a recur
10b50 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20  sive-query run. 
10b60 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   The output of t
10b70 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  he recursive-que
10b80 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62  ry.** is added b
10b90 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ack into the Que
10ba0 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20  ue table.  Then 
10bb0 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65  another row is e
10bc0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
10bd0 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  eue.** and the i
10be0 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  teration continu
10bf0 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  es until the Que
10c00 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  ue table is empt
10c10 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
10c20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f  compound query o
10c30 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
10c40 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61   then no duplica
10c50 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72  te rows are ever
10c60 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
10c70 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  o the Queue tabl
10c80 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63  e.  The iDistinc
10c90 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20  t table keeps a 
10ca0 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73  copy of all rows
10cb0 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76  .** that have ev
10cc0 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  er been inserted
10cd0 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20   into Queue and 
10ce0 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65  causes duplicate
10cf0 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61  s to be.** disca
10d00 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70  rded.  If the op
10d10 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
10d20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63  ALL, then duplic
10d30 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ates are allowed
10d40 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
10d50 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44  query has an ORD
10d60 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72  ER BY, then entr
10d70 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65  ies in the Queue
10d80 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20   table are kept 
10d90 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f  in.** ORDER BY o
10da0 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72  rder and the fir
10db0 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72  st entry is extr
10dc0 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63  acted for each c
10dd0 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a  ycle.  Without.*
10de0 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  * an ORDER BY, t
10df0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
10e00 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a  s just a FIFO..*
10e10 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20  *.** If a LIMIT 
10e20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64  clause is provid
10e30 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ed, then the ite
10e40 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74  ration stops aft
10e50 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a  er LIMIT rows.**
10e60 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75   have been outpu
10e70 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c  t to pDest.  A L
10e80 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61  IMIT of zero mea
10e90 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20  ns to output no 
10ea0 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65  rows and a.** ne
10eb0 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61  gative LIMIT mea
10ec0 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c  ns to output all
10ed0 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65   rows.  If there
10ee0 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53   is also an OFFS
10ef0 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74  ET clause.** wit
10f00 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  h a positive val
10f10 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ue, then the fir
10f20 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74  st OFFSET output
10f30 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  s are discarded 
10f40 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62  rather.** than b
10f50 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65  eing sent to pDe
10f60 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63  st.  The LIMIT c
10f70 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  ount does not be
10f80 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20  gin until after 
10f90 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68  OFFSET.** rows h
10fa0 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
10fb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10fc0 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
10fd0 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50  ursiveQuery(.  P
10fe0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10ff0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11000 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
11010 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
11020 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73     /* The recurs
11030 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65  ive SELECT to be
11040 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
11050 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
11060 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
11070 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
11080 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  ts */.){.  SrcLi
11090 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
110a0 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
110b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
110c0 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65  he recursive que
110d0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ry */.  int nCol
110e0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
110f0 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  xpr;  /* Number 
11100 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
11110 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  e recursive tabl
11120 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
11130 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
11140 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
11150 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
11160 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
11170 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
11180 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f  Setup = p->pPrio
11190 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75  r;   /* The setu
111a0 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  p query */.  int
111b0 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
111c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
111d0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  p of the loop */
111e0 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c  .  int addrCont,
111f0 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20   addrBreak;     
11200 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64   /* CONTINUE and
11210 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73   BREAK addresses
11220 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65   */.  int iCurre
11230 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
11240 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65      /* The Curre
11250 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
11260 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20  t regCurrent;   
11270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11280 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
11290 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
112a0 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20  .  int iQueue;  
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61   /* The Queue ta
112d0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69  ble */.  int iDi
112e0 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20  stinct = 0;     
112f0 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73         /* To ens
11300 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c  ure unique resul
11310 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20  ts if UNION */. 
11320 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54   int eDest = SRT
11330 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  _Fifo;         /
11340 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74  * How to write t
11350 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c  o Queue */.  Sel
11360 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75  ectDest destQueu
11370 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
11380 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74  lectDest targett
11390 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61  ing the Queue ta
113a0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
113d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
113e0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
113f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11400 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78  ult code */.  Ex
11410 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
11420 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
11430 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11440 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  se */.  Expr *pL
11450 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
11460 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c        /* Saved L
11470 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
11480 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
11490 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20  t, regOffset;   
114a0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
114b0 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e  used by LIMIT an
114c0 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f  d OFFSET */..  /
114d0 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69  * Obtain authori
114e0 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72  zation to do a r
114f0 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
11500 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
11510 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
11520 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
11530 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  E, 0, 0, 0) ) re
11540 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63  turn;..  /* Proc
11550 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ess the LIMIT an
11560 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
11570 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20  , if they exist 
11580 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d  */.  addrBreak =
11590 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
115a0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
115b0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
115c0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64  s(pParse, p, add
115d0 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69  rBreak);.  pLimi
115e0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
115f0 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
11600 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69  ffset;.  regLimi
11610 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
11620 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
11630 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
11640 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  imit = p->pOffse
11650 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d  t = 0;.  p->iLim
11660 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20  it = p->iOffset 
11670 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  = 0;.  pOrderBy 
11680 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
11690 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
116a0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
116b0 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   the Current tab
116c0 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  le */.  for(i=0;
116d0 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e   ALWAYS(i<pSrc->
116e0 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  nSrc); i++){.   
116f0 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e   if( pSrc->a[i].
11700 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29  fg.isRecursive )
11710 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e 74  {.      iCurrent
11720 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43   = pSrc->a[i].iC
11730 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65  ursor;.      bre
11740 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11750 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72   /* Allocate cur
11760 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72  sors numbers for
11770 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74 69   Queue and Disti
11780 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nct.  The cursor
11790 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a   number for.  **
117a0 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74 61   the Distinct ta
117b0 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61 63  ble must be exac
117c0 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20  tly one greater 
117d0 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72  than Queue in or
117e0 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  der.  ** for the
117f0 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e   SRT_DistFifo an
11800 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  d SRT_DistQueue 
11810 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20  destinations to 
11820 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75  work. */.  iQueu
11830 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
11840 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ++;.  if( p->op=
11850 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
11860 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42   eDest = pOrderB
11870 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75  y ? SRT_DistQueu
11880 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f  e : SRT_DistFifo
11890 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74 20  ;.    iDistinct 
118a0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
118b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  ;.  }else{.    e
118c0 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
118d0 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52  ? SRT_Queue : SR
118e0 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71  T_Fifo;.  }.  sq
118f0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
11900 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c 20  nit(&destQueue, 
11910 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a  eDest, iQueue);.
11920 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
11930 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65  ursors for Curre
11940 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44  nt, Queue, and D
11950 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65  istinct. */.  re
11960 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61  gCurrent = ++pPa
11970 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
11980 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11990 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
119a0 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75   iCurrent, regCu
119b0 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rrent, nCol);.  
119c0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
119d0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
119e0 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c  yInfo = multiSel
119f0 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
11a00 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
11a10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11a20 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
11a30 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
11a40 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
11a50 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
11a80 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
11a90 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64    destQueue.pOrd
11aa0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
11ab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
11ac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11ad0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
11ae0 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f  ral, iQueue, nCo
11af0 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f  l);.  }.  VdbeCo
11b00 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65  mment((v, "Queue
11b10 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28   table"));.  if(
11b20 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20   iDistinct ){.  
11b30 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
11b40 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  m[0] = sqlite3Vd
11b50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
11b60 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44  penEphemeral, iD
11b70 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20  istinct, 0);.   
11b80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
11b90 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
11ba0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61  ;.  }..  /* Deta
11bb0 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
11bc0 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
11bd0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
11be0 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
11bf0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72   = 0;..  /* Stor
11c00 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
11c10 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72 79   the setup-query
11c20 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20   in Queue. */.  
11c30 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20  pSetup->pNext = 
11c40 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
11c50 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
11c60 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65  pSetup, &destQue
11c70 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70  ue);.  pSetup->p
11c80 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20  Next = p;.  if( 
11c90 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  rc ) goto end_of
11ca0 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
11cb0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
11cc0 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
11cd0 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75   Queue and outpu
11ce0 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20  t that row */.  
11cf0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
11d00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11d10 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65  P_Rewind, iQueue
11d20 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64  , addrBreak); Vd
11d30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
11d40 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
11d50 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75  e next row in Qu
11d60 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72  eue over to Curr
11d70 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
11d80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11d90 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65  _NullRow, iCurre
11da0 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74  nt); /* To reset
11db0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f   column cache */
11dc0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
11dd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
11de0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
11df0 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70  olumn, iQueue, p
11e00 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
11e10 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
11e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
11e30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11e40 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75   OP_RowData, iQu
11e50 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29  eue, regCurrent)
11e60 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
11e70 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11e80 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b  Delete, iQueue);
11e90 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
11ea0 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
11eb0 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64  Current */.  add
11ec0 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  rCont = sqlite3V
11ed0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11ee0 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
11ef0 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72   regOffset, addr
11f00 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49  Cont);.  selectI
11f10 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
11f20 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69   p, p->pEList, i
11f30 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30  Current,.      0
11f40 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72  , 0, pDest, addr
11f50 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29  Cont, addrBreak)
11f60 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74  ;.  if( regLimit
11f70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11f80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11f90 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65  DecrJumpZero, re
11fa0 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61  gLimit, addrBrea
11fb0 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
11fc0 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73  rage(v);.  }.  s
11fd0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
11fe0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
11ff0 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75  nt);..  /* Execu
12000 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76 65  te the recursive
12010 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74   SELECT taking t
12020 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
12030 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a   Current as.  **
12040 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
12050 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  he recursive-tab
12060 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65  le. Store the re
12070 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65  sults in the Que
12080 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ue..  */.  if( p
12090 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
120a0 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20  Aggregate ){.   
120b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
120c0 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72 73  (pParse, "recurs
120d0 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71 75  ive aggregate qu
120e0 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f 72  eries not suppor
120f0 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ted");.  }else{.
12100 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
12110 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
12120 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
12130 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20  &destQueue);.   
12140 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
12150 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  or==0 );.    p->
12160 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b  pPrior = pSetup;
12170 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  .  }..  /* Keep 
12180 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70  running the loop
12190 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
121a0 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73   is empty */.  s
121b0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
121c0 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
121d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
121e0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
121f0 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63  ak);..end_of_rec
12200 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20  ursive_query:.  
12210 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
12220 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
12230 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
12240 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
12250 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70  pOrderBy;.  p->p
12260 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
12270 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
12280 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  Offset;.  return
12290 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
122a0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
122b0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
122c0 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69  erences */.stati
122d0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
122e0 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
122f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12300 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
12310 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
12320 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12330 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
12340 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
12350 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
12360 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
12370 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
12380 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
12390 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  ults */.);../*.*
123a0 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65  * Handle the spe
123b0 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63  cial case of a c
123c0 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74  ompound-select t
123d0 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  hat originates f
123e0 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20  rom a.** VALUES 
123f0 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64  clause.  By hand
12400 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  ling this as a s
12410 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20  pecial case, we 
12420 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65  avoid deep.** re
12430 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75  cursion, and thu
12440 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s do not need to
12450 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c   enforce the SQL
12460 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
12470 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20  ND_SELECT.** on 
12480 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  a VALUES clause.
12490 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74  .**.** Because t
124a0 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
124b0 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
124c0 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
124d0 3a 0a 2a 2a 20 20 20 28 31 29 20 49 74 20 68 61  :.**   (1) It ha
124e0 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46  s no LIMIT or OF
124f0 46 53 45 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c  FSET.**   (2) Al
12500 6c 20 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f  l terms are UNIO
12510 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54  N ALL.**   (3) T
12520 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
12530 20 42 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74   BY clause.*/.st
12540 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
12550 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61  lectValues(.  Pa
12560 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
12570 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
12580 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
12590 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
125a0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
125b0 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
125c0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
125d0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
125e0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
125f0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
12600 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
12610 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20  elect *pPrior;. 
12620 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20   int nRow = 1;. 
12630 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61   int rc = 0;.  a
12640 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
12650 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
12660 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ue );.  do{.    
12670 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
12680 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
12690 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
126a0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
126b0 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  (p->op==TK_SELEC
126c0 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  T && p->pPrior==
126d0 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
126e0 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29  ( p->pLimit==0 )
126f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
12700 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  >pOffset==0 );. 
12710 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
12720 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c  ext==0 || p->pEL
12730 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70  ist->nExpr==p->p
12740 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Next->pEList->nE
12750 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70  xpr );.    if( p
12760 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72  ->pPrior==0 ) br
12770 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
12780 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78   p->pPrior->pNex
12790 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20  t==p );.    p = 
127a0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e  p->pPrior;.    n
127b0 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  Row++;.  }while(
127c0 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  1);.  while( p )
127d0 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  {.    pPrior = p
127e0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
127f0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
12800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
12810 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
12820 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50  Dest);.    p->pP
12830 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
12840 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
12850 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  k;.    p->nSelec
12860 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  tRow = nRow;.   
12870 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
12880 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12890 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
128a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
128b0 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d  to process a com
128c0 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d  pound query form
128d0 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20   from.** two or 
128e0 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
128f0 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f  eries using UNIO
12900 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58  N, UNION ALL, EX
12910 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45  CEPT, or.** INTE
12920 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20  RSECT.**.** "p" 
12930 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
12940 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
12950 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
12960 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
12970 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
12980 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
12990 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
129a0 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
129b0 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
129c0 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
129d0 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
129e0 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
129f0 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
12a00 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
12a10 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
12a20 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
12a30 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
12a40 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
12a50 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
12a60 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
12a70 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
12a80 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
12a90 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
12aa0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
12ab0 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
12ac0 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
12ad0 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
12ae0 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
12af0 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
12b00 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
12b10 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
12b20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
12b30 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
12b40 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
12b50 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
12b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
12b70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12b80 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
12b90 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
12ba0 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
12bb0 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
12bc0 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
12bd0 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
12be0 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
12bf0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
12c00 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
12c10 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
12c20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
12c30 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
12c40 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
12c50 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
12c60 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
12c70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
12c80 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
12c90 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
12ca0 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
12cb0 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
12cc0 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
12cd0 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
12ce0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
12cf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12d00 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
12d10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12d20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
12d30 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
12d40 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
12d50 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
12d60 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
12d70 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
12d80 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
12d90 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
12da0 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
12db0 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
12dc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12dd0 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
12de0 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
12df0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
12e00 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
12e10 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
12e20 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
12e30 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
12e40 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
12e50 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
12e60 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
12e70 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
12e80 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
12e90 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20   /* Alternative 
12ea0 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  data destination
12eb0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44   */.  Select *pD
12ec0 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43  elete = 0;  /* C
12ed0 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73  hain of simple s
12ee0 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65  elects to delete
12ef0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12f00 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
12f10 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12f20 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  on */.#ifndef SQ
12f30 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
12f40 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20  N.  int iSub1 = 
12f50 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
12f60 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
12f70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
12f80 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20  iSub2 = 0;      
12f90 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
12fa0 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
12fb0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  */.#endif..  /* 
12fc0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
12fd0 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
12fe0 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
12ff0 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
13000 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
13010 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
13020 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
13030 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
13040 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
13050 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  IMIT..  */.  ass
13060 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72  ert( p && p->pPr
13070 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69  ior );  /* Calli
13080 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72  ng function guar
13090 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68  antees this much
130a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
130b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
130c0 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c  Recursive)==0 ||
130d0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
130e0 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  | p->op==TK_UNIO
130f0 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  N );.  db = pPar
13100 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72  se->db;.  pPrior
13110 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
13120 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20  dest = *pDest;. 
13130 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
13140 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
13150 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13160 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c  rse,"ORDER BY cl
13170 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
13180 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
13190 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
131a0 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
131b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
131c0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
131d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
131e0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
131f0 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
13200 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13210 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73  ,"LIMIT clause s
13220 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
13230 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
13240 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
13250 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
13260 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
13270 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13280 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73  nd;.  }..  v = s
13290 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
132a0 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
132b0 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65   v!=0 );  /* The
132c0 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72   VDBE already cr
132d0 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  eated by calling
132e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
132f0 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
13300 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
13310 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
13320 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
13330 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
13340 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
13350 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13360 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
13370 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13380 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
13390 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20  , dest.iSDParm, 
133a0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
133b0 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
133c0 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
133d0 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
133e0 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20   handling for a 
133f0 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
13400 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
13410 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  as a VALUES clau
13420 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
13430 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
13440 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20  MultiValue ){.  
13450 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
13460 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c  ctValues(pParse,
13470 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
13480 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
13490 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
134a0 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
134b0 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
134c0 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
134d0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
134e0 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
134f0 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
13500 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
13510 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
13520 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
13530 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
13540 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50  EList->nExpr==pP
13550 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
13560 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  xpr );..#ifndef 
13570 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
13580 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
13590 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
135a0 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
135b0 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
135c0 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ry(pParse, p, &d
135d0 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  est);.  }else.#e
135e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f  ndif..  /* Compo
135f0 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74  und SELECTs that
13600 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
13610 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e  Y clause are han
13620 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  dled separately.
13630 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
13640 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
13650 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
13660 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  tOrderBy(pParse,
13670 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65   p, pDest);.  }e
13680 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  lse..  /* Genera
13690 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
136a0 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
136b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
136c0 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
136d0 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
136e0 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
136f0 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
13700 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
13710 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
13720 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
13730 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
13740 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  ->iLimit = p->iL
13750 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
13760 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d  or->iOffset = p-
13770 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
13780 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
13790 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
137a0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
137b0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
137c0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
137d0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
137e0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
137f0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
13800 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
13810 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
13820 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  &dest);.      p-
13830 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
13840 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
13850 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  0;.      if( rc 
13860 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
13870 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13890 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
138a0 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
138b0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
138c0 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
138d0 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
138e0 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  set;.      if( p
138f0 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
13900 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
13910 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13920 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69  OP_IfNot, p->iLi
13930 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
13940 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56  ge(v);.        V
13950 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
13960 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49  Jump ahead if LI
13970 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
13980 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
13990 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
139a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
139b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73  ddOp3(v, OP_Offs
139c0 65 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  etLimit,.       
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20       p->iLimit, 
139f0 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d  p->iOffset+1, p-
13a00 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  >iOffset);.     
13a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13a20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
13a30 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
13a40 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
13a50 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
13a60 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13a70 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
13a80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13a90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
13aa0 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
13ab0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
13ac0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
13ad0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  rior;.      p->n
13ae0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
13af0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
13b00 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
13b10 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
13b20 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
13b30 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20  r->pLimit.      
13b40 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
13b50 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d  sInteger(pPrior-
13b60 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74  >pLimit, &nLimit
13b70 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d  ).       && nLim
13b80 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  it>0 && p->nSele
13b90 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c  ctRow > sqlite3L
13ba0 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69  ogEst((u64)nLimi
13bb0 74 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  t) .      ){.   
13bc0 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
13bd0 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
13be0 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b  st((u64)nLimit);
13bf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13c00 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
13c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
13c20 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
13c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13c40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13c50 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
13c60 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
13c70 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
13c80 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
13c90 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
13ca0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
13cb0 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
13cc0 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f  lt */.      u8 o
13cd0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  p = 0;       /* 
13ce0 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
13cf0 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
13d00 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
13d10 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
13d20 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
13d30 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
13d40 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
13d50 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
13d60 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
13d70 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
13d80 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
13d90 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
13da0 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
13db0 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
13dc0 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
13dd0 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ;..      testcas
13de0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
13df0 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  EPT );.      tes
13e00 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
13e10 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
13e20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e  priorOp = SRT_Un
13e30 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ion;.      if( d
13e40 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72  est.eDest==prior
13e50 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Op ){.        /*
13e60 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
13e70 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13e80 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
13e90 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
13ea0 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
13eb0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13ec0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
13ed0 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  mit==0 );      /
13ee0 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
13ef0 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
13f00 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
13f10 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
13f20 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f  ==0 );     /* No
13f30 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
13f40 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
13f50 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
13f60 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
13f70 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
13f80 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
13f90 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
13fa0 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
13fb0 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
13fc0 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
13fd0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
13fe0 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
13ff0 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
14000 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
14010 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
14020 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
14030 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
14040 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14050 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
14060 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
14070 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
14080 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
14090 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
140a0 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
140b0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
140c0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
140d0 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
140e0 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
140f0 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
14100 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14110 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
14120 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
14130 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
14140 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
14150 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
14160 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14170 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
14180 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14190 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
141a0 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f  &uniondest, prio
141b0 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a  rOp, unionTab);.
141c0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
141d0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
141e0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
141f0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
14200 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
14210 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
14220 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
14230 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
14240 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
14250 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
14260 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
14270 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
14280 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
14290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
142a0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  f( p->op==TK_EXC
142b0 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EPT ){.        o
142c0 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a  p = SRT_Except;.
142d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
142e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
142f0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
14300 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
14310 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a  _Union;.      }.
14320 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
14330 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
14340 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
14350 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
14360 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
14370 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
14380 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14390 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f   = 0;.      unio
143a0 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70  ndest.eDest = op
143b0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
143c0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
143d0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
143e0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
143f0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
14400 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e  t(pParse, p, &un
14410 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
14420 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14430 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
14440 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
14450 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
14460 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
14470 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
14480 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
14490 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
144a0 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
144b0 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
144c0 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
144d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
144e0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
144f0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
14500 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
14510 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
14520 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
14530 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
14540 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
14550 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
14560 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ION ){.        p
14570 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
14580 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
14590 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
145a0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
145b0 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
145c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
145d0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
145e0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
145f0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
14600 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14610 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
14620 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
14630 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
14640 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  = 0;..      /* C
14650 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
14660 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
14670 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
14680 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
14690 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
146a0 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
146b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
146c0 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
146d0 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
146e0 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
146f0 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69  iorOp );.      i
14700 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
14710 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
14720 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
14730 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
14740 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14750 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
14760 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
14770 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
14780 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
14790 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
147a0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
147b0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
147c0 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
147d0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
147e0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
147f0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
14800 46 69 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69  First->pSrc, pFi
14810 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
14820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14830 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
14840 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14850 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
14860 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14870 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
14880 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
14890 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
148a0 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
148b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
148c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
148d0 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
148e0 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
148f0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
14900 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
14910 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14920 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  (v);.        sel
14930 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
14940 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
14950 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20  t, unionTab,.   
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14970 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
14980 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
14990 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
149a0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
149b0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
149c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
149d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
149e0 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
149f0 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  art); VdbeCovera
14a00 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
14a10 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
14a20 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
14a30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14a40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14a50 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
14a60 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
14a70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14a80 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
14a90 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
14aa0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b  K_INTERSECT ); {
14ab0 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
14ac0 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
14ad0 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
14ae0 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
14af0 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
14b00 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
14b10 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
14b20 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
14b30 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
14b40 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
14b50 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
14b60 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
14b70 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
14b80 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
14b90 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
14ba0 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
14bb0 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
14bc0 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
14bd0 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
14be0 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
14bf0 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
14c00 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
14c10 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14c20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
14c30 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
14c40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
14c50 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
14c60 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
14c70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14c80 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
14c90 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
14ca0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
14cb0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
14cc0 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
14cd0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
14ce0 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64  addr;.      find
14cf0 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
14d00 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
14d10 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
14d20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
14d30 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
14d40 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
14d50 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
14d60 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
14d70 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
14d80 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
14d90 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
14da0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
14db0 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
14dc0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
14dd0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
14de0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14df0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
14e00 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
14e10 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
14e20 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
14e30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
14e40 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
14e50 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
14e60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14e70 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
14e80 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
14e90 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14ea0 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
14eb0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
14ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14ed0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
14ee0 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
14ef0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14f00 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
14f10 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
14f20 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
14f30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
14f40 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
14f50 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
14f60 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
14f70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14f80 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
14f90 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
14fa0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
14fb0 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
14fc0 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
14fd0 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b2;.      explai
14fe0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
14ff0 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
15000 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
15010 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
15020 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
15030 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
15040 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15050 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
15060 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
15070 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
15080 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
15090 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
150a0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
150b0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
150c0 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
150d0 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
150e0 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
150f0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
15100 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
15110 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
15120 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
15130 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
15140 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  set;..      /* G
15150 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
15160 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
15170 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
15180 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
15190 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
151a0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
151b0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
151c0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
151d0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
151e0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
151f0 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
15200 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
15210 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
15220 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
15230 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
15240 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
15250 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 46 69  ames(pParse, pFi
15260 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73  rst->pSrc, pFirs
15270 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
15280 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
15290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
152a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
152b0 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
152c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
152d0 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
152e0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
152f0 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
15300 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15320 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
15330 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
15340 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72  rage(v);.      r
15350 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15360 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15370 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
15380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15390 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
153a0 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
153b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
153c0 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
153d0 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
153e0 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76   r1, 0); VdbeCov
153f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
15400 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15410 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
15420 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
15430 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
15440 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
15450 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ab1,.           
15460 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
15470 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
15480 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
15490 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
154a0 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
154b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
154c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
154d0 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
154e0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
154f0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15500 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15510 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
15520 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15530 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
15540 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
15550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15560 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
15570 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
15580 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15590 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f    }..  explainCo
155a0 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
155b0 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
155c0 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41  ub2, p->op!=TK_A
155d0 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  LL);..  /* Compu
155e0 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
155f0 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
15600 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
15610 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
15620 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
15630 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
15640 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
15650 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
15660 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
15670 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
15680 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
15690 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
156a0 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
156b0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
156c0 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
156d0 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
156e0 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
156f0 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
15700 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
15710 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
15720 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
15730 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
15740 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
15750 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
15760 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
15770 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
15780 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
15790 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
157a0 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
157d0 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
157e0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
157f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
15800 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
15810 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
15820 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
15830 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
15840 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
15850 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
15860 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
15870 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
15880 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
15890 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
158a0 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
158b0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
158c0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
158f0 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
15900 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
15910 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
15920 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   );.    nCol = p
15930 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
15940 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
15950 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
15960 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29  loc(db, nCol, 1)
15970 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49  ;.    if( !pKeyI
15980 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nfo ){.      rc 
15990 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
159a0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
159b0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
159c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
159d0 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
159e0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
159f0 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
15a00 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
15a10 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
15a20 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
15a30 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
15a40 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
15a50 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
15a60 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
15a70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
15a80 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
15a90 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
15aa0 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
15ab0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
15ac0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
15ad0 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
15ae0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
15af0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
15b00 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
15b10 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
15b20 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
15b30 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
15b40 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
15b50 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
15b60 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
15b70 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
15b80 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
15b90 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
15ba0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
15bb0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
15bc0 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
15bd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
15be0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15bf0 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
15c00 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
15c10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15c20 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
15c30 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
15c40 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
15c50 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
15c80 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
15c90 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
15ca0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
15cb0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79  }.    sqlite3Key
15cc0 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
15cd0 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
15ce0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
15cf0 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
15d00 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
15d10 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
15d20 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
15d30 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
15d40 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
15d50 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
15d60 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
15d70 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
15d80 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d  /../*.** Error m
15d90 65 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20  essage for when 
15da0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  two or more term
15db0 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  s of a compound 
15dc0 73 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66  select have diff
15dd0 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65  erent.** size re
15de0 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f  sult sets..*/.vo
15df0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
15e00 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72  WrongNumTermsErr
15e10 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
15e20 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
15e30 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
15e40 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
15e50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15e60 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20  sg(pParse, "all 
15e70 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65  VALUES must have
15e80 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
15e90 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d   of terms");.  }
15ea0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
15eb0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15ec0 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
15ed0 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
15ee0 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
15ef0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
15f00 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
15f10 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
15f20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
15f30 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  op));.  }.}../*.
15f40 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
15f50 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
15f60 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
15f70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
15f80 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
15f90 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
15fa0 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
15fb0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
15fc0 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68   pIn->iSdst.  Th
15fd0 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e  ere are.** pIn->
15fe0 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f  nSdst columns to
15ff0 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
16000 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
16010 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
16020 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
16030 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
16040 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
16050 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
16060 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
16070 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
16080 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
16090 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
160a0 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
160b0 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
160c0 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
160d0 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
160e0 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
160f0 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
16100 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
16110 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
16120 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
16130 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
16140 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
16150 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
16160 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
16170 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
16180 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
16190 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
161a0 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
161b0 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
161c0 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
161d0 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
161e0 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
161f0 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
16200 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
16210 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
16220 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
16230 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
16240 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
16250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
16260 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
16270 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
16280 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
16290 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
162a0 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
162b0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
162c0 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
162d0 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
162e0 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
162f0 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
16300 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
16310 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
16320 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
16330 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
16340 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
16350 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
16360 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
16370 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
16380 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
16390 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
163a0 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
163b0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ry */.  int iBre
163c0 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
163d0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
163e0 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
163f0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
16400 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
16410 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
16420 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
16430 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
16440 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16450 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
16460 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16470 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
16480 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
16490 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
164a0 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
164b0 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
164c0 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
164d0 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
164e0 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  2;.    addr1 = s
164f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16500 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
16510 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65  gPrev); VdbeCove
16520 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64  rage(v);.    add
16530 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
16540 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
16550 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  pare, pIn->iSdst
16560 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
16570 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20  ->nSdst,.       
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
165a0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
165b0 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
165c0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
165d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
165e0 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b   OP_Jump, addr2+
165f0 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64  2, iContinue, ad
16600 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65  dr2+2); VdbeCove
16610 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
16620 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16630 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
16640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16650 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49  3(v, OP_Copy, pI
16660 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
16670 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d  v+1, pIn->nSdst-
16680 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
16690 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
166a0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
166b0 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
166c0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
166d0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
166e0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
166f0 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46  ess the first OF
16700 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
16710 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
16720 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
16730 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
16740 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
16750 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  inue);..  assert
16760 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  ( pDest->eDest!=
16770 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20  SRT_Exists );.  
16780 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
16790 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
167a0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  );.  switch( pDe
167b0 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
167c0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
167d0 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
167e0 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
167f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16800 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
16810 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
16820 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16830 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16840 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
16850 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16860 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
16870 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16880 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
16890 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
168a0 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
168b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
168c0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
168d0 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
168e0 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
168f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16900 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
16910 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
16920 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
16930 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16940 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
16950 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
16960 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16970 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
16980 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
16990 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
169a0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
169b0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
169c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
169d0 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
169e0 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
169f0 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
16a00 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
16a10 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
16a20 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
16a30 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
16a40 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
16a50 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
16a60 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
16a70 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
16a80 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
16a90 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
16aa0 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
16ab0 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
16ac0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16ad0 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
16ae0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
16af0 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
16b00 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20  dst = .         
16b10 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
16b20 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
16b30 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
16b40 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
16b50 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
16b60 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16b70 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
16b80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16b90 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
16ba0 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31  In->iSdst, 1, r1
16bb0 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73  , &pDest->affSds
16bc0 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t,1);.      sqli
16bd0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
16be0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
16bf0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  e, pIn->iSdst, 1
16c00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16c10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16c20 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73  _IdxInsert, pDes
16c30 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b  t->iSDParm, r1);
16c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16c50 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16c60 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
16c70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
16c80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16c90 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
16ca0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
16cb0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
16cc0 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
16cd0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
16ce0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
16cf0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
16d00 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
16d10 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
16d20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
16d30 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
16d40 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16d50 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
16d60 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20  rse->nErr>0 );  
16d70 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
16d80 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst!=1 );.     
16d90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16da0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
16db0 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
16dc0 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
16dd0 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
16de0 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
16df0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
16e00 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
16e10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
16e20 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
16e30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16e40 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
16e50 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
16e60 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
16e70 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16e80 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
16e90 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
16ea0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
16eb0 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
16ec0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16ed0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
16ee0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
16ef0 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
16f00 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
16f10 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
16f20 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
16f30 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16f40 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
16f50 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
16f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16f70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
16f80 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
16f90 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
16fa0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16fb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16fc0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16fd0 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
16fe0 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
16ff0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
17000 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
17010 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
17020 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
17030 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
17040 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
17050 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
17060 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
17070 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
17080 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
17090 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
170a0 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
170b0 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
170c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
170d0 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
170e0 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
170f0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
17100 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
17110 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
17120 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
17130 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
17140 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
17150 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
17160 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
17170 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
17180 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
17190 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
171a0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
171b0 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
171c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
171d0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
171e0 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
171f0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17200 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17210 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
17220 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
17230 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17240 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
17250 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17260 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
17270 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
17280 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
17290 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
172a0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
172b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
172c0 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
172d0 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  umpZero, p->iLim
172e0 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
172f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17300 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
17310 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
17320 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
17330 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17340 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
17350 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
17360 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
17370 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
17380 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
17390 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
173a0 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
173b0 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
173c0 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
173d0 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
173e0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
173f0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
17400 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
17410 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
17420 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
17430 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
17440 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
17450 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
17460 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
17470 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
17480 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
17490 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
174a0 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
174b0 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
174c0 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
174d0 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
174e0 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
174f0 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
17500 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
17510 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
17520 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
17530 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
17540 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
17550 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
17560 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
17570 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
17580 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
17590 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
175a0 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
175b0 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
175c0 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
175d0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
175e0 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
175f0 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
17600 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
17610 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
17620 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
17630 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
17640 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
17650 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
17660 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
17670 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
17680 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
17690 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
176a0 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
176b0 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
176c0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
176d0 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
176e0 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
176f0 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
17700 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
17710 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
17720 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
17730 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
17740 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
17750 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
17760 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
17770 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
17780 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
17790 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
177a0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
177b0 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
177c0 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
177d0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
177e0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
177f0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
17800 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
17810 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
17820 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
17830 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
17840 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
17850 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17860 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
17870 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
17880 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
17890 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
178a0 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
178b0 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
178c0 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
178d0 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
178e0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
178f0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
17900 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
17910 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
17920 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
17930 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
17940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
17950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
17960 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
17970 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17980 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
17990 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
179a0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
179b0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
179c0 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
179d0 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
179e0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
179f0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
17a00 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
17a10 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
17a20 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
17a30 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17a40 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
17a50 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
17a60 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
17a70 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
17a80 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
17a90 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
17aa0 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
17ab0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
17ac0 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
17ad0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
17ae0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
17af0 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
17b00 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
17b10 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
17b20 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
17b30 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
17b40 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
17b50 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
17b60 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
17b70 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
17b80 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
17b90 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
17ba0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
17bb0 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
17bc0 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
17bd0 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
17be0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
17bf0 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
17c00 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
17c10 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
17c20 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
17c30 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
17c40 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
17c50 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
17c60 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
17c70 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
17c80 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
17c90 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
17ca0 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
17cb0 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
17cc0 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
17cd0 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
17ce0 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
17cf0 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
17d00 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
17d10 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
17d20 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
17d30 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
17d40 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
17d50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
17d60 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
17d70 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
17d80 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
17d90 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
17da0 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
17db0 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
17dc0 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
17dd0 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
17de0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
17df0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
17e00 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
17e10 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
17e20 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
17e30 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
17e40 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
17e50 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
17e60 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17e70 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
17e80 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17e90 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
17ea0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
17eb0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
17ec0 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
17ed0 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
17ee0 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
17ef0 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
17f00 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
17f10 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
17f20 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
17f30 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
17f40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
17f50 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
17f60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
17f70 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
17f80 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
17f90 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
17fa0 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
17fb0 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
17fc0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
17fd0 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
17fe0 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
17ff0 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
18000 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
18010 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
18020 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
18030 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
18040 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
18050 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
18060 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
18070 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
18080 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
18090 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
180a0 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
180b0 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
180c0 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
180d0 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
180e0 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
180f0 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
18100 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18110 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
18120 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
18130 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
18140 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
18150 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
18160 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
18170 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
18180 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18190 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
181a0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
181b0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
181c0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
181d0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
181e0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
181f0 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
18200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18210 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
18220 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
18230 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
18240 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
18250 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
18260 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18280 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
18290 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
182a0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
182b0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
182c0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
182d0 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
182e0 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
182f0 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
18300 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
18310 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
18320 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18330 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18340 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
18350 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
18360 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
18370 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
18380 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
18390 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
183a0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
183b0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
183c0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
183d0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
183e0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
183f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18400 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
18410 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18420 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
18430 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18440 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
18450 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
18460 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
18470 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
18480 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
18490 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
184a0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
184b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
184c0 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
184d0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
184e0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
184f0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
18500 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
18510 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
18520 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
18530 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18540 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
18550 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18560 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
18570 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
18580 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f  .  int addrEofA_
18590 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65  noB;     /* Alte
185a0 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69  rnate addrEofA i
185b0 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  f B is uninitial
185c0 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ized */.  int ad
185d0 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
185e0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
185f0 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
18600 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
18610 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
18620 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18630 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
18640 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18650 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
18660 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18670 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
18680 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18690 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
186a0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
186b0 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
186c0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
186d0 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
186e0 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
186f0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
18700 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
18710 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
18720 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
18730 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
18740 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
18750 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
18760 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
18770 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
18780 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
18790 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
187a0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
187b0 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
187c0 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
187d0 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
187e0 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
187f0 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
18800 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
18810 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
18820 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
18830 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
18840 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
18850 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
18860 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
18870 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
18880 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
18890 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
188a0 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
188b0 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
188c0 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
188d0 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
188e0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
188f0 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
18900 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
18910 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
18920 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
18930 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
18940 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
18950 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
18960 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
18970 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
18980 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
18990 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
189a0 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
189b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
189c0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
189d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
189e0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
189f0 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
18a00 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18a10 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
18a20 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
18a30 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18a40 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18a50 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
18a60 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
18a70 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
18a80 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
18a90 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
18aa0 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
18ab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
18ac0 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
18ae0 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
18af0 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
18b00 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
18b10 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
18b20 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
18b30 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
18b40 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
18b50 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
18b60 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
18b70 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
18b80 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
18b90 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
18ba0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
18bb0 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
18bc0 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
18bd0 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
18be0 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
18bf0 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
18c00 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
18c10 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
18c20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18c30 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
18c40 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
18c50 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18c60 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
18c70 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
18c80 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
18c90 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
18ca0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
18cb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
18cc0 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
18cd0 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
18ce0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
18cf0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
18d00 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
18d10 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
18d20 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
18d30 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
18d40 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
18d50 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
18d60 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
18d70 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
18d80 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
18d90 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
18da0 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
18db0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
18dc0 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
18dd0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
18de0 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
18df0 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
18e00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
18e10 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
18e20 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
18e30 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18e40 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18e50 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
18e60 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
18e70 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
18e80 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
18e90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18ea0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
18eb0 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
18ec0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
18ed0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
18ee0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
18ef0 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
18f00 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
18f10 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
18f20 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
18f30 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
18f40 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
18f50 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18f60 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
18f70 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
18f80 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
18f90 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
18fa0 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20  >u.iValue = i;. 
18fb0 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20         pOrderBy 
18fc0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
18fd0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
18fe0 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
18ff0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
19000 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
19010 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
19020 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
19030 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
19040 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
19050 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
19060 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
19070 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
19080 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
19090 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
190a0 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
190b0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
190c0 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
190d0 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
190e0 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
190f0 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
19100 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
19110 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
19120 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19130 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
19140 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
19150 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
19160 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
19170 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
19180 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
19190 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
191a0 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
191b0 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
191c0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
191d0 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
191e0 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a  nOrderBy + 1));.
191f0 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
19200 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
19210 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
19220 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b  m;.    aPermute[
19230 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  0] = nOrderBy;. 
19240 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65     for(i=1, pIte
19250 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
19260 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  <=nOrderBy; i++,
19270 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19280 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
19290 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
192a0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
192b0 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
192c0 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
192d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
192e0 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
192f0 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
19300 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
19310 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
19320 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
19330 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
19340 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
19350 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
19360 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
19370 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
19380 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19390 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
193a0 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
193b0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
193c0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
193d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
193e0 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
193f0 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
19400 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
19410 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
19420 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
19430 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
19440 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
19450 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
19460 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
19470 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
19480 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
19490 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
194a0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
194b0 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
194c0 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
194d0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
194e0 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
194f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
19500 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
19510 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
19520 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
19530 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
19540 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
19550 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
19560 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
19570 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
19580 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
19590 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
195a0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
195b0 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
195c0 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
195d0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
195e0 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
195f0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
19600 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
19610 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
19620 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
19630 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
19640 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
19650 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
19660 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
19670 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
19680 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
19690 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
196a0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
196b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
196c0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
196d0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
196e0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
196f0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
19700 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
19710 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
19720 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
19730 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
19740 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
19750 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
19760 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
19770 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
19780 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
19790 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
197a0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
197b0 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
197c0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
197d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
197e0 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
197f0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
19800 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
19810 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
19820 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
19830 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
19840 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
19850 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
19860 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
19870 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
19880 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
19890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
198a0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
198b0 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
198c0 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
198d0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198f0 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
19900 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19910 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
19920 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
19930 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
19940 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
19950 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
19960 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
19970 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
19980 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
19990 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
199a0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
199b0 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
199c0 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
199d0 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
199e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
199f0 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
19a00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19a10 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
19a20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
19a30 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
19a40 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
19a50 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
19a60 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
19a70 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
19a80 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
19a90 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
19aa0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
19ab0 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
19ac0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
19ad0 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
19ae0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
19af0 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
19b00 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
19b10 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
19b20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
19b30 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  ..  */.  addrSel
19b40 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
19b50 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19b60 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20   + 1;.  addr1 = 
19b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b80 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
19b90 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c  utine, regAddrA,
19ba0 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29   0, addrSelectA)
19bb0 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
19bc0 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54  (v, "left SELECT
19bd0 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
19be0 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
19bf0 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  A;.  explainSetI
19c00 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
19c10 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
19c20 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
19c30 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
19c40 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
19c50 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
19c60 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41  oroutine(v, regA
19c70 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
19c80 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
19c90 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65  addr1);..  /* Ge
19ca0 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
19cb0 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
19cc0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
19cd0 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
19ce0 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
19cf0 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
19d00 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
19d10 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19d20 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64  ddr(v) + 1;.  ad
19d30 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
19d40 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
19d50 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
19d60 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65  AddrB, 0, addrSe
19d70 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f  lectB);.  VdbeCo
19d80 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74  mment((v, "right
19d90 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61   SELECT"));.  sa
19da0 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  vedLimit = p->iL
19db0 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66  imit;.  savedOff
19dc0 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
19dd0 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
19de0 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e  regLimitB;.  p->
19df0 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20  iOffset = 0;  . 
19e00 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
19e10 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
19e20 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
19e30 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
19e40 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
19e50 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  stB);.  p->iLimi
19e60 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a  t = savedLimit;.
19e70 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73    p->iOffset = s
19e80 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71  avedOffset;.  sq
19e90 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
19ea0 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
19eb0 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
19ec0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
19ed0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
19ee0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
19ef0 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
19f00 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
19f10 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
19f20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
19f30 0a 20 20 2a 2f 0a 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 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
19f70 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
19f80 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
19f90 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
19fa0 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
19fb0 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fd0 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
19fe0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
19ff0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1a000 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1a010 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1a020 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1a030 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
1a040 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1a050 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1a060 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1a070 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1a080 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
1a090 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
1a0a0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
1a0b0 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
1a0c0 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
1a0d0 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
1a0e0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
1a0f0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1a100 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
1a110 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
1a120 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
1a130 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
1a140 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
1a150 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b  ;.  }.  sqlite3K
1a160 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
1a170 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Dup);..  /* Gene
1a180 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1a190 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
1a1a0 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
1a1b0 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
1a1c0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
1a1d0 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
1a1e0 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
1a1f0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1a200 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
1a210 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1a220 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
1a230 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65   addrEofA = labe
1a240 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  lEnd;.  }else{  
1a250 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1a260 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
1a270 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1a280 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
1a290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a2a0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1a2b0 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
1a2c0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
1a2d0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1a2e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1a2f0 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62  d, regAddrB, lab
1a300 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  elEnd);.        
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
1a330 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a340 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1a350 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  o(v, addrEofA);.
1a360 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
1a370 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
1a380 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
1a390 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
1a3a0 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20  ectRow);.  }..  
1a3b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1a3c0 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1a3d0 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1a3e0 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
1a3f0 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1a400 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1a410 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
1a420 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1a430 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1a440 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
1a450 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20   = addrEofA;.   
1a460 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
1a470 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow > pPrior->nSe
1a480 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
1a490 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
1a4a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
1a4b0 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
1a4c0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a4d0 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
1a4e0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
1a4f0 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
1a500 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1a510 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
1a520 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
1a530 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a540 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1a550 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrA, labelEnd);
1a560 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a580 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1a590 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
1a5a0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1a5b0 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1a5c0 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
1a5d0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a5e0 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
1a5f0 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
1a600 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1a610 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1a620 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1a630 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
1a640 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a650 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1a660 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64  A, addrEofA); Vd
1a670 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a680 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1a690 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1a6a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1a6b0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1a6c0 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20  e case of A==B. 
1a6d0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1a6e0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72  _ALL ){.    addr
1a6f0 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1a700 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
1a710 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1a720 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
1a730 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64  addrAltB;.    ad
1a740 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73  drAltB++;.  }els
1a750 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e{.    VdbeNoopC
1a760 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71  omment((v, "A-eq
1a770 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1a780 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  ;.    addrAeqB =
1a790 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a7a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a7b0 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1a7c0 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1a7d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1a7e0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1a7f0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d   labelCmpr);.  }
1a800 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a810 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1a820 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20  he case of A>B. 
1a830 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1a840 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d  mment((v, "A-gt-
1a850 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1a860 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71  .  addrAgtB = sq
1a870 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1a880 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
1a890 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
1a8a0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
1a8b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a8c0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1a8d0 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
1a8e0 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  B);.  }.  sqlite
1a8f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a900 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1a910 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
1a920 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a930 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1a940 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1a950 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
1a960 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
1a970 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
1a980 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
1a990 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1a9a0 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
1a9b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a9c0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a9d0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f  drA, addrEofA_no
1a9e0 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1a9f0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1aa00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1aa10 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1aa20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1aa30 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1aa40 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
1aa50 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
1aa60 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1aa70 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1aa80 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1aa90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aaa0 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
1aab0 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
1aac0 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
1aad0 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
1aae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1aaf0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
1ab00 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
1ab10 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
1ab20 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1ab40 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
1ab50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
1ab60 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1ab70 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d  5(v, OPFLAG_PERM
1ab80 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTE);.  sqlite3V
1ab90 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1aba0 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
1abb0 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
1abc0 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  tB); VdbeCoverag
1abd0 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  e(v);..  /* Jump
1abe0 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
1abf0 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
1ac00 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
1ac10 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
1ac20 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1ac30 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
1ac40 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
1ac50 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
1ac60 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
1ac70 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1ac80 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
1ac90 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
1aca0 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
1acb0 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
1acc0 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
1acd0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
1ace0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
1acf0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
1ad00 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20 70   pFirst->pSrc, p
1ad10 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
1ad20 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
1ad30 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
1ad40 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
1ad50 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
1ad60 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
1ad70 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
1ad80 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
1ad90 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1ada0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1adb0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
1adc0 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
1add0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1ade0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1adf0 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  = p;..  /*** TBD
1ae00 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
1ae10 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
1ae20 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
1ae30 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
1ae40 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
1ae50 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  /.  explainCompo
1ae60 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
1ae70 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
1ae80 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  , 0);.  return p
1ae90 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a  Parse->nErr!=0;.
1aea0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
1aeb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1aec0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1aed0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1aee0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f  OMIT_VIEW)./* Fo
1aef0 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
1af00 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
1af10 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
1af20 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
1af30 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
1af40 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1af50 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
1af60 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
1af70 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
1af80 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  , int);../*.** S
1af90 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
1afa0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
1afb0 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
1afc0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
1afd0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
1afe0 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
1aff0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
1b000 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
1b010 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
1b020 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
1b030 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1b040 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
1b050 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
1b060 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b070 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1b080 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
1b090 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
1b0a0 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
1b0b0 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
1b0c0 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
1b0d0 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
1b0e0 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
1b0f0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
1b100 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
1b110 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
1b120 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
1b130 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
1b140 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
1b150 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
1b160 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
1b170 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
1b180 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
1b190 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1b1a0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
1b1b0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1b1c0 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
1b1d0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
1b1e0 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
1b1f0 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70  c Expr *substExp
1b200 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
1b210 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f  ,        /* Repo
1b220 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
1b230 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   to this connect
1b240 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1b250 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
1b260 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
1b270 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
1b280 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
1b290 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  e,         /* Ta
1b2a0 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
1b2b0 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
1b2c0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
1b2d0 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70  * Substitute exp
1b2e0 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  ressions */.){. 
1b2f0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1b300 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1b310 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1b320 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
1b330 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
1b340 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1b350 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
1b360 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1b370 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
1b380 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
1b390 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
1b3a0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
1b3b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
1b3c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1b3d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1b3e0 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
1b3f0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
1b400 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
1b410 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1b420 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70  (db, pEList->a[p
1b430 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
1b440 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
1b450 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1b460 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
1b470 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77      pExpr = pNew
1b480 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1b490 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  .    pExpr->pLef
1b4a0 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
1b4b0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1b4c0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b4d0 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  .    pExpr->pRig
1b4e0 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ht = substExpr(d
1b4f0 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
1b500 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b510 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
1b520 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1b530 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1b540 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1b550 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  lect(db, pExpr->
1b560 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  x.pSelect, iTabl
1b570 65 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a 20  e, pEList, 1);. 
1b580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b590 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b5a0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
1b5b0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b5c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1b5d0 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73  eturn pExpr;.}.s
1b5e0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1b5f0 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69  ExprList(.  sqli
1b600 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1b610 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1b620 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
1b630 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1b640 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st,     /* List 
1b650 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
1b660 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1b670 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e  stitutes */.  in
1b680 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1b690 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
1b6a0 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
1b6b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1b6c0 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
1b6d0 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
1b6e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1b6f0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1b700 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1b710 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1b720 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  i++){.    pList-
1b730 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75  >a[i].pExpr = su
1b740 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
1b750 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
1b760 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b770 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1b780 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
1b790 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1b7a0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
1b7b0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
1b7c0 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
1b7d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
1b7e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1b7f0 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
1b800 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
1b810 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1b820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1b830 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
1b840 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1b850 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20 53  *pEList,    /* S
1b860 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
1b870 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f   */.  int doPrio
1b880 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  r          /* Do
1b890 20 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e 20   substitutes on 
1b8a0 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a 2f  p->pPrior too */
1b8b0 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
1b8c0 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Src;.  struct Sr
1b8d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1b8e0 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
1b8f0 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
1b900 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45 78   do{.    substEx
1b910 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45  prList(db, p->pE
1b920 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
1b930 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
1b940 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
1b950 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65  pGroupBy, iTable
1b960 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
1b970 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b980 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54   p->pOrderBy, iT
1b990 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b9a0 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
1b9b0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
1b9c0 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
1b9d0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
1b9e0 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1b9f0 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
1ba00 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  re, iTable, pELi
1ba10 73 74 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  st);.    pSrc = 
1ba20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73  p->pSrc;.    ass
1ba30 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
1ba40 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
1ba50 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63  nSrc, pItem=pSrc
1ba60 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
1ba70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
1ba80 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
1ba90 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Item->pSelect, i
1baa0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31  Table, pEList, 1
1bab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
1bac0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1bad0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73   ){.        subs
1bae0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 49  tExprList(db, pI
1baf0 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1bb00 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1bb10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1bb20 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69  .  }while( doPri
1bb30 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50  or && (p = p->pP
1bb40 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65  rior)!=0 );.}.#e
1bb50 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1bb60 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1bb70 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1bb80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1bb90 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1bba0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1bbb0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1bbc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1bbd0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1bbe0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1bbf0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1bc00 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1bc10 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1bc20 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1bc30 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1bc40 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1bc50 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1bc60 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1bc70 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1bc80 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1bc90 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1bca0 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1bcb0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1bcc0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1bcd0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1bce0 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1bcf0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1bd00 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1bd10 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1bd20 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1bd30 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1bd40 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1bd50 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1bd60 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1bd70 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1bd80 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1bd90 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1bda0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1bdb0 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1bdc0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1bdd0 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1bde0 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1bdf0 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1be00 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1be10 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1be20 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1be30 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1be40 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1be50 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1be60 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1be70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1be80 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1be90 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1bea0 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1beb0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1bec0 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1bed0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1bee0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1bef0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1bf00 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1bf10 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1bf20 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1bf30 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  plification give
1bf40 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1bf50 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1bf60 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1bf70 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1bf80 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1bf90 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1bfa0 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1bfb0 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1bfc0 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1bfd0 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1bfe0 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1bff0 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
1c000 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
1c010 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1c020 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
1c030 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1c040 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1c050 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1c060 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
1c070 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
1c080 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1c090 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1c0a0 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71  (2a) the outer q
1c0b0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
1c0c0 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 64  in.**        and
1c0d0 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72 20   (2b) the outer 
1c0e0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c0f0 73 65 20 73 75 62 71 75 65 72 69 65 73 20 6f 74  se subqueries ot
1c100 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1c110 0a 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d 2d  .**        FROM-
1c120 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20  clause subquery 
1c130 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69 64  that is a candid
1c140 61 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e 69  ate for flatteni
1c150 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20 20  ng.  (2b is.**  
1c160 20 20 20 20 20 20 64 75 65 20 74 6f 20 74 69 63        due to tic
1c170 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1c180 39 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30 31  9abf80] from 201
1c190 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20  5-02-09.).**.** 
1c1a0 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
1c1b0 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
1c1c0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1c1d0 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
1c1e0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69  n.**        (Ori
1c1f0 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23  ginally ticket #
1c200 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e  306.  Strengthen
1c210 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33  ed by ticket #33
1c220 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  00).**.**   (4) 
1c230 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1c240 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a   not DISTINCT..*
1c250 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
1c260 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
1c270 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
1c280 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
1c290 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
1c2a0 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
1c2b0 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
1c2c0 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
1c2d0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
1c2e0 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
1c2f0 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
1c300 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
1c310 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
1c320 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
1c330 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  eries..**.**   (
1c340 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
1c350 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1c360 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1c370 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1c380 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1c390 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
1c3a0 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
1c3b0 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
1c3c0 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
1c3d0 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
1c3e0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
1c3f0 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
1c400 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
1c410 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68  OM close with th
1c420 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20  e special.**    
1c430 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65      table sqlite
1c440 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69  _once that consi
1c450 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
1c460 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  row containing a
1c470 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c  .**        singl
1c480 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20  e NULL..**.**   
1c490 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
1c4a0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1c4b0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1c4c0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1c4d0 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
1c4e0 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
1c4f0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1c500 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1c510 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
1c520 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
1c530 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1c540 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69   (**)  Restricti
1c550 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f  on (10) was remo
1c560 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64  ved from the cod
1c570 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20  e on 2005-02-05 
1c580 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20  but we.**       
1c590 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72   accidently carr
1c5a0 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  ied the comment 
1c5b0 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30  forward until 20
1c5c0 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69  14-09-15.  Origi
1c5d0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 65  nal.**        te
1c5e0 78 74 3a 20 22 54 68 65 20 73 75 62 71 75 65 72  xt: "The subquer
1c5f0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
1c600 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
1c610 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a   outer query .**
1c620 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74          does not
1c630 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a   use LIMIT.".**.
1c640 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
1c650 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1c660 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1c670 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
1c680 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
1c690 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69  .**  (**)  Not i
1c6a0 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62  mplemented.  Sub
1c6b0 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72  sumed into restr
1c6c0 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73  iction (3).  Was
1c6d0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20   previously.**  
1c6e0 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65        a separate
1c6f0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72   restriction der
1c700 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65  iving from ticke
1c710 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28  t #350..**.**  (
1c720 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
1c730 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
1c740 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1c750 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
1c760 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
1c770 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c780 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  OFFSET..**.**  (
1c790 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  15)  The outer q
1c7a0 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74  uery is not part
1c7b0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1c7c0 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20  elect or the.** 
1c7d0 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
1c7e0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
1c7f0 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a  LIMIT clause..**
1c800 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
1c810 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
1c820 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
1c830 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
1c840 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1c850 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1c860 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
1c870 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
1c880 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
1c890 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
1c8a0 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
1c8b0 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
1c8c0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
1c8d0 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
1c8e0 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
1c8f0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
1c900 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
1c910 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
1c920 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
1c930 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
1c940 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
1c950 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c       compound cl
1c960 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
1c970 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
1c980 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
1c990 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
1c9a0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
1c9b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1c9c0 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
1c9d0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
1c9e0 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
1c9f0 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1ca00 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1ca10 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
1ca20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
1ca30 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a  * is not a join.
1ca40 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
1ca50 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
1ca60 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
1ca70 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
1ca80 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
1ca90 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
1caa0 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
1cab0 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
1cac0 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
1cad0 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
1cae0 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
1caf0 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
1cb00 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
1cb10 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1cb20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
1cb30 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
1cb40 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
1cb50 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
1cb60 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1cb70 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
1cb80 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
1cb90 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
1cba0 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
1cbb0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
1cbc0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
1cbd0 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
1cbe0 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
1cbf0 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
1cc00 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
1cc10 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
1cc20 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
1cc30 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
1cc40 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
1cc50 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
1cc60 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
1cc70 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
1cc80 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
1cc90 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
1cca0 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
1ccb0 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
1ccc0 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
1ccd0 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
1cce0 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
1ccf0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1cd00 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
1cd10 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
1cd20 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
1cd30 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
1cd40 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1cd50 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1cd60 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
1cd70 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
1cd80 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f  RDER by clause o
1cd90 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
1cda0 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
1cdb0 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
1cdc0 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
1cdd0 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
1cde0 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20  *.**  (19)  The 
1cdf0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1ce00 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1ce10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1ce20 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
1ce30 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63    have a WHERE c
1ce40 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  lause..**.**  (2
1ce50 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  0)  If the sub-q
1ce60 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1ce70 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1ce80 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a  it must not use.
1ce90 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44  **        an ORD
1cea0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ER BY clause.  T
1ceb0 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65  icket #3773.  We
1cec0 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69   could relax thi
1ced0 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  s constraint.** 
1cee0 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20         somewhat 
1cef0 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74  by saying that t
1cf00 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
1cf10 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1cf20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61  must.**        a
1cf30 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66  ppear as unmodif
1cf40 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ied result colum
1cf50 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ns in the outer 
1cf60 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a  query.  But we.*
1cf70 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74  *        have ot
1cf80 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
1cf90 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61  s in mind to dea
1cfa0 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65  l with that case
1cfb0 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54  ..**.**  (21)  T
1cfc0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1cfd0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1cfe0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1cff0 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
1d000 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53     DISTINCT.  (S
1d010 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31  ee ticket [752e1
1d020 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  646fc])..**.**  
1d030 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65  (22)  The subque
1d040 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  ry is not a recu
1d050 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rsive CTE..**.**
1d060 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72 65    (23)  The pare
1d070 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  nt is not a recu
1d080 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68  rsive CTE, or th
1d090 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1d0a0 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63  ot a.**        c
1d0b0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54  ompound query. T
1d0c0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
1d0d0 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73  is because trans
1d0e0 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20  forming the.**  
1d0f0 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20        parent to 
1d100 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
1d110 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f   confuses the co
1d120 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a  de that handles.
1d130 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73  **        recurs
1d140 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d  ive queries in m
1d150 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ultiSelect()..**
1d160 0a 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20 73  .**  (24)  The s
1d170 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1d180 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61 74  n aggregate that
1d190 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d   uses the built-
1d1a0 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20  in min() or .** 
1d1b0 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20         or max() 
1d1c0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74  functions.  (Wit
1d1d0 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72 69  hout this restri
1d1e0 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c  ction, a query l
1d1f0 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22  ike:.**        "
1d200 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53  SELECT x FROM (S
1d210 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20  ELECT max(y), x 
1d220 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20  FROM t1)" would 
1d230 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a  not necessarily.
1d240 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  **        return
1d250 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72   the value X for
1d260 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61 78   which Y was max
1d270 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  imal.).**.**.** 
1d280 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
1d290 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
1d2a0 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
1d2b0 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
1d2c0 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
1d2d0 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
1d2e0 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
1d2f0 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
1d300 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
1d310 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
1d320 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
1d330 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
1d340 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
1d350 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1d360 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1d370 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
1d380 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1d390 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
1d3a0 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
1d3b0 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
1d3c0 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
1d3d0 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
1d3e0 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
1d3f0 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
1d400 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
1d410 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
1d420 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
1d430 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
1d440 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
1d450 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1d460 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
1d470 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d480 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
1d490 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d4a0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1d4b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1d4c0 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
1d4d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
1d4e0 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
1d4f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1d500 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
1d510 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
1d520 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
1d530 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
1d540 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
1d550 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
1d560 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1d570 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
1d580 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
1d590 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
1d5a0 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
1d5b0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
1d5c0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d5d0 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
1d5e0 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
1d5f0 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c  thContext;.  Sel
1d600 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  ect *pParent;   
1d610 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f   /* Current UNIO
1d620 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68  N ALL term of th
1d630 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f  e other query */
1d640 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
1d650 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1d660 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
1d670 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
1d680 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
1d690 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
1d6a0 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
1d6b0 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
1d6c0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1d6d0 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
1d6e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1d6f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d700 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1d710 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
1d720 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1d730 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1d740 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1d750 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
1d760 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
1d770 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
1d780 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
1d790 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1d7a0 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
1d7b0 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
1d7c0 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
1d7d0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1d7e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1d7f0 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
1d800 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
1d810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d820 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1d830 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1d840 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
1d850 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
1d860 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1d870 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d880 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
1d890 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
1d8a0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1d8b0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
1d8c0 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
1d8d0 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
1d8e0 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
1d8f0 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
1d900 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
1d910 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
1d920 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1d930 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
1d940 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
1d950 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ner) ) return 0;
1d960 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1d970 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1d980 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
1d990 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
1d9a0 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
1d9b0 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
1d9c0 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
1d9d0 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
1d9e0 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
1d9f0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1da00 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
1da10 29 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  );.  if( subquer
1da20 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66  yIsAgg ){.    if
1da30 28 20 69 73 41 67 67 20 29 20 72 65 74 75 72 6e  ( isAgg ) return
1da40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1da70 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20 20 20 69  n (1)   */.    i
1da80 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  f( pSrc->nSrc>1 
1da90 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1dac0 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20 20 20  on (2a)  */.    
1dad0 69 66 28 20 28 70 2d 3e 70 57 68 65 72 65 20 26  if( (p->pWhere &
1dae0 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
1daf0 79 28 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f 53  y(p->pWhere,EP_S
1db00 75 62 71 75 65 72 79 29 29 0a 20 20 20 20 20 7c  ubquery)).     |
1db10 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69  | (sqlite3ExprLi
1db20 73 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69 73  stFlags(p->pELis
1db30 74 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79  t) & EP_Subquery
1db40 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73 71  )!=0.     || (sq
1db50 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
1db60 67 73 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 20  gs(p->pOrderBy) 
1db70 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d  & EP_Subquery)!=
1db80 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  0.    ){.      r
1db90 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1dbd0 20 28 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d 0a   (2b)  */.    }.
1dbe0 20 20 7d 0a 20 20 20 20 0a 20 20 70 53 75 62 53    }.    .  pSubS
1dbf0 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
1dc00 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
1dc10 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
1dc20 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
1dc30 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
1dc40 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
1dc50 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
1dc60 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
1dc70 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1dc80 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
1dc90 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
1dca0 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
1dcb0 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
1dcc0 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
1dcd0 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
1dce0 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
1dcf0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1dd00 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
1dd10 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1dd20 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
1dd30 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
1dd40 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
1dd50 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
1dd60 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1dd70 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
1dd80 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1dd90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dda0 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
1ddb0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
1ddc0 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dde0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1ddf0 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
1de00 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1de10 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64  gs & SF_Compound
1de20 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c  )!=0 && pSub->pL
1de30 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75  imit ){.    retu
1de40 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1de80 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
1de90 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
1dea0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1ded0 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
1dee0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1def0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
1df00 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1df10 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1df20 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66  ion (5)  */.  if
1df30 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1df40 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
1df50 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
1df60 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1df70 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1df80 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20  ons (8)(9) */.  
1df90 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
1dfa0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1dfb0 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65  ct)!=0 && subque
1dfc0 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
1dfd0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1dfe0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1dff0 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69   (6)  */.  }.  i
1e000 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
1e010 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
1e020 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1e030 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e060 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
1e070 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
1e080 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
1e090 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
1e0a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e0b0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e0c0 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (16) */.  if( pS
1e0d0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
1e0e0 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
1e0f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e100 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e110 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (19) */.  if( pS
1e120 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1e130 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1e140 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a  Distinct)!=0 ){.
1e150 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1e160 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1e170 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20  ction (21) */.  
1e180 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53  }.  testcase( pS
1e190 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1e1a0 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20  F_Recursive );. 
1e1b0 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d   testcase( pSub-
1e1c0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
1e1d0 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69 66  inMaxAgg );.  if
1e1e0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1e1f0 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65   & (SF_Recursive
1e200 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29  |SF_MinMaxAgg) )
1e210 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1e220 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
1e230 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a 2f  (22) and (24) */
1e240 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1e250 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
1e260 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62 2d  ursive) && pSub-
1e270 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
1e280 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74  eturn 0; /* Rest
1e290 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a  riction (23) */.
1e2a0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45    }..  /* OBSOLE
1e2b0 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20  TE COMMENT 1:.  
1e2c0 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  ** Restriction 3
1e2d0 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1e2e0 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
1e2f0 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1e300 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
1e310 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
1e320 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1e330 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
1e340 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
1e350 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
1e360 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1e370 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1e380 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
1e390 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
1e3a0 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
1e3b0 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
1e3c0 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
1e3d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
1e3e0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1e3f0 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
1e400 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
1e410 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
1e420 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
1e430 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    ** OBSOLETE CO
1e440 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65  MMENT 2:.  ** Re
1e450 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
1e460 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1e470 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1e480 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
1e490 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
1e4a0 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1e4b0 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
1e4c0 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
1e4d0 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
1e4e0 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
1e4f0 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1e500 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1e510 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
1e520 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
1e530 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
1e540 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
1e550 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
1e560 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
1e570 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
1e580 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1e590 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
1e5a0 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
1e5b0 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
1e5c0 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
1e5d0 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
1e5e0 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
1e5f0 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
1e600 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
1e610 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
1e620 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a  NNER JOIN..  **.
1e630 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49    ** THIS OVERRI
1e640 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d  DES OBSOLETE COM
1e650 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42  MENTS 1 AND 2 AB
1e660 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74  OVE:.  ** Ticket
1e670 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61   #3300 shows tha
1e680 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  t flattening the
1e690 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
1e6a0 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
1e6b0 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20  is fraught with 
1e6c0 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f  danger.  Best to
1e6d0 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65   avoid the whole
1e6e0 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a   thing.  If the.
1e6f0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
1e700 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1e710 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
1e720 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74  then do not flat
1e730 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ten..  */.  if( 
1e740 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f  (pSubitem->fg.jo
1e750 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1e760 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
1e770 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
1e780 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
1e790 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1e7a0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1e7b0 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
1e7c0 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
1e7d0 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
1e7e0 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
1e7f0 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
1e800 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
1e810 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
1e820 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
1e830 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
1e840 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
1e850 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
1e860 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
1e870 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
1e880 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
1e890 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1e8a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1e8b0 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
1e8c0 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  n 20 */.    }.  
1e8d0 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
1e8e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1e8f0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
1e900 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
1e910 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1e920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1e930 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
1e940 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
1e950 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
1e960 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1e970 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1e980 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1e990 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
1e9a0 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
1e9b0 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1e9c0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1e9d0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1e9e0 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
1e9f0 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
1ea00 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
1ea10 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1ea20 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73  ert( pSub->pELis
1ea30 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d  t->nExpr==pSub1-
1ea40 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
1ea50 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  ;.      if( (pSu
1ea60 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1ea70 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1ea80 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20  ggregate))!=0.  
1ea90 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e       || (pSub1->
1eaa0 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d  pPrior && pSub1-
1eab0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20  >op!=TK_ALL) .  
1eac0 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70       || pSub1->p
1ead0 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20  Src->nSrc<1.    
1eae0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
1eaf0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1eb00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1eb10 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1eb20 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
1eb30 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1eb40 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  18. */.    if( p
1eb50 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1eb60 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1eb70 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1eb80 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1eb90 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
1eba0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1ebb0 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72  y->a[ii].u.x.iOr
1ebc0 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
1ebd0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1ebe0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
1ebf0 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
1ec00 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
1ec10 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1ec20 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45  ted. *****/.  SE
1ec30 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
1ec40 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25  se,p,("flatten %
1ec50 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25  s.%p from term %
1ec60 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1ec70 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a           pSub->z
1ec80 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69  SelName, pSub, i
1ec90 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75  From));..  /* Au
1eca0 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71  thorize the subq
1ecb0 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65  uery */.  pParse
1ecc0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1ecd0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1ece0 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d  ;.  TESTONLY(i =
1ecf0 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ) sqlite3AuthChe
1ed00 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1ed10 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
1ed20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  0);.  testcase( 
1ed30 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29  i==SQLITE_DENY )
1ed40 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  ;.  pParse->zAut
1ed50 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
1ed60 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20  dAuthContext;.. 
1ed70 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71   /* If the sub-q
1ed80 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1ed90 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
1eda0 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65  ent, then (by re
1edb0 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  strictions.  ** 
1edc0 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29  17 and 18 above)
1edd0 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e   it must be a UN
1ede0 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20  ION ALL and the 
1edf0 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73  parent query mus
1ee00 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68  t .  ** be of th
1ee10 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
1ee20 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78  *     SELECT <ex
1ee30 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c  pr-list> FROM (<
1ee40 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65  sub-query>) <whe
1ee50 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a  re-clause> .  **
1ee60 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  .  ** followed b
1ee70 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  y any ORDER BY, 
1ee80 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46  LIMIT and/or OFF
1ee90 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69  SET clauses. Thi
1eea0 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65  s block.  ** cre
1eeb0 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20  ates N-1 copies 
1eec0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  of the parent qu
1eed0 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ery without any 
1eee0 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
1eef0 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20  or .  ** OFFSET 
1ef00 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e  clauses and join
1ef10 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65  s them to the le
1ef20 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ft-hand-side of 
1ef30 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
1ef40 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c  * using UNION AL
1ef50 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20  L operators. In 
1ef60 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74  this case N is t
1ef70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  he number of sim
1ef80 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  ple.  ** select 
1ef90 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
1efa0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  e compound sub-q
1efb0 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
1efc0 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
1efd0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
1efe0 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20  1 FROM (.  **   
1eff0 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52       SELECT x FR
1f000 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
1f010 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1f020 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1f030 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  y FROM tab.  ** 
1f040 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1f050 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1f060 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f  ECT abs(z*2) FRO
1f070 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20  M tab2.  **     
1f080 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44  ) WHERE a!=5 ORD
1f090 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
1f0a0 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
1f0b0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
1f0c0 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f    SELECT x+1 FRO
1f0d0 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21  M tab WHERE x+1!
1f0e0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
1f0f0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
1f100 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74  ELECT y+1 FROM t
1f110 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a  ab WHERE y+1!=5.
1f120 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
1f130 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
1f140 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52  CT abs(z*2)+1 FR
1f150 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62  OM tab2 WHERE ab
1f160 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a  s(z*2)+1!=5.  **
1f170 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a       ORDER BY 1.
1f180 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c    **.  ** We cal
1f190 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70  l this the "comp
1f1a0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1f1b0 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a  attening"..  */.
1f1c0 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d    for(pSub=pSub-
1f1d0 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70  >pPrior; pSub; p
1f1e0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1f1f0 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
1f200 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  New;.    ExprLis
1f210 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
1f220 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45  >pOrderBy;.    E
1f230 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
1f240 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70  >pLimit;.    Exp
1f250 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r *pOffset = p->
1f260 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c  pOffset;.    Sel
1f270 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
1f280 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
1f290 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1f2a0 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
1f2b0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
1f2c0 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
1f2d0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66  = 0;.    p->pOff
1f2e0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  set = 0;.    pNe
1f2f0 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  w = sqlite3Selec
1f300 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a  tDup(db, p, 0);.
1f310 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1f320 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70  tSetName(pNew, p
1f330 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a  Sub->zSelName);.
1f340 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
1f350 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d   pOffset;.    p-
1f360 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1f370 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1f380 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1f390 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
1f3a0 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
1f3b0 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e  _ALL;.    if( pN
1f3c0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
1f3d0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
1f3e0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1f3f0 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
1f400 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
1f410 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
1f420 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
1f430 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ew;.      pNew->
1f440 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
1f450 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
1f460 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  w;.      SELECTT
1f470 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c  RACE(2,pParse,p,
1f480 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70  .         ("comp
1f490 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1f4a0 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73 20  attener creates 
1f4b0 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22  %s.%p as peer\n"
1f4c0 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ,.         pNew-
1f4d0 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29  >zSelName, pNew)
1f4e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f4f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1f500 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
1f510 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
1f520 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
1f530 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
1f540 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
1f550 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
1f560 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
1f570 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
1f580 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1f590 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
1f5a0 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
1f5b0 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
1f5c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1f5d0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
1f5e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
1f5f0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1f600 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
1f610 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f620 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
1f630 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1f640 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1f650 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
1f660 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
1f670 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1f680 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
1f690 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
1f6a0 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
1f6b0 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
1f6c0 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
1f6d0 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
1f6e0 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1f6f0 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1f700 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
1f710 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
1f720 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
1f730 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
1f740 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
1f750 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
1f760 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
1f770 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
1f780 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
1f790 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
1f7a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
1f7b0 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
1f7c0 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
1f7d0 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
1f7e0 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
1f7f0 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
1f800 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
1f810 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
1f820 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
1f830 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
1f840 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
1f850 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b  oDel->nRef==1 ){
1f860 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54  .      Parse *pT
1f870 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1f880 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1f890 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54  Parse);.      pT
1f8a0 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f  abToDel->pNextZo
1f8b0 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c  mbie = pToplevel
1f8c0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
1f8d0 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
1f8e0 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62  ZombieTab = pTab
1f8f0 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  ToDel;.    }else
1f900 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  {.      pTabToDe
1f910 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d  l->nRef--;.    }
1f920 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
1f930 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Tab = 0;.  }..  
1f940 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1f950 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
1f960 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  for each term in
1f970 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1f980 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65  uery.  ** flatte
1f990 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62  ning (as describ
1f9a0 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77  ed above).  If w
1f9b0 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69  e are doing a di
1f9c0 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a  fferent kind.  *
1f9d0 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * of flattening 
1f9e0 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f  - a flattening o
1f9f0 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70  ther than a comp
1fa00 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1fa10 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20  attening -.  ** 
1fa20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f  then this loop o
1fa30 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20  nly runs once.. 
1fa40 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
1fa50 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20  op moves all of 
1fa60 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
1fa70 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
1fa80 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
1fa90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1faa0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1fab0 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
1fac0 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
1fad0 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
1fae0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1faf0 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
1fb00 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
1fb10 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
1fb20 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
1fb30 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
1fb40 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
1fb50 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
1fb60 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
1fb70 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
1fb80 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
1fb90 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
1fba0 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
1fbb0 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
1fbc0 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
1fbd0 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
1fbe0 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
1fbf0 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
1fc00 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
1fc10 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65    */.  for(pPare
1fc20 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70  nt=p; pParent; p
1fc30 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e  Parent=pParent->
1fc40 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75  pPrior, pSub=pSu
1fc50 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1fc60 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20  int nSubSrc;.   
1fc70 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30   u8 jointype = 0
1fc80 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20  ;.    pSubSrc = 
1fc90 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20  pSub->pSrc;     
1fca0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
1fcb0 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  f subquery */.  
1fcc0 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62    nSubSrc = pSub
1fcd0 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e  Src->nSrc;  /* N
1fce0 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
1fcf0 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20  n subquery FROM 
1fd00 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53  clause */.    pS
1fd10 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
1fd20 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
1fd30 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1fd40 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ter query */..  
1fd50 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
1fd60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1fd70 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69  ent==p );  /* Fi
1fd80 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68  rst time through
1fd90 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1fda0 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53     jointype = pS
1fdb0 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  ubitem->fg.joint
1fdc0 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ype;.    }else{.
1fdd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1fde0 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20  arent!=p );  /* 
1fdf0 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
1fe00 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68  nt times through
1fe10 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1fe20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
1fe30 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  t->pSrc = sqlite
1fe40 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
1fe50 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
1fe60 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29     if( pSrc==0 )
1fe70 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1fe80 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1fe90 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed );.        br
1fea0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1feb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   }..    /* The s
1fec0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73  ubquery uses a s
1fed0 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68  ingle slot of th
1fee0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1fef0 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a   the outer.    *
1ff00 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  * query.  If the
1ff10 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f   subquery has mo
1ff20 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d  re than one elem
1ff30 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ent in its FROM 
1ff40 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74  clause,.    ** t
1ff50 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f  hen expand the o
1ff60 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61  uter query to ma
1ff70 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20  ke space for it 
1ff80 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d  to hold all elem
1ff90 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
1ffa0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
1ffb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
1ffc0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1ffd0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
1ffe0 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54  OM tabA, (SELECT
1fff0 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75   * FROM sub1, su
20000 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a  b2), tabB;.    *
20010 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74  *.    ** The out
20020 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73  er query has 3 s
20030 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d  lots in its FROM
20040 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c   clause.  One sl
20050 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ot of the.    **
20060 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68   outer query (th
20070 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69  e middle slot) i
20080 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75  s used by the su
20090 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78  bquery.  The nex
200a0 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f  t.    ** block o
200b0 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61  f code will expa
200c0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
200d0 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ry FROM clause t
200e0 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  o 4 slots..    *
200f0 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f  * The middle slo
20100 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f  t is expanded to
20110 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72   two slots in or
20120 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  der to make spac
20130 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  e.    ** for the
20140 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
20150 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
20160 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
20170 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20180 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
20190 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
201a0 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74  c = pSrc = sqlit
201b0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
201c0 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53  (db, pSrc, nSubS
201d0 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20  rc-1,iFrom+1);. 
201e0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
201f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
20200 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20210 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
20220 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46  * Transfer the F
20230 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
20240 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
20250 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  ry into the.    
20260 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  ** outer query..
20270 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
20280 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
20290 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
202a0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
202b0 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72  b, pSrc->a[i+iFr
202c0 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20  om].pUsing);.   
202d0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d     assert( pSrc-
202e0 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69  >a[i+iFrom].fg.i
202f0 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20  sTabFunc==0 );. 
20300 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
20310 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
20320 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
20330 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
20340 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
20350 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
20360 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
20370 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74  [iFrom].fg.joint
20380 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
20390 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
203a0 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
203b0 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
203c0 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
203d0 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
203e0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
203f0 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
20400 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
20410 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
20420 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
20430 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
20440 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
20450 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
20460 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
20470 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
20480 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
20490 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
204a0 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
204b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
204c0 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
204d0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
204e0 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
204f0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
20500 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20510 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
20520 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
20530 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
20540 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20550 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
20560 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
20570 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
20580 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
20590 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
205a0 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
205b0 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
205c0 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65     pList = pPare
205d0 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  nt->pEList;.    
205e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
205f0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
20600 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
20610 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  a[i].zName==0 ){
20620 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
20630 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
20640 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  StrDup(db, pList
20650 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
20660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
20670 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
20680 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
20690 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
206a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
206b0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
206c0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f  derBy ){.      /
206d0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
206e0 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f   any non-zero iO
206f0 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73  rderByCol values
20700 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
20710 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  he.      ** ORDE
20720 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72  R BY column expr
20730 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69  ession is identi
20740 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65  cal to the iOrde
20750 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20  rByCol'th.      
20760 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  ** expression re
20770 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
20780 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e   statement pSub.
20790 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c   Since these val
207a0 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20  ues.      ** do 
207b0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
207c0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f  correspond to co
207d0 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20  lumns in SELECT 
207e0 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e  statement pParen
207f0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  t,.      ** zero
20800 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61   them before tra
20810 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44  nsfering the ORD
20820 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
20830 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
20840 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d  Not doing this m
20850 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f  ay cause an erro
20860 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  r if a subsequen
20870 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  t call to this. 
20880 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
20890 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
208a0 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  tten a compound 
208b0 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70  sub-query into p
208c0 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  Parent.      ** 
208d0 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68  (the only way th
208e0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73  is can happen is
208f0 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   if the compound
20900 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20   sub-query is.  
20910 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79      ** currently
20920 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70   part of pSub->p
20930 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74  Src). See ticket
20940 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20   [d11a6e908f].  
20950 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
20960 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
20970 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
20980 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20990 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
209a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  i++){.        pO
209b0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
209c0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30  .iOrderByCol = 0
209d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
209e0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
209f0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
20a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
20a10 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b  ub->pPrior==0 );
20a20 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20a30 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
20a40 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
20a50 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
20a60 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20     }.    pWhere 
20a70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
20a80 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
20a90 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73  e, 0);.    if( s
20aa0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
20ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20ac0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d  arent->pHaving==
20ad0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
20ae0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50  nt->pHaving = pP
20af0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20  arent->pWhere;. 
20b00 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
20b10 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
20b20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
20b30 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
20b40 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
20b50 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20  nt->pHaving, .  
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
20b90 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  b, pSub->pHaving
20ba0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73  , 0));.      ass
20bb0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47  ert( pParent->pG
20bc0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
20bd0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f     pParent->pGro
20be0 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
20bf0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53  prListDup(db, pS
20c00 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29  ub->pGroupBy, 0)
20c10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20c20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
20c30 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
20c40 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
20c50 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
20c60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73  ;.    }.    subs
20c70 74 53 65 6c 65 63 74 28 64 62 2c 20 70 50 61 72  tSelect(db, pPar
20c80 65 6e 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ent, iParent, pS
20c90 75 62 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a  ub->pEList, 0);.
20ca0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
20cb0 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
20cc0 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
20cd0 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
20ce0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
20cf0 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
20d00 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
20d10 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
20d20 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
20d30 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
20d40 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
20d50 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
20d60 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
20d70 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
20d80 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
20d90 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
20da0 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
20db0 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
20dc0 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
20dd0 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
20de0 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
20df0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
20e00 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
20e10 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
20e20 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
20e30 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
20e40 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
20e50 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
20e60 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
20e70 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
20e80 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
20e90 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
20ea0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
20eb0 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
20ec0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
20ed0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
20ee0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
20ef0 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43  ub1);..#if SELEC
20f00 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
20f10 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
20f20 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
20f30 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
20f40 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
20f50 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  p,("After flatte
20f60 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ning:\n"));.    
20f70 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
20f80 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
20f90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
20fa0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
20fb0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
20fc0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
20fd0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
20fe0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
20ff0 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
21000 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21010 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
21020 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
21030 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61  T_VIEW)./*.** Ma
21040 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c  ke copies of rel
21050 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75  evant WHERE clau
21060 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  se terms of the 
21070 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f  outer query into
21080 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
21090 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
210a0 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
210b0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
210c0 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20  OM (SELECT a AS 
210d0 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d  x, c-d AS y FROM
210e0 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41   t1) WHERE x=5 A
210f0 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
21100 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
21110 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
21120 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
21130 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79  a AS x, c-d AS y
21140 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
21150 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a  =5 AND c-d=10).*
21160 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20  *     WHERE x=5 
21170 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
21180 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74  The hope is that
21190 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64   the terms added
211a0 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75   to the inner qu
211b0 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74  ery will make it
211c0 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65   more.** efficie
211d0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  nt..**.** Do not
211e0 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70   attempt this op
211f0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a  timization if:.*
21200 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 20 69  *.**   (1) The i
21210 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 61 6e  nner query is an
21220 20 61 67 67 72 65 67 61 74 65 2e 20 20 28 49 6e   aggregate.  (In
21230 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 27 64   that case, we'd
21240 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20   really want.** 
21250 20 20 20 20 20 20 74 6f 20 63 6f 70 79 20 74 68        to copy th
21260 65 20 6f 75 74 65 72 20 57 48 45 52 45 2d 63 6c  e outer WHERE-cl
21270 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20  ause terms onto 
21280 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
21290 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  e of the.**     
212a0 20 20 69 6e 6e 65 72 20 71 75 65 72 79 2e 20 20    inner query.  
212b0 42 75 74 20 74 68 65 79 20 70 72 6f 62 61 62 6c  But they probabl
212c0 79 20 77 6f 6e 27 74 20 68 65 6c 70 20 74 68 65  y won't help the
212d0 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74  re so do not bot
212e0 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32  her.).**.**   (2
212f0 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
21300 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73 69  y is the recursi
21310 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ve part of a com
21320 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73  mon table expres
21330 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  sion..**.**   (3
21340 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
21350 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c  y has a LIMIT cl
21360 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65 20  ause (since the 
21370 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57  changes to the W
21380 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c  HERE.**       cl
21390 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65  ose would change
213a0 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   the meaning of 
213b0 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a  the LIMIT)..**.*
213c0 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65  *   (4) The inne
213d0 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
213e0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
213f0 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54  a LEFT JOIN.  (T
21400 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20  he caller.**    
21410 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73     enforces this
21420 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69 6e   restriction sin
21430 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
21440 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65 6e  does not have en
21450 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ough.**       in
21460 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f  formation to kno
21470 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  w.).**.**   (5) 
21480 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
21490 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
214a0 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e  inates in the ON
214b0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
214c0 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c  .**       of a L
214d0 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20  EFT JOIN..**.** 
214e0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63  Return 0 if no c
214f0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
21500 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  and non-zero if 
21510 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52  one or more WHER
21520 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d  E clause.** term
21530 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 64  s are duplicated
21540 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65   into the subque
21550 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
21560 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  t pushDownWhereT
21570 65 72 6d 73 28 0a 20 20 73 71 6c 69 74 65 33 20  erms(.  sqlite3 
21580 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *db,          /*
21590 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
215a0 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d 61  nnection (for ma
215b0 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20 20 53 65 6c  lloc()) */.  Sel
215c0 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20  ect *pSubq,     
215d0 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
215e0 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63  ry whose WHERE c
215f0 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61  lause is to be a
21600 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78  ugmented */.  Ex
21610 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
21620 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
21630 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
21640 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
21650 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20 20  int iCursor     
21660 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
21670 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75  number of the su
21680 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45  bquery */.){.  E
21690 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
216a0 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66   nChng = 0;.  if
216b0 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65  ( pWhere==0 ) re
216c0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
216d0 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
216e0 20 28 53 46 5f 41 67 67 72 65 67 61 74 65 7c 53   (SF_Aggregate|S
216f0 46 5f 52 65 63 75 72 73 69 76 65 29 29 21 3d 30  F_Recursive))!=0
21700 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
21710 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
21720 6e 73 20 28 31 29 20 61 6e 64 20 28 32 29 20 2a  ns (1) and (2) *
21730 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
21740 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a  q->pLimit!=0 ){.
21750 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f       return 0; /
21760 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  * restriction (3
21770 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ) */.  }.  while
21780 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b  ( pWhere->op==TK
21790 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e  _AND ){.    nChn
217a0 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65  g += pushDownWhe
217b0 72 65 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62  reTerms(db, pSub
217c0 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68  q, pWhere->pRigh
217d0 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t, iCursor);.   
217e0 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65   pWhere = pWhere
217f0 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69  ->pLeft;.  }.  i
21800 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
21810 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f  ty(pWhere,EP_Fro
21820 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
21830 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
21840 6e 20 35 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  n 5 */.  if( sql
21850 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
21860 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20  onstant(pWhere, 
21870 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  iCursor) ){.    
21880 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69  nChng++;.    whi
21890 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20  le( pSubq ){.   
218a0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
218b0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68  3ExprDup(db, pWh
218c0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ere, 0);.      p
218d0 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70 72 28  New = substExpr(
218e0 64 62 2c 20 70 4e 65 77 2c 20 69 43 75 72 73 6f  db, pNew, iCurso
218f0 72 2c 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74  r, pSubq->pEList
21900 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e  );.      pSubq->
21910 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
21920 45 78 70 72 41 6e 64 28 64 62 2c 20 70 53 75 62  ExprAnd(db, pSub
21930 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29  q->pWhere, pNew)
21940 3b 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d 20  ;.      pSubq = 
21950 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20  pSubq->pPrior;. 
21960 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21970 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69  n nChng;.}.#endi
21980 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
21990 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
219a0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
219b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
219c0 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65  ) */../*.** Base
219d0 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
219e0 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f  s of the AggInfo
219f0 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63   structure indic
21a00 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ated by the firs
21a10 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74  t.** argument, t
21a20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
21a30 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  cks if the follo
21a40 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
21a50 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75  *.**    * the qu
21a60 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73  ery contains jus
21a70 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65  t a single aggre
21a80 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a  gate function,.*
21a90 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67 72 65  *    * the aggre
21aa0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
21ab0 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72   either min() or
21ac0 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20   max(), and.**  
21ad0 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74    * the argument
21ae0 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
21af0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  e function is a 
21b00 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a  column value..**
21b10 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68  .** If all of th
21b20 65 20 61 62 6f 76 65 20 61 72 65 20 74 72 75 65  e above are true
21b30 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44  , then WHERE_ORD
21b40 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52  ERBY_MIN or WHER
21b50 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a  E_ORDERBY_MAX.**
21b60 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
21b70 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73  appropriate. Als
21b80 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20  o, *ppMinMax is 
21b90 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
21ba0 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20  the .** list of 
21bb0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
21bc0 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
21bd0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
21be0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  ng..**.** Or, if
21bf0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
21c00 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65  above are not me
21c10 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20  t, *ppMinMax is 
21c20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
21c30 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
21c40 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64  RMAL is returned
21c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d  ..*/.static u8 m
21c60 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e  inMaxQuery(AggIn
21c70 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78  fo *pAggInfo, Ex
21c80 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61  prList **ppMinMa
21c90 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d  x){.  int eRet =
21ca0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
21cb0 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20  ORMAL;          
21cc0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
21cd0 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20  */..  *ppMinMax 
21ce0 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49  = 0;.  if( pAggI
21cf0 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b  nfo->nFunc==1 ){
21d00 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
21d10 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
21d20 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20  nc[0].pExpr; /* 
21d30 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  Aggregate functi
21d40 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  on */.    ExprLi
21d50 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78  st *pEList = pEx
21d60 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20  pr->x.pList;    
21d70 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
21d80 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a  o agg function *
21d90 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
21da0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
21db0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
21dc0 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
21dd0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  EList->nExpr==1 
21de0 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  && pEList->a[0].
21df0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
21e00 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
21e10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
21e20 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  unc = pExpr->u.z
21e30 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  Token;.      if(
21e40 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
21e50 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30  zFunc, "min")==0
21e60 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74   ){.        eRet
21e70 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
21e80 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70  _MIN;.        *p
21e90 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74  pMinMax = pEList
21ea0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21eb0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
21ec0 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d  (zFunc, "max")==
21ed0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65  0 ){.        eRe
21ee0 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
21ef0 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a  Y_MAX;.        *
21f00 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73  ppMinMax = pELis
21f10 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
21f20 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
21f30 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20  *ppMinMax==0 || 
21f40 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78  (*ppMinMax)->nEx
21f50 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  pr==1 );.  retur
21f60 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n eRet;.}../*.**
21f70 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
21f80 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
21f90 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
21fa0 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  nt is an aggrega
21fb0 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  te query..** The
21fc0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
21fd0 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
21fe0 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
21ff0 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
22000 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
22010 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
22020 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
22030 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
22040 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
22050 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
22060 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
22070 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
22080 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
22090 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
220a0 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
220b0 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
220c0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
220d0 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
220e0 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
220f0 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
22100 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
22110 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
22120 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
22130 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
22140 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
22150 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
22160 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
22170 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
22180 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
22190 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
221a0 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
221b0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
221c0 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
221d0 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
221e0 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
221f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
22200 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
22210 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
22220 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
22230 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
22240 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
22250 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
22260 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
22270 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
22280 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
22290 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
222a0 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
222b0 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
222c0 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49   if( NEVER(pAggI
222d0 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29  nfo->nFunc==0) )
222e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
222f0 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   (pAggInfo->aFun
22300 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  c[0].pFunc->func
22310 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
22320 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
22330 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
22340 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
22350 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
22360 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
22370 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
22380 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
22390 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
223a0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
223b0 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
223c0 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
223d0 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
223e0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
223f0 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
22400 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
22410 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
22420 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
22430 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
22440 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
22450 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
22460 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
22470 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
22480 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
22490 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
224a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
224b0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
224c0 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
224d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
224e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
224f0 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
22500 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
22510 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e  & pFrom->fg.isIn
22520 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54  dexedBy ){.    T
22530 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
22540 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
22550 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d  ar *zIndexedBy =
22560 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pFrom->u1.zInde
22570 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78  xedBy;.    Index
22580 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
22590 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
225a0 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
225b0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
225c0 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
225d0 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20  zIndexedBy); .  
225e0 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
225f0 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
22600 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
22610 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
22620 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
22630 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
22640 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29  , zIndexedBy, 0)
22650 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
22660 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
22670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22680 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
22690 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42  }.    pFrom->pIB
226a0 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
226b0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
226c0 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
226d0 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
226e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
226f0 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
22700 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
22710 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
22720 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
22730 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
22740 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
22750 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
22760 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
22770 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
22780 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
22790 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
227a0 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
227b0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
227c0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
227d0 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
227e0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
227f0 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
22800 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
22810 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
22820 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
22830 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
22840 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
22850 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
22860 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
22870 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
22880 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
22890 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
228a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
228b0 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
228c0 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
228d0 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
228e0 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
228f0 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
22900 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
22910 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
22920 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
22930 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
22940 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
22950 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
22960 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
22970 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
22980 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
22990 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
229a0 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
229b0 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
229c0 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
229d0 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
229e0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
229f0 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
22a00 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
22a10 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
22a20 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
22a30 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
22a40 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
22a50 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
22a60 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
22a70 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
22a80 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
22a90 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
22aa0 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
22ab0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
22ac0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
22ad0 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
22ae0 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
22af0 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
22b00 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
22b10 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
22b20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
22b30 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
22b40 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
22b50 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
22b60 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
22b70 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
22b80 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
22b90 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
22ba0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
22bb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
22bc0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
22bd0 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
22be0 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
22bf0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
22c00 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
22c10 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
22c20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
22c30 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
22c40 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
22c50 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
22c60 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
22c70 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
22c80 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
22c90 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
22ca0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
22cb0 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
22cc0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
22cd0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
22ce0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
22cf0 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
22d00 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
22d10 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
22d20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
22d30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
22d40 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
22d50 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
22d60 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
22d70 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
22d80 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
22d90 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
22da0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
22db0 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
22dc0 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
22dd0 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
22de0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
22df0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
22e00 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
22e10 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29   TK_ASTERISK, 0)
22e20 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
22e30 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
22e40 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
22e50 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
22e60 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
22e70 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
22e80 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
22e90 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e  Prior = 0;.  p->
22ea0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  pNext = 0;.  p->
22eb0 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  pWith = 0;.  p->
22ec0 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
22ed0 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65  Compound;.  asse
22ee0 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
22ef0 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29   & SF_Converted)
22f00 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46  ==0 );.  p->selF
22f10 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65  lags |= SF_Conve
22f20 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  rted;.  assert( 
22f30 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
22f40 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
22f50 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
22f60 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
22f70 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  = 0;.  pNew->pOf
22f80 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  fset = 0;.  retu
22f90 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
22fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
22fb0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52  to see if the FR
22fc0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
22fd0 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76  From has table-v
22fe0 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a  alued function.*
22ff0 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66  * arguments.  If
23000 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20   it does, leave 
23010 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
23020 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
23030 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
23040 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69  o, since pFrom i
23050 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
23060 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75   be a table-valu
23070 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed function..*/.
23080 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f  static int canno
23090 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  tBeFunction(Pars
230a0 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
230b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
230c0 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
230d0 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  rom->fg.isTabFun
230e0 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
230f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23100 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20   "'%s' is not a 
23110 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d  function", pFrom
23120 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
23130 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
23140 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
23150 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
23160 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  TE./*.** Argumen
23170 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d  t pWith (which m
23180 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e  ay be NULL) poin
23190 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c  ts to a linked l
231a0 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a  ist of nested .*
231b0 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c  * WITH contexts,
231c0 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f   from inner to o
231d0 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65  utermost. If the
231e0 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
231f0 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c  d by .** FROM cl
23200 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74  ause element pIt
23210 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63  em is really a c
23220 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72  ommon-table-expr
23230 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a  ession (CTE) .**
23240 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
23250 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54  ointer to the CT
23260 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  E definition for
23270 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68   that table. Oth
23280 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e  erwise.** return
23290 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
232a0 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
232b0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65   is returned, se
232c0 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20  t *ppContext to 
232d0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74  point to the Wit
232e0 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  h.** object that
232f0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54   the returned CT
23300 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f  E belongs to..*/
23310 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43  .static struct C
23320 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a  te *searchWith(.
23330 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e    /* Current inn
23360 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  ermost WITH clau
23370 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
23380 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
23390 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  em,     /* FROM 
233a0 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74  clause element t
233b0 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57  o resolve */.  W
233c0 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20  ith **ppContext 
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
233e0 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75  * OUT: WITH clau
233f0 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  se return value 
23400 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b  belongs to */.){
23410 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23420 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65  Name;.  if( pIte
23430 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
23440 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65  && (zName = pIte
23450 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  m->zName)!=0 ){.
23460 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20      With *p;.   
23470 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b   for(p=pWith; p;
23480 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20   p=p->pOuter){. 
23490 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
234a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
234b0 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
234c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
234d0 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d  trICmp(zName, p-
234e0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
234f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  ){.          *pp
23500 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20  Context = p;.   
23510 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70         return &p
23520 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
23530 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
23540 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
23550 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67  }../* The code g
23560 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69  enerator maintai
23570 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63  ns a stack of ac
23580 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65  tive WITH clause
23590 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  s.** with the in
235a0 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c  ner-most WITH cl
235b0 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68  ause being at th
235c0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
235d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
235e0 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68  outine pushes th
235f0 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61  e WITH clause pa
23600 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
23610 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f  nd argument.** o
23620 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74  nto the top of t
23630 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67  he stack. If arg
23640 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74  ument bFree is t
23650 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  rue, then this.*
23660 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69  * WITH clause wi
23670 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70  ll never be popp
23680 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
23690 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
236a0 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  it.** should be 
236b0 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  freed along with
236c0 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
236d0 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65  t. In other case
236e0 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65  s, when.** bFree
236f0 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62  ==0, the With ob
23700 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65  ject will be fre
23710 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
23720 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61  e SELECT .** sta
23730 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63  tement with whic
23740 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74  h it is associat
23750 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
23760 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73  te3WithPush(Pars
23770 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20  e *pParse, With 
23780 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65  *pWith, u8 bFree
23790 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72  ){.  assert( bFr
237a0 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65  ee==0 || (pParse
237b0 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50  ->pWith==0 && pP
237c0 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
237d0 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  e==0) );.  if( p
237e0 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65  With ){.    asse
237f0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
23800 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h!=pWith );.    
23810 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20  pWith->pOuter = 
23820 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
23830 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
23840 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
23850 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65  ( bFree ) pParse
23860 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20  ->pWithToFree = 
23870 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pWith;.  }.}../*
23880 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23890 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
238a0 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
238b0 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
238c0 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
238d0 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
238e0 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
238f0 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
23900 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
23910 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
23920 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
23930 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
23940 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
23950 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
23960 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
23970 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
23980 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
23990 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
239a0 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
239b0 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
239c0 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
239d0 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
239e0 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
239f0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
23a00 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
23a10 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
23a20 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
23a30 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
23a40 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
23a50 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
23a60 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
23a70 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
23a80 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
23a90 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
23aa0 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
23ab0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
23ac0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
23ad0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
23ae0 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
23af0 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
23b00 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
23b10 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
23b20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
23b30 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
23b40 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
23b50 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23b60 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
23b70 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
23b80 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
23b90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23ba0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
23bb0 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23bd0 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
23be0 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
23bf0 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
23c00 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
23c10 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
23c20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
23c30 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
23c40 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
23c50 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
23c60 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
23c70 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
23c80 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
23c90 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
23ca0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
23cb0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
23cc0 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
23cd0 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
23ce0 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
23cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
23d00 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
23d10 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
23d20 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
23d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23d40 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
23d50 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
23d60 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
23d70 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
23d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23d90 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
23da0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
23db0 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
23dc0 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d  >zCteErr is non-
23dd0 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
23de0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
23df0 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
23e00 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
23e10 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
23e20 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
23e30 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
23e40 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
23e50 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
23e60 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  CteErr is NULL, 
23e70 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
23e80 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
23e90 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
23ea0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
23eb0 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
23ec0 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  ( pCte->zCteErr 
23ed0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23ee0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23ef0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20   pCte->zCteErr, 
23f00 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
23f10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23f20 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
23f30 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46     if( cannotBeF
23f40 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
23f50 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
23f60 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
23f70 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
23f80 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
23f90 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
23fa0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
23fb0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
23fc0 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
23fd0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
23fe0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
23ff0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66  ;.    pTab->nRef
24000 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
24010 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
24020 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
24030 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
24040 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
24050 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
24060 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
24070 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
24080 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
24090 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
240a0 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
240b0 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73  meral | TF_NoVis
240c0 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70  ibleRowid;.    p
240d0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
240e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
240f0 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
24100 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
24110 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24120 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
24130 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
24140 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
24150 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
24160 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
24170 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
24180 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
24190 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
241a0 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
241b0 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
241c0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
241d0 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
241e0 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
241f0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
24200 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
24210 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
24220 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
24230 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
24240 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
24250 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
24260 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
24270 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
24280 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
24290 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
242a0 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
242b0 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
242c0 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
242d0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
242e0 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
242f0 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
24300 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
24310 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
24320 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
24330 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
24340 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b  isRecursive = 1;
24350 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d  .          pTab-
24360 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
24370 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67     pSel->selFlag
24380 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76  s |= SF_Recursiv
24390 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
243a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
243b0 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75  /* Only one recu
243c0 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
243d0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f  is permitted. */
243e0 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e   .    if( pTab->
243f0 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20  nRef>2 ){.      
24400 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24410 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
24420 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66  e, "multiple ref
24430 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72  erences to recur
24440 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c  sive table: %s",
24450 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pCte->zName.   
24460 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75     );.      retu
24470 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
24480 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
24490 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31  t( pTab->nRef==1
244a0 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46   || ((pSel->selF
244b0 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76  lags&SF_Recursiv
244c0 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52 65 66  e) && pTab->nRef
244d0 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74  ==2 ));..    pCt
244e0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69  e->zCteErr = "ci
244f0 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65  rcular reference
24500 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65  : %s";.    pSave
24510 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e  dWith = pParse->
24520 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
24530 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
24540 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
24550 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
24560 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f   bMayRecursive ?
24570 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20   pSel->pPrior : 
24580 70 53 65 6c 29 3b 0a 20 20 20 20 70 50 61 72 73  pSel);.    pPars
24590 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
245a0 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74  ;..    for(pLeft
245b0 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50  =pSel; pLeft->pP
245c0 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66  rior; pLeft=pLef
245d0 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  t->pPrior);.    
245e0 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e  pEList = pLeft->
245f0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
24600 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20  pCte->pCols ){. 
24610 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20       if( pEList 
24620 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
24630 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  !=pCte->pCols->n
24640 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
24650 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24660 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
24670 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20  s has %d values 
24680 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
24690 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74  .            pCt
246a0 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74  e->zName, pEList
246b0 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70  ->nExpr, pCte->p
246c0 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20  Cols->nExpr.    
246d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
246e0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
246f0 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20  SavedWith;.     
24700 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24710 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
24720 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
24730 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20  Cte->pCols;.    
24740 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  }..    sqlite3Co
24750 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
24760 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
24770 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
24780 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
24790 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
247a0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
247b0 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
247c0 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
247d0 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
247e0 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70  CteErr = "multip
247f0 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  le recursive ref
24800 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20  erences: %s";.  
24810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24820 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
24830 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65   = "recursive re
24840 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62  ference in a sub
24850 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20  query: %s";.    
24860 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
24870 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
24880 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
24890 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  }.    pCte->zCte
248a0 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Err = 0;.    pPa
248b0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
248c0 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20  vedWith;.  }..  
248d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
248e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
248f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24900 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CTE./*.** If the
24910 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61   SELECT passed a
24920 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
24930 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73  ument has an ass
24940 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a  ociated WITH .**
24950 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20   clause, pop it 
24960 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73  from the stack s
24970 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
24980 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
24990 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
249a0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
249b0 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  s the xSelectCal
249c0 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63  lback2() callbac
249d0 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53  k by.** sqlite3S
249e0 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68  electExpand() wh
249f0 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c  en walking a SEL
24a00 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f  ECT tree to reso
24a10 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  lve table.** nam
24a20 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f  es and other FRO
24a30 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
24a40 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
24a50 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  id selectPopWith
24a60 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
24a70 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
24a80 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
24a90 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
24aa0 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d  .  With *pWith =
24ab0 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
24ac0 29 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66 28 20  )->pWith;.  if( 
24ad0 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20  pWith!=0 ){.    
24ae0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
24af0 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a  pWith==pWith );.
24b00 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
24b10 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65  h = pWith->pOute
24b20 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  r;.  }.}.#else.#
24b30 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70  define selectPop
24b40 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  With 0.#endif../
24b50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24b60 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61  e is a Walker ca
24b70 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61  llback for "expa
24b80 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20  nding" a SELECT 
24b90 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45  statement..** "E
24ba0 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20  xpanding" means 
24bb0 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  to do the follow
24bc0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ing:.**.**    (1
24bd0 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
24be0 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
24bf0 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
24c00 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
24c10 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
24c20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
24c30 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
24c40 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
24c50 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
24c60 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
24c70 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
24c80 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
24c90 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
24ca0 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
24cb0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
24cc0 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
24cd0 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
24ce0 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
24cf0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
24d00 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
24d10 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
24d20 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
24d30 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
24d40 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
24d50 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
24d60 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
24d70 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
24d80 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
24d90 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
24da0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
24db0 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
24dc0 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
24dd0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 72  the persistent r
24de0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
24df0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
24e00 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
24e10 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
24e20 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
24e30 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65  e to accommodate
24e40 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
24e50 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
24e60 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
24e70 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
24e80 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
24e90 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
24ea0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
24eb0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
24ec0 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
24ed0 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
24ee0 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
24ef0 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
24f00 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
24f10 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
24f20 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
24f30 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
24f40 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
24f50 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
24f60 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
24f70 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
24f80 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
24f90 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a  in TABLE..**.*/.
24fa0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
24fb0 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72  tExpander(Walker
24fc0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
24fd0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
24fe0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
24ff0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
25000 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69  i, j, k;.  SrcLi
25010 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
25020 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
25030 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
25040 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
25050 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
25060 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
25070 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c  pr *pE, *pRight,
25080 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73   *pExpr;.  u16 s
25090 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
250a0 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c  Flags;..  p->sel
250b0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61  Flags |= SF_Expa
250c0 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e  nded;.  if( db->
250d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b  mallocFailed  ){
250e0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
250f0 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Abort;.  }.  if(
25100 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d   NEVER(p->pSrc==
25110 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20  0) || (selFlags 
25120 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
25130 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
25140 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
25150 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
25160 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
25170 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
25180 20 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63   pWalker->xSelec
25190 74 43 61 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c 65  tCallback2==sele
251a0 63 74 50 6f 70 57 69 74 68 20 29 7b 0a 20 20 20  ctPopWith ){.   
251b0 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
251c0 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67  (pParse, findRig
251d0 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
251e0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
251f0 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
25200 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
25210 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
25220 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
25230 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
25240 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
25250 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
25260 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
25270 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
25280 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
25290 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
252a0 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
252b0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
252c0 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
252d0 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
252e0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
252f0 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
25300 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
25310 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
25320 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
25330 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
25340 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
25350 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
25360 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
25370 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
25380 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
25390 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
253a0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
253b0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
253c0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
253d0 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
253e0 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54  ==0 || pFrom->pT
253f0 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
25400 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
25410 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75  ursive ) continu
25420 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
25430 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
25440 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25450 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28  OMIT_CTE.    if(
25460 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c   withExpand(pWal
25470 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  ker, pFrom) ) re
25480 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25490 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
254a0 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65  Tab ) {} else.#e
254b0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72  ndif.    if( pFr
254c0 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
254d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
254e0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
254f0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
25500 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
25510 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  ;.      /* A sub
25520 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
25530 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
25540 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
25550 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29  ssert( pSel!=0 )
25560 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25570 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
25580 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
25590 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
255a0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72  alker, pSel) ) r
255b0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
255c0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
255d0 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
255e0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
255f0 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
25600 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
25610 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
25620 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
25630 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
25640 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
25650 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
25660 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  tf(db, "sqlite_s
25670 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54  q_%p", (void*)pT
25680 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ab);.      while
25690 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
256a0 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  { pSel = pSel->p
256b0 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73  Prior; }.      s
256c0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
256d0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
256e0 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26  , pSel->pEList,&
256f0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62  pTab->nCol,&pTab
25700 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70  ->aCol);.      p
25710 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
25720 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  .      pTab->nRo
25730 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
25740 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
25750 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
25760 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  6) );.      pTab
25770 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
25780 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64  _Ephemeral;.#end
25790 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
257a0 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
257b0 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
257c0 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
257d0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
257e0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
257f0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
25800 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
25810 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
25820 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
25830 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b  arse, 0, pFrom);
25840 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
25850 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
25860 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28  Abort;.      if(
25870 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66   pTab->nRef==0xf
25880 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
25890 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
258a0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
258b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
258c0 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
258d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
258e0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
258f0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
25900 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
25910 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
25920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
25930 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  b->nRef++;.     
25940 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
25950 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42  pTab) && cannotB
25960 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  eFunction(pParse
25970 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
25980 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
25990 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69  bort;.      }.#i
259a0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
259b0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
259c0 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
259d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
259e0 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73  LE).      if( Is
259f0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
25a00 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
25a10 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43  {.        i16 nC
25a20 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ol;.        if( 
25a30 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
25a40 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
25a50 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
25a60 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25a70 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
25a80 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
25a90 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
25aa0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
25ab0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
25ac0 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
25ad0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25ae0 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
25af0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70  From->pSelect, p
25b00 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
25b10 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62       nCol = pTab
25b20 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
25b30 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  pTab->nCol = -1;
25b40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25b50 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
25b60 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  er, pFrom->pSele
25b70 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  ct);.        pTa
25b80 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  b->nCol = nCol;.
25b90 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
25ba0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63     }..    /* Loc
25bb0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ate the index na
25bc0 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58  med by the INDEX
25bd0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66  ED BY clause, if
25be0 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
25bf0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
25c00 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  yLookup(pParse, 
25c10 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
25c20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
25c30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
25c40 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
25c50 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
25c60 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
25c70 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
25c80 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
25c90 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71  llocFailed || sq
25ca0 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
25cb0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
25cc0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
25cd0 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  rt;.  }..  /* Fo
25ce0 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
25cf0 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
25d00 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
25d10 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
25d20 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
25d30 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
25d40 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
25d50 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
25d60 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
25d70 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
25d80 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
25d90 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
25da0 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
25db0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
25dc0 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74  _ASTERISK operat
25dd0 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
25de0 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
25df0 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a   the column.  **
25e00 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c   list.  The foll
25e10 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
25e20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
25e30 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20  e TK_ASTERISK.  
25e40 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
25e50 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f  nd expand each o
25e60 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
25e70 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
25e80 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73  .  ** all tables
25e90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
25ea0 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
25eb0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
25ec0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
25ed0 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
25ee0 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
25ef0 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
25f00 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
25f10 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
25f20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61    pE = pEList->a
25f30 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
25f40 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  f( pE->op==TK_AS
25f50 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a  TERISK ) break;.
25f60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
25f70 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
25f80 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
25f90 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
25fa0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45  p!=TK_DOT || (pE
25fb0 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45  ->pLeft!=0 && pE
25fc0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
25fd0 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ID) );.    if( p
25fe0 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
25ff0 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
26000 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62  =TK_ASTERISK ) b
26010 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
26020 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
26030 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
26040 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
26050 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
26060 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
26070 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
26080 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
26090 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
260a0 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
260b0 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
260c0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
260d0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
260e0 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
260f0 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
26100 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
26110 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
26120 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
26130 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
26140 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
26150 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
26160 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
26170 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
26180 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
26190 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261b0 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
261c0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
261d0 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
261e0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
261f0 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
26200 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
26210 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69  pExpr;.      pRi
26220 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
26230 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26240 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
26250 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
26260 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
26270 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20  =TK_ASTERISK.   
26280 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d      && (pE->op!=
26290 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
262a0 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53  ->op!=TK_ASTERIS
262b0 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  K).      ){.    
262c0 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
262d0 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
262e0 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
262f0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
26300 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26310 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
26320 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
26330 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
26340 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
26350 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
26360 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
26370 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
26380 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
26390 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
263a0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
263b0 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
263c0 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
263d0 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
263e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
263f0 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
26400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
26410 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
26420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26430 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
26440 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
26450 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
26460 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
26470 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
26480 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
26490 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
264a0 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
264b0 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
264c0 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
264d0 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
264e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74  0;       /* text
264f0 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
26500 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
26510 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
26520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
26530 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
26540 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
26550 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
26560 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
26570 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
26580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
26590 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
265a0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
265b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
265c0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
265d0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
265e0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
265f0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
26600 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
26610 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
26620 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
26630 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSub = pFrom->p
26640 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
26650 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
26660 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
26670 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
26680 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e  t char *zSchemaN
26690 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
266a0 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
266b0 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
266c0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
266d0 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
266e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
266f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26700 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
26710 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
26720 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
26730 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d  Sub==0 || (pSub-
26740 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
26750 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b  estedFrom)==0 ){
26760 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75  .            pSu
26770 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  b = 0;.         
26780 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
26790 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
267a0 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
267b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
267c0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
267d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
267e0 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
267f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
26800 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
26810 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
26820 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
26830 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
26840 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a  aDb[iDb].zName :
26850 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "*";.          
26860 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  }.          for(
26870 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
26880 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
26890 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
268a0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
268b0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
268c0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
268d0 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
268e0 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
268f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26900 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
26910 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
26920 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
26930 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
26940 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
26950 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
26960 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
26970 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
26980 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
26990 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20  sert( zName );. 
269a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
269b0 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20  TName && pSub.  
269c0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
269d0 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
269e0 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  me(pSub->pEList-
269f0 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20  >a[j].zSpan, 0, 
26a00 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20  zTName, 0)==0.  
26a10 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
26a20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
26a30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
26a40 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
26a50 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
26a60 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
26a70 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72  den', omit it fr
26a80 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  om the expanded.
26a90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
26aa0 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75  esult-set list u
26ab0 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43 54  nless the SELECT
26ac0 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c   has the SF_Incl
26ad0 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20  udeHidden.      
26ae0 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74        ** bit set
26af0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
26b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26b10 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
26b20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
26b30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
26b40 20 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c    && IsHiddenCol
26b50 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
26b60 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  j]) .           
26b70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26b80 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26b90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26ba0 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
26bb0 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
26bc0 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
26bd0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
26be0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
26bf0 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om->fg.jointype 
26c00 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
26c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26c20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75   && tableAndColu
26c30 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
26c40 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30  , i, zName, 0, 0
26c50 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
26c60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26c70 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
26c80 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
26c90 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
26ca0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
26cb0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
26cc0 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  e to the right o
26cd0 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
26cf0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
26d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26d10 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26d20 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72  3IdListIndex(pFr
26d30 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  om->pUsing, zNam
26d40 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
26d50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
26d60 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
26d70 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
26d80 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
26da0 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
26db0 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
26dc0 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
26de0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
26df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26e10 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
26e20 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
26e30 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
26e40 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
26e50 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
26e60 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
26e70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
26e80 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
26e90 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
26ea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26eb0 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
26ed0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
26ee0 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
26ef0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
26f00 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
26f10 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
26f20 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
26f30 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
26f40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
26f50 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
26f60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
26f70 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
26f80 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
26f90 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
26fa0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
26fb0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
26fc0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
26fd0 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b  Left, pExpr, 0);
26fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
27000 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27020 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
27030 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
27040 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
27050 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
27060 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
27070 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
27080 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27090 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
270b0 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
270c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
270d0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
270e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
270f0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
27100 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
27110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f         sqlite3To
27120 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d  kenInit(&sColnam
27130 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
27140 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27150 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
27160 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
27170 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
27180 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
27190 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
271a0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
271b0 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
271c0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
271d0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
271e0 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
271f0 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
27200 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
27210 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
27220 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
27230 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
27240 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
27250 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
27260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27270 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
27280 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
27290 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
272c0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
272d0 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
272e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27300 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
27310 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
27320 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
27330 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27340 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
27350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27360 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
27370 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
27380 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
27390 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
273a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
273b0 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
273c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
273d0 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
273e0 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
273f0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
27400 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
27410 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27420 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
27430 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
27440 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
27450 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27460 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
27470 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
27480 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
27490 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
274a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
274b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
274c0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
274d0 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
274e0 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
274f0 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
27500 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
27510 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
27520 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
27530 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
27540 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
27550 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
27560 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27570 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
27580 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
27590 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
275a0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64  _Abort;.  }.#end
275b0 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  if.  return WRC_
275c0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
275d0 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
275e0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
275f0 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
27600 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
27610 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
27620 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
27630 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
27640 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
27650 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
27660 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
27670 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
27680 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
27690 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
276a0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
276b0 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
276c0 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
276d0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
276e0 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
276f0 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
27700 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
27710 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
27720 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
27730 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
27740 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
27750 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
27760 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
27770 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
27780 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
27790 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
277a0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
277b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
277c0 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
277d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
277e0 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
277f0 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
27800 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
27810 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
27820 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
27830 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
27840 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
27850 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
27860 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
27870 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
27880 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
27890 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
278a0 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
278b0 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
278c0 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
278d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
278e0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
278f0 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
27900 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
27910 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
27920 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
27930 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
27940 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
27950 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
27960 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
27970 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
27980 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
27990 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
279a0 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
279b0 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
279c0 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
279d0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
279e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
279f0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
27a00 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
27a10 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
27a20 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
27a30 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
27a40 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
27a50 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
27a60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
27a70 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
27a80 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
27a90 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f  f( pParse->hasCo
27aa0 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e  mpound ){.    w.
27ab0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
27ac0 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  = convertCompoun
27ad0 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
27ae0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  y;.    sqlite3Wa
27af0 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
27b00 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78  lect);.  }.  w.x
27b10 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
27b20 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b   selectExpander;
27b30 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63 74 2d  .  if( (pSelect-
27b40 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
27b50 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b  ultiValue)==0 ){
27b60 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
27b70 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
27b80 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73  PopWith;.  }.  s
27b90 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
27ba0 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
27bb0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
27bc0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
27bd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
27be0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
27bf0 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
27c00 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
27c10 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
27c20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
27c30 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
27c40 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
27c50 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
27c60 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
27c70 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
27c80 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
27c90 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
27ca0 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
27cb0 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
27cc0 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
27cd0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
27ce0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
27cf0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
27d00 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
27d10 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
27d20 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
27d30 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
27d40 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
27d50 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
27d60 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
27d70 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
27d80 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
27d90 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
27da0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
27db0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
27dc0 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
27dd0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
27de0 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
27df0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
27e00 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
27e10 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
27e20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
27e30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
27e40 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
27e50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
27e60 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
27e70 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
27e80 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
27e90 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
27ea0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
27eb0 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
27ec0 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
27ed0 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
27ee0 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
27ef0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
27f00 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
27f10 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
27f20 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
27f30 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
27f40 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
27f50 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
27f60 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
27f70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
27f80 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
27f90 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
27fa0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
27fb0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
27fc0 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
27fd0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
27fe0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
27ff0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
28000 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
28010 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
28020 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
28030 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
28040 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
28050 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
28060 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
28070 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
28080 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
28090 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
280a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
280b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
280c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
280d0 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
280e0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
280f0 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
28100 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
28110 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
28120 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
28130 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
28140 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28150 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
28160 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
28170 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
28180 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28190 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
281a0 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
281b0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
281c0 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
281d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
281e0 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
281f0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
28200 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
28210 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
28220 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ck2 = selectAddS
28230 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
28240 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
28250 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
28260 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
28270 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
28280 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
28290 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
282a0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
282b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
282c0 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20  ets up a SELECT 
282d0 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
282e0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a  ocessing.  The.*
282f0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  * following is a
28300 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a  ccomplished:.**.
28310 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43  **     *  VDBE C
28320 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
28330 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  e assigned to al
28340 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  l FROM-clause te
28350 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45  rms..**     *  E
28360 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
28370 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
28380 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d  ed for all FROM-
28390 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
283a0 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20  s..**     *  ON 
283b0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
283c0 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e  s are shifted in
283d0 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65  to WHERE stateme
283e0 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69  nts.**     *  Wi
283f0 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20  ldcards "*" and 
28400 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73  "TABLE.*" in res
28410 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70  ult sets are exp
28420 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  anded..**     * 
28430 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
28440 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d  expression are m
28450 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73  atched to tables
28460 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
28470 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73  tine acts recurs
28480 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62  ively on all sub
28490 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74  queries within t
284a0 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
284b0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
284c0 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Prep(.  Parse *p
284d0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
284e0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
284f0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
28500 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
28510 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
28520 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
28530 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
28540 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
28550 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
28560 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20  t for container 
28570 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
28580 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  *db;.  if( NEVER
28590 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
285a0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
285b0 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  db;.  if( db->ma
285c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
285d0 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
285e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
285f0 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
28600 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
28610 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
28620 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
28630 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
28640 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
28650 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
28660 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
28670 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
28680 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
28690 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
286a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
286b0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
286c0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
286d0 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
286e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
286f0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
28700 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
28710 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
28720 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
28730 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
28740 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
28750 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
28760 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
28770 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
28780 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
28790 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
287a0 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
287b0 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
287c0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
287d0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
287e0 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
287f0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
28800 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
28810 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
28820 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
28830 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
28840 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
28850 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
28860 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
28870 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
28880 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
28890 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
288a0 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
288b0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
288c0 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
288d0 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
288e0 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
288f0 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
28900 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
28910 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
28920 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
28930 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
28940 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
28950 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
28960 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
28970 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
28980 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
28990 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
289a0 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
289b0 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
289c0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
289d0 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
289e0 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
289f0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
28a00 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
28a10 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
28a20 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
28a30 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
28a40 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
28a50 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
28a60 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
28a70 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
28a80 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
28a90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28aa0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
28ab0 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
28ac0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
28ad0 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
28ae0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
28af0 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
28b00 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
28b10 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
28b20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
28b30 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
28b40 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
28b50 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
28b60 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
28b70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
28b80 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
28b90 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
28ba0 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
28bb0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
28bc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
28bd0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
28be0 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
28bf0 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
28c00 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
28c10 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
28c20 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
28c30 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
28c40 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
28c50 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
28c60 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
28c70 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
28c80 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
28c90 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ist, 0, 0);.    
28ca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28cb0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
28cc0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
28cd0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
28ce0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
28d00 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
28d10 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
28d20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
28d30 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
28d40 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
28d50 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
28d60 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
28d70 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
28d80 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
28d90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28da0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
28db0 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
28dc0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
28dd0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
28de0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
28df0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
28e00 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
28e10 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
28e20 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
28e30 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
28e40 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
28e50 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
28e60 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
28e70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
28e80 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
28e90 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
28ea0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
28eb0 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
28ec0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
28ed0 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
28ee0 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
28ef0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
28f00 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
28f10 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
28f20 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
28f30 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
28f40 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
28f50 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
28f60 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
28f70 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
28f80 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
28f90 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
28fa0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
28fb0 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
28fc0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
28fd0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
28fe0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
28ff0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
29000 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
29010 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20  nt regHit = 0;. 
29020 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74   int addrHitTest
29030 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41   = 0;.  struct A
29040 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
29050 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
29060 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
29070 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
29080 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
29090 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
290a0 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
290b0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
290c0 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
290d0 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
290e0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
290f0 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
29100 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
29110 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
29120 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
29130 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
29140 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
29150 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
29160 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
29170 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
29180 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
29190 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47  egAgg = sqlite3G
291a0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
291b0 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20  se, nArg);.     
291c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
291d0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
291e0 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20   pList, regAgg, 
291f0 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44  0, SQLITE_ECEL_D
29200 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UP);.    }else{.
29210 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
29220 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
29230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29240 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
29250 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
29260 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
29270 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
29280 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
29290 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72  rg==0 );  /* Err
292a0 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  or condition */.
292b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
292c0 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41  nArg>1 );   /* A
292d0 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  lso an error */.
292e0 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
292f0 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
29300 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
29310 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
29320 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
29330 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
29340 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
29350 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
29360 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
29370 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
29380 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
29390 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
293a0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
293b0 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
293c0 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
293d0 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
293e0 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
293f0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
29400 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
29410 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
29420 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
29430 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
29440 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
29450 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
29460 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
29470 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
29480 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
29490 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
294a0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
294b0 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74        if( regHit
294c0 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
294d0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20  >nAccumulator ) 
294e0 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73  regHit = ++pPars
294f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
29500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
29510 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
29520 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63  regHit, 0, 0, (c
29530 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
29540 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
29550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
29560 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp4(v, OP_AggS
29570 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67 67 2c  tep0, 0, regAgg,
29580 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295a0 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
295b0 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
295c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
295d0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
295e0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
295f0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
29600 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
29610 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
29620 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
29630 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
29640 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
29650 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
29660 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
29670 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
29680 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
29690 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
296a0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
296b0 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
296c0 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70  }..  /* Before p
296d0 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63  opulating the ac
296e0 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
296f0 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ers, clear the c
29700 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
29710 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
29720 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69  any of the requi
29730 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  red column value
29740 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72  s are already pr
29750 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72  esent .  ** in r
29760 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65  egisters, sqlite
29770 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20  3ExprCode() may 
29780 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  use OP_SCopy to 
29790 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20  copy the value. 
297a0 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e   ** to pC->iMem.
297b0 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65   But by the time
297c0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73   the value is us
297d0 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
297e0 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d   register.  ** m
297f0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65  ay have been use
29800 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  d, invalidating 
29810 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
29820 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  uffer holding th
29830 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62  e.  ** text or b
29840 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74  lob value. See t
29850 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62  icket [883034dcb
29860 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  5]..  **.  ** An
29870 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77  other solution w
29880 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67  ould be to chang
29890 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75  e the OP_SCopy u
298a0 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68  sed to copy cach
298b0 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74  ed.  ** values t
298c0 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20  o an OP_Copy..  
298d0 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20  */.  if( regHit 
298e0 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
298f0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
29900 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
29910 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f   regHit); VdbeCo
29920 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
29930 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
29940 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
29950 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
29960 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
29970 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
29980 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
29990 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
299a0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
299b0 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
299c0 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
299d0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
299e0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
299f0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
29a00 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64  arse);.  if( add
29a10 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20  rHitTest ){.    
29a20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
29a30 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65  ere(v, addrHitTe
29a40 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
29a50 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f  * Add a single O
29a60 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
29a70 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42  ction to the VDB
29a80 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73  E to explain a s
29a90 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a  imple.** count(*
29aa0 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54  ) query ("SELECT
29ab0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
29ac0 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  Tab")..*/.#ifnde
29ad0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
29ae0 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69  PLAIN.static voi
29af0 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  d explainSimpleC
29b00 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  ount(.  Parse *p
29b10 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
29b20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
29b30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
29b40 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
29b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29b60 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
29b70 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ried */.  Index 
29b80 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
29b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29ba0 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  ex used to optim
29bb0 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c  ize scan, or NUL
29bc0 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  L */.){.  if( pP
29bd0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
29be0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76   ){.    int bCov
29bf0 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26  er = (pIdx!=0 &&
29c00 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
29c10 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65   || !IsPrimaryKe
29c20 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a  yIndex(pIdx)));.
29c30 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
29c40 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
29c50 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
29c60 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c  N TABLE %s%s%s",
29c70 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
29c80 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43  Name,.        bC
29c90 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43  over ? " USING C
29ca0 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20  OVERING INDEX " 
29cb0 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43  : "",.        bC
29cc0 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61  over ? pIdx->zNa
29cd0 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20  me : "".    );. 
29ce0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29cf0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70 50  dOp4(.        pP
29d00 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
29d10 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
29d20 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
29d30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d  , zEqp, P4_DYNAM
29d40 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  IC.    );.  }.}.
29d50 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
29d60 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
29d70 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  t(a,b,c).#endif.
29d80 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
29d90 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
29da0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
29db0 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
29dc0 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
29dd0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72  he results are r
29de0 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e  eturned accordin
29df0 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44  g to the SelectD
29e00 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
29e10 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69  * See comments i
29e20 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f  n sqliteInt.h fo
29e30 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d  r further inform
29e40 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
29e50 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
29e60 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
29e70 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
29e80 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
29e90 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
29ea0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
29eb0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
29ec0 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
29ed0 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
29ee0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
29ef0 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
29f00 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
29f10 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
29f20 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
29f30 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
29f40 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
29f50 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
29f60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
29f70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
29f80 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
29f90 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
29fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29fb0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29fc0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
29fd0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
29fe0 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
29ff0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
2a000 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
2a010 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a030 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2a040 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
2a050 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
2a060 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
2a070 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
2a080 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
2a090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a0a0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
2a0b0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
2a0c0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
2a0d0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
2a0e0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
2a0f0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
2a100 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
2a110 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
2a120 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20   0;  /* List of 
2a130 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
2a140 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
2a150 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
2a160 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
2a170 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
2a180 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
2a190 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
2a1a0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2a1b0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2a1c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
2a1d0 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
2a1e0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
2a1f0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2a200 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
2a210 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
2a220 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
2a230 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2a240 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
2a250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
2a260 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
2a270 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
2a280 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
2a290 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20  x sDistinct; /* 
2a2a0 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2a2b0 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ode the DISTINCT
2a2c0 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f   keyword */.  So
2a2d0 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20  rtCtx sSort;    
2a2e0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20       /* Info on 
2a2f0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2a300 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2a310 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
2a320 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
2a330 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
2a340 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
2a350 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
2a360 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
2a370 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
2a380 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
2a390 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
2a3a0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2a3b0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
2a3c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23  connection */..#
2a3d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a3e0 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
2a3f0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2a400 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
2a410 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d  ectId;.  pParse-
2a420 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  >iSelectId = pPa
2a430 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2a440 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Id++;.#endif..  
2a450 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2a460 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
2a470 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a480 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
2a490 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
2a4a0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2a4b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
2a4c0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
2a4d0 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
2a4e0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
2a4f0 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
2a500 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
2a510 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2a520 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72  E_ENABLED.  pPar
2a530 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
2a540 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  t++;.  SELECTTRA
2a550 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
2a560 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
2a570 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73  g:\n"));.  if( s
2a580 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2a590 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2a5a0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2a5b0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2a5c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
2a5d0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2a5e0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2a5f0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
2a600 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2a610 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2a620 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2a630 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
2a640 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2a650 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2a660 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
2a670 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
2a680 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2a690 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2a6a0 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
2a6b0 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
2a6c0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2a6d0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
2a6e0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
2a6f0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
2a700 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
2a710 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
2a720 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a730 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
2a740 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
2a750 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
2a760 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2a770 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
2a780 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a790 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
2a7a0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2a7b0 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
2a7c0 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
2a7d0 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
2a7e0 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
2a7f0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
2a800 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
2a810 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
2a820 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
2a830 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
2a840 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
2a850 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
2a860 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2a870 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
2a880 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
2a890 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
2a8a0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
2a8b0 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
2a8c0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
2a8d0 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
2a8e0 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
2a8f0 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
2a900 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2a910 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2a920 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2a930 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61 72  pSrc;.  if( pPar
2a940 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
2a950 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2a960 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2a970 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  end;.  }.  asser
2a980 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
2a990 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  );.  isAgg = (p-
2a9a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2a9b0 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23 69  ggregate)!=0;.#i
2a9c0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2a9d0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2a9e0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2a9f0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
2aa00 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
2aa10 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65  pParse,p, ("afte
2aa20 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
2aa30 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
2aa40 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2aa50 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2aa60 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20 49  .#endif...  /* I
2aa70 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
2aa80 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
2aa90 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
2aaa0 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
2aab0 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
2aac0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
2aad0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2aae0 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f  RY.  if( checkFo
2aaf0 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
2ab00 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
2ab10 70 44 65 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74  pDest, p->pEList
2ab20 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
2ab30 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2ab40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2ab50 2a 20 54 72 79 20 74 6f 20 66 6c 61 74 74 65 6e  * Try to flatten
2ab60 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 74   subqueries in t
2ab70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75  he FROM clause u
2ab80 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  p into the main 
2ab90 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21  query.  */.#if !
2aba0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2abb0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2abc0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2abd0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
2abe0 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
2abf0 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
2ac00 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2ac10 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2ac20 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
2ac30 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
2ac40 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
2ac50 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
2ac60 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53  ;.    int isAggS
2ac70 75 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ub;.    Table *p
2ac80 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
2ac90 62 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  b;.    if( pSub=
2aca0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
2acb0 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73      /* Catch mis
2acc0 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63  match in the dec
2acd0 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66  lared columns of
2ace0 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20   a view and the 
2acf0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
2ad00 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2ad10 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48  SELECT on the RH
2ad20 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61  S */.    if( pTa
2ad30 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70  b->nCol!=pSub->p
2ad40 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
2ad50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2ad60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65  orMsg(pParse, "e
2ad70 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
2ad80 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20  ns for '%s' but 
2ad90 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20  got %d",.       
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2adb0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d  Tab->nCol, pTab-
2adc0 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45  >zName, pSub->pE
2add0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
2ade0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2adf0 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
2ae00 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62  isAggSub = (pSub
2ae10 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2ae20 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
2ae30 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
2ae40 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
2ae50 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67  , i, isAgg, isAg
2ae60 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  gSub) ){.      /
2ae70 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
2ae80 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
2ae90 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
2aea0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
2aeb0 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
2aec0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
2aed0 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
2aee0 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
2aef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2af00 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  i = -1;.    }.  
2af10 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2af20 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62  pSrc;.    if( db
2af30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2af40 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2af50 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
2af60 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
2af70 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  t) ){.      sSor
2af80 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
2af90 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
2afa0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2afb0 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74   Get a pointer t
2afc0 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
2afd0 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f  nstruction, allo
2afe0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 56 44 42  cating a new VDB
2aff0 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f  E if one.  ** do
2b000 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
2b010 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71  xist */.  v = sq
2b020 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
2b030 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
2b040 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2b050 6e 64 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  nd;..#ifndef SQL
2b060 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
2b070 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61  D_SELECT.  /* Ha
2b080 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ndle compound SE
2b090 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
2b0a0 75 73 69 6e 67 20 74 68 65 20 73 65 70 61 72 61  using the separa
2b0b0 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29  te multiSelect()
2b0c0 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e  .  ** procedure.
2b0d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
2b0e0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20  Prior ){.    rc 
2b0f0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  = multiSelect(pP
2b100 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
2b110 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49  .    explainSetI
2b120 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
2b130 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
2b140 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 23 69 66  reSelectId);.#if
2b150 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2b160 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54  BLED.    SELECTT
2b170 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
2b180 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73  ("end compound-s
2b190 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
2b1a0 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50 61 72 73  \n"));.    pPars
2b1b0 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74  e->nSelectIndent
2b1c0 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  --;.#endif.    r
2b1d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2b1e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
2b1f0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
2b200 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
2b210 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
2b220 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
2b230 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
2b240 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
2b250 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2b260 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
2b270 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2b280 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
2b290 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2b2a0 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
2b2b0 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
2b2c0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
2b2d0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
2b2e0 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
2b2f0 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  t;.    if( pSub=
2b300 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
2b310 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73      /* Sometimes
2b320 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
2b330 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65  subquery will be
2b340 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20   generated more 
2b350 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65  than.    ** once
2b360 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  , if the subquer
2b370 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  y is part of the
2b380 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2b390 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20   a LEFT JOIN,.  
2b3a0 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65    ** for example
2b3b0 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
2b3c0 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61   do not regenera
2b3d0 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d  te the code to m
2b3e0 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61  anifest.    ** a
2b3f0 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d   view or the co-
2b400 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65  routine to imple
2b410 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68  ment a view.  Th
2b420 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
2b430 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69  .    ** is suffi
2b440 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68  cient, though th
2b450 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
2b460 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65  manifest the vie
2b470 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20  w does need.    
2b480 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ** to be invoked
2b490 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69   again. */.    i
2b4a0 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  f( pItem->addrFi
2b4b0 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69  llSub ){.      i
2b4c0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61  f( pItem->fg.via
2b4d0 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a  Coroutine==0 ){.
2b4e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b4f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b500 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65  Gosub, pItem->re
2b510 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  gReturn, pItem->
2b520 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20  addrFillSub);.  
2b530 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
2b540 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
2b550 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
2b560 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
2b570 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
2b580 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
2b590 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
2b5a0 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74  referred to by t
2b5b0 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
2b5c0 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
2b5d0 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
2b5e0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
2b5f0 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
2b600 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
2b610 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
2b620 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
2b630 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
2b640 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
2b650 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
2b660 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
2b670 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
2b680 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
2b690 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
2b6a0 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
2b6b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
2b6c0 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
2b6d0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
2b6e0 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  p);..    /* Make
2b6f0 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74   copies of const
2b700 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ant WHERE-clause
2b710 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75   terms in the ou
2b720 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20  ter query down. 
2b730 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65     ** inside the
2b740 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
2b750 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75   can help the su
2b760 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f  bquery to run mo
2b770 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a  re efficiently..
2b780 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
2b790 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
2b7a0 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d  pe & JT_OUTER)==
2b7b0 30 0a 20 20 20 20 20 26 26 20 70 75 73 68 44 6f  0.     && pushDo
2b7c0 77 6e 57 68 65 72 65 54 65 72 6d 73 28 64 62 2c  wnWhereTerms(db,
2b7d0 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65   pSub, p->pWhere
2b7e0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2b7f0 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c  ).    ){.#if SEL
2b800 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2b810 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2b820 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
2b830 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  0x100 ){.       
2b840 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
2b850 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
2b860 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ter WHERE-clause
2b870 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29   push-down:\n"))
2b880 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2b890 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2b8a0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
2b8b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
2b8c0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2b8d0 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
2b8e0 74 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  t the subquery. 
2b8f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2b900 20 73 75 62 71 75 65 72 79 20 69 73 20 69 6d 70   subquery is imp
2b910 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
2b920 2d 72 6f 75 74 69 6e 65 20 69 66 20 61 6c 6c 20  -routine if all 
2b930 6f 66 20 74 68 65 73 65 20 61 72 65 20 74 72 75  of these are tru
2b940 65 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20  e:.    **   (1) 
2b950 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
2b960 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2b970 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  e the outer loop
2b980 20 28 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20   (so that it.   
2b990 20 2a 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20   **        does 
2b9a0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  not need to be c
2b9b0 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61  omputed more tha
2b9c0 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 20 20  n once).    **  
2b9d0 20 28 32 29 20 20 54 68 65 20 41 4c 4c 20 6b 65   (2)  The ALL ke
2b9e0 79 77 6f 72 64 20 61 66 74 65 72 20 53 45 4c 45  yword after SELE
2b9f0 43 54 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  CT is omitted.  
2ba00 28 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 61 72  (Applications ar
2ba10 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
2ba20 61 6c 6c 6f 77 65 64 20 74 6f 20 73 61 79 20 22  allowed to say "
2ba30 53 45 4c 45 43 54 20 41 4c 4c 22 20 69 6e 73 74  SELECT ALL" inst
2ba40 65 61 64 20 6f 66 20 6a 75 73 74 20 22 53 45 4c  ead of just "SEL
2ba50 45 43 54 22 20 74 6f 20 64 69 73 61 62 6c 65 0a  ECT" to disable.
2ba60 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 74 68      **        th
2ba70 65 20 75 73 65 20 6f 66 20 63 6f 2d 72 6f 75 74  e use of co-rout
2ba80 69 6e 65 73 2e 29 0a 20 20 20 20 2a 2a 20 20 20  ines.).    **   
2ba90 28 33 29 20 20 43 6f 2d 72 6f 75 74 69 6e 65 73  (3)  Co-routines
2baa0 20 61 72 65 20 6e 6f 74 20 64 69 73 61 62 6c 65   are not disable
2bab0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
2bac0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 20  test_control(). 
2bad0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 77 69 74     **        wit
2bae0 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  h SQLITE_TESTCTR
2baf0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2e  L_OPTIMIZATIONS.
2bb00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2bb10 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f  ODO: Are there o
2bb20 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73  ther reasons bes
2bb30 69 64 65 20 28 31 29 20 74 6f 20 75 73 65 20 61  ide (1) to use a
2bb40 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20   co-routine.    
2bb50 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2bb60 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n?.    */.    if
2bb70 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  ( i==0.     && (
2bb80 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
2bb90 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  1.            ||
2bba0 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d   (pTabList->a[1]
2bbb0 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54  .fg.jointype&(JT
2bbc0 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
2bbd0 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a  !=0)  /* (1) */.
2bbe0 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46       && (p->selF
2bbf0 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 29 3d 3d  lags & SF_All)==
2bc00 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
2bc30 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2bc40 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2bc50 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
2bc60 6e 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ne)             
2bc70 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
2bc80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c  ){.      /* Impl
2bc90 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69  ement a co-routi
2bca0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74  ne that will ret
2bcb0 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
2bcc0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
2bcd0 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
2bce0 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
2bcf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2bd00 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  nt addrTop = sql
2bd10 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2bd20 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 20  ddr(v)+1;.      
2bd30 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2bd40 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2bd50 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
2bd60 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2bd70 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
2bd80 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2bd90 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
2bda0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2bdb0 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  ((v, "%s", pItem
2bdc0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2bdd0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
2bde0 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72  drFillSub = addr
2bdf0 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Top;.      sqlit
2be00 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
2be10 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
2be20 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
2be30 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2be40 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2be50 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
2be60 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
2be70 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
2be80 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2be90 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
2bea0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
2beb0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
2bec0 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e  wLogEst = pSub->
2bed0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
2bee0 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43    pItem->fg.viaC
2bef0 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20  oroutine = 1;.  
2bf00 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
2bf10 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73  sult = dest.iSds
2bf20 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
2bf30 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
2bf40 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  (v, pItem->regRe
2bf50 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  turn);.      sql
2bf60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2bf70 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
2bf80 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
2bf90 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
2bfa0 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
2bfb0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
2bfc0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
2bfd0 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
2bfe0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
2bff0 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
2c000 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
2c010 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
2c020 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2c030 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
2c040 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
2c050 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
2c060 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
2c070 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
2c080 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
2c090 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
2c0a0 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
2c0b0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
2c0c0 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
2c0d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
2c0e0 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
2c0f0 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
2c100 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
2c110 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
2c120 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
2c130 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
2c140 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2c150 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
2c160 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
2c170 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2c180 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2c190 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
2c1a0 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2c1b0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2c1c0 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
2c1d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2c1e0 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
2c1f0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
2c200 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
2c210 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c  ry is not correl
2c220 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61  ated and if we a
2c230 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66  re not inside of
2c240 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
2c250 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f  igger, then we o
2c260 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70  nly need to comp
2c270 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ute the value of
2c280 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
2c290 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a        ** once. *
2c2a0 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64  /.        onceAd
2c2b0 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
2c2c0 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
2c2d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2c2e0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2c2f0 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
2c300 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
2c310 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2c320 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2c330 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
2c340 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
2c350 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
2c360 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2c370 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
2c380 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2c390 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
2c3a0 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
2c3b0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2c3c0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2c3d0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2c3e0 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2c3f0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2c400 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
2c410 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2c420 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2c430 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
2c440 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2c450 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
2c460 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ow;.      if( on
2c470 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33  ceAddr ) sqlite3
2c480 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2c490 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20  onceAddr);.     
2c4a0 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74   retAddr = sqlit
2c4b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2c4c0 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  OP_Return, pItem
2c4d0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2c4e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c4f0 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49  (v, "end %s", pI
2c500 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2c510 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2c520 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
2c530 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64   topAddr, retAdd
2c540 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
2c550 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2c560 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
2c570 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
2c580 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2c590 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2c5a0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
2c5b0 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
2c5c0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
2c5d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2c5e0 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e  * Various elemen
2c5f0 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
2c600 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63   copied into loc
2c610 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72  al variables for
2c620 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63  .  ** convenienc
2c630 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
2c640 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68  p->pEList;.  pWh
2c650 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
2c660 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
2c670 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
2c680 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
2c690 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69  g;.  sDistinct.i
2c6a0 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  sTnct = (p->selF
2c6b0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2c6c0 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c  ct)!=0;..#if SEL
2c6d0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2c6e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2c6f0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
2c700 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2c710 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2c720 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20  e,p,("After all 
2c730 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c  FROM-clause anal
2c740 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ysis:\n"));.    
2c750 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2c760 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2c770 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2c780 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2c790 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61   DISTINCT with a
2c7a0 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69  n ORDER BY but i
2c7b0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
2c7c0 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66  te, and .  ** if
2c7d0 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   the select-list
2c7e0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2c7f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73  the ORDER BY lis
2c800 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65  t, then this que
2c810 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72  ry.  ** can be r
2c820 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52  ewritten as a GR
2c830 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72  OUP BY. In other
2c840 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20   words, this:.  
2c850 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2c860 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20  CT DISTINCT xyz 
2c870 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42  FROM ... ORDER B
2c880 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
2c890 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
2c8a0 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
2c8b0 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d   SELECT xyz FROM
2c8c0 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79   ... GROUP BY xy
2c8d0 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  z ORDER BY xyz. 
2c8e0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
2c8f0 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66  ond form is pref
2c900 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c  erred as a singl
2c910 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70  e index (or temp
2c920 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a  -table) may be .
2c930 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f    ** used for bo
2c940 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
2c950 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f  and DISTINCT pro
2c960 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67  cessing. As orig
2c970 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69  inally .  ** wri
2c980 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d  tten the query m
2c990 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74  ust use a temp-t
2c9a0 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73  able for at leas
2c9b0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44  t one of the ORD
2c9c0 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20  ER .  ** BY and 
2c9d0 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e  DISTINCT, and an
2c9e0 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61   index or separa
2c9f0 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f  te temp-table fo
2ca00 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a  r the other..  *
2ca10 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
2ca20 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
2ca30 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
2ca40 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
2ca50 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
2ca60 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53  prListCompare(sS
2ca70 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45  ort.pOrderBy, pE
2ca80 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29  List, -1)==0.  )
2ca90 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
2caa0 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
2cab0 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  t;.    pGroupBy 
2cac0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  = p->pGroupBy = 
2cad0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2cae0 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30  up(db, pEList, 0
2caf0 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65  );.    /* Notice
2cb00 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
2cb10 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68  ht SF_Distinct h
2cb20 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20  as been cleared 
2cb30 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  from p->selFlags
2cb40 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69  ,.    ** the sDi
2cb50 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73  stinct.isTnct is
2cb60 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e   still set.  Hen
2cb70 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65  ce, isTnct repre
2cb80 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a  sents the.    **
2cb90 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e   original settin
2cba0 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74  g of the SF_Dist
2cbb0 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74  inct flag, not t
2cbc0 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
2cbd0 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ng */.    assert
2cbe0 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2cbf0 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ct );.  }..  /* 
2cc00 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
2cc10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2cc20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65  then create an e
2cc30 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
2cc40 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f  o.  ** do the so
2cc50 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73  rting.  But this
2cc60 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72   sorting ephemer
2cc70 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  al index might e
2cc80 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67  nd up.  ** being
2cc90 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
2cca0 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61  ata can be extra
2ccb0 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
2ccc0 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49  ed order..  ** I
2ccd0 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
2cce0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f  se, then the OP_
2ccf0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
2cd00 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
2cd10 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74  e.  ** changed t
2cd20 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
2cd30 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  e we figure out 
2cd40 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
2cd50 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e   index is.  ** n
2cd60 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
2cd70 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2cd80 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20  dex variable is 
2cd90 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
2cda0 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61  te.  ** that cha
2cdb0 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
2cdc0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
2cdd0 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
2cde0 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
2cdf0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
2ce00 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2ce10 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  se, sSort.pOrder
2ce20 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e  By, 0, pEList->n
2ce30 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74  Expr);.    sSort
2ce40 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  .iECursor = pPar
2ce50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2ce60 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2ce70 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
2ce80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2ce90 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2cea0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f  l,.          sSo
2ceb0 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f  rt.iECursor, sSo
2cec0 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  rt.pOrderBy->nEx
2ced0 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78  pr+1+pEList->nEx
2cee0 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  pr, 0,.         
2cef0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2cf00 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20  , P4_KEYINFO.   
2cf10 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
2cf20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
2cf30 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
2cf40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
2cf50 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
2cf60 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
2cf70 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
2cf80 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
2cf90 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
2cfa0 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
2cfb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2cfc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
2cfd0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
2cfe0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c  st->iSDParm, pEL
2cff0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
2d000 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
2d010 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
2d020 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
2d030 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2d040 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2d050 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c   320;  /* 4 bill
2d060 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f  ion rows */.  co
2d070 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
2d080 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
2d090 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
2d0a0 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72  Limit==0 && sSor
2d0b0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
2d0c0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2d0d0 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
2d0e0 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  e(v, sSort.addrS
2d0f0 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72  ortIndex, OP_Sor
2d100 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53  terOpen);.    sS
2d110 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d  ort.sortFlags |=
2d120 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
2d130 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ter;.  }..  /* O
2d140 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  pen an ephemeral
2d150 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
2d160 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
2d170 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
2d180 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2d190 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2d1a0 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
2d1b0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
2d1c0 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
2d1d0 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
2d1e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2d1f0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2d200 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
2d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d220 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
2d230 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
2d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d250 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65         (char*)ke
2d260 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2d270 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
2d280 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20  ist,0,0),.      
2d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2a0 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
2d2b0 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
2d2c0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
2d2d0 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
2d2e0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
2d2f0 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
2d300 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
2d310 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RED;.  }else{.  
2d320 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
2d330 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
2d340 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d  STINCT_NOOP;.  }
2d350 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  ..  if( !isAgg &
2d360 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
2d370 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65  .    /* No aggre
2d380 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
2d390 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  nd no GROUP BY c
2d3a0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36  lause */.    u16
2d3b0 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73   wctrlFlags = (s
2d3c0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2d3d0 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  ? WHERE_WANT_DIS
2d3e0 54 49 4e 43 54 20 3a 20 30 29 3b 0a 20 20 20 20  TINCT : 0);.    
2d3f0 61 73 73 65 72 74 28 20 57 48 45 52 45 5f 55 53  assert( WHERE_US
2d400 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65  E_LIMIT==SF_Fixe
2d410 64 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 77 63  dLimit );.    wc
2d420 74 72 6c 46 6c 61 67 73 20 7c 3d 20 70 2d 3e 73  trlFlags |= p->s
2d430 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78  elFlags & SF_Fix
2d440 65 64 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a  edLimit;..    /*
2d450 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
2d460 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ase scan. */.   
2d470 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
2d480 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
2d490 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
2d4a0 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  here, sSort.pOrd
2d4b0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
2d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4d0 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20       p->pEList, 
2d4e0 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e  wctrlFlags, p->n
2d4f0 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
2d500 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
2d510 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2d520 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2d530 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
2d540 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d  unt(pWInfo) < p-
2d550 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
2d560 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
2d570 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ow = sqlite3Wher
2d580 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
2d590 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
2d5a0 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74     if( sDistinct
2d5b0 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74  .isTnct && sqlit
2d5c0 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
2d5d0 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  t(pWInfo) ){.   
2d5e0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2d5f0 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  ctType = sqlite3
2d600 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
2d610 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
2d620 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72     if( sSort.pOr
2d630 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
2d640 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71  Sort.nOBSat = sq
2d650 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
2d660 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  red(pWInfo);.   
2d670 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
2d680 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
2d690 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
2d6a0 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2d6b0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2d6c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2d6d0 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
2d6e0 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
2d6f0 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
2d700 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
2d710 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
2d720 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
2d730 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
2d740 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
2d750 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
2d760 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
2d770 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
2d780 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
2d790 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
2d7a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
2d7b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d7c0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
2d7d0 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
2d7e0 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
2d7f0 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
2d800 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
2d810 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c  loop. */.    sel
2d820 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2d830 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
2d840 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69  -1, &sSort, &sDi
2d850 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
2d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d870 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
2d880 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
2d890 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
2d8a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d8b0 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
2d8c0 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
2d8d0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
2d8e0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
2d8f0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2d900 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2d910 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d920 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
2d930 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
2d940 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2d950 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
2d960 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
2d970 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
2d980 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
2d990 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
2d9a0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
2d9b0 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
2d9c0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
2d9d0 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
2d9e0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
2d9f0 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
2da00 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
2da10 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
2da20 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
2da30 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
2da40 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
2da50 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
2da60 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
2da70 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
2da80 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
2da90 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2daa0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
2dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dac0 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
2dad0 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
2dae0 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
2daf0 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
2db00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
2db10 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
2db20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
2db30 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
2db40 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
2db50 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
2db60 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
2db70 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
2db80 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
2db90 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
2dba0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
2dbb0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
2dbc0 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
2dbd0 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
2dbe0 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
2dbf0 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
2dc00 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
2dc10 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
2dc20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
2dc30 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
2dc40 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
2dc50 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
2dc60 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
2dc70 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
2dc80 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20  orderByGrp = 0; 
2dc90 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47  /* True if the G
2dca0 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45  ROUP BY and ORDE
2dcb0 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d  R BY are the sam
2dcc0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  e */..    /* Rem
2dcd0 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
2dce0 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
2dcf0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
2dd00 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
2dd10 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
2dd20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
2dd30 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2dd40 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
2dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dd60 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2dd70 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
2dd80 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2dd90 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
2dda0 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
2ddb0 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
2ddc0 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
2ddd0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
2dde0 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
2ddf0 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
2de00 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2de10 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
2de20 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
2de30 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
2de40 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
2de50 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
2de60 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2de70 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2de80 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2de90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2dea0 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69  assert( 66==sqli
2deb0 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
2dec0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
2ded0 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70  SelectRow>66 ) p
2dee0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36  ->nSelectRow = 6
2def0 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
2df00 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
2df10 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
2df20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  );.      p->nSel
2df30 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
2df40 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
2df50 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
2df60 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
2df70 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
2df80 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
2df90 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
2dfa0 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
2dfb0 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
2dfc0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2dfd0 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
2dfe0 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
2dff0 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
2e000 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
2e010 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
2e020 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
2e030 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
2e040 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
2e050 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
2e060 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61  se a.    ** data
2e070 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20  base index that 
2e080 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62  causes rows to b
2e090 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
2e0a0 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20  er as required. 
2e0b0 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63     ** but not ac
2e0c0 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45  tually sorted. E
2e0d0 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72  ither way, recor
2e0e0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
2e0f0 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52  the.    ** ORDER
2e100 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
2e110 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
2e120 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
2e130 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
2e140 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
2e150 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
2e160 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2e170 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53  are(pGroupBy, sS
2e180 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
2e190 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72  )==0 ){.      or
2e1a0 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20  derByGrp = 1;.  
2e1b0 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65    }. .    /* Cre
2e1c0 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
2e1d0 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
2e1e0 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
2e1f0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
2e200 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
2e210 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2e220 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
2e230 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2e240 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
2e250 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
2e260 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
2e270 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
2e280 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
2e290 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
2e2a0 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
2e2b0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2e2c0 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
2e2d0 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
2e2e0 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
2e2f0 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
2e300 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
2e310 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
2e320 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
2e330 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
2e340 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ;.    sAggInfo.m
2e350 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
2e360 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
2e370 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2e380 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
2e390 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
2e3a0 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
2e3b0 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
2e3c0 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
2e3d0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2e3e0 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
2e3f0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
2e400 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2e410 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
2e420 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
2e430 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
2e440 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2e450 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
2e460 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
2e470 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2e480 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
2e490 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
2e4a0 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
2e4b0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
2e4c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
2e4d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2e4e0 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
2e4f0 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
2e500 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2e510 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
2e520 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
2e530 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
2e540 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2e550 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
2e560 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
2e570 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
2e580 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
2e590 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
2e5a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
2e5b0 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
2e5c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
2e5d0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2e5e0 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
2e5f0 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  _end;..    /* Pr
2e600 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
2e610 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
2e620 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
2e630 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
2e640 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
2e650 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
2e660 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
2e670 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
2e680 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2e690 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
2e6a0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
2e6b0 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
2e6c0 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
2e6d0 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  p by clause */. 
2e6e0 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20       int addr1; 
2e6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73           /* A-vs
2e700 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a  -B comparision j
2e710 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ump */.      int
2e720 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
2e730 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
2e740 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
2e750 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
2e760 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  w */.      int r
2e770 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f  egOutputRow;   /
2e780 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
2e790 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75   register for ou
2e7a0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
2e7b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2e7c0 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20  rSetAbort;   /* 
2e7d0 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
2e7e0 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
2e7f0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2e800 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f  opOfLoop;  /* To
2e810 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  p of the input l
2e820 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  oop */.      int
2e830 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
2e840 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
2e850 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
2e860 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
2e870 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2e880 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  Reset;      /* S
2e890 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
2e8a0 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
2e8b0 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  mulator */.     
2e8c0 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20   int regReset;  
2e8d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
2e8e0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
2e8f0 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75  for reset subrou
2e900 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  tine */..      /
2e910 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
2e920 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
2e930 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
2e940 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
2e950 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
2e960 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
2e970 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
2e980 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
2e990 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
2e9a0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
2e9b0 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
2e9c0 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72   all, the OP_Sor
2e9d0 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74  terOpen instruct
2e9e0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
2e9f0 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
2ea00 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
2ea10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
2ea20 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2ea30 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2ea40 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
2ea50 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
2ea60 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2ea70 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67  pGroupBy, 0, sAg
2ea80 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a  gInfo.nColumn);.
2ea90 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
2eaa0 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
2eab0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
2eac0 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
2ead0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2eae0 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
2eaf0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2eb00 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
2eb10 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
2eb20 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2eb30 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
2eb40 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
2eb50 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
2eb60 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
2eb70 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
2eb80 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
2eb90 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
2eba0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
2ebb0 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
2ebc0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
2ebd0 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
2ebe0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ebf0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2ec00 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
2ec10 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2ec20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
2ec30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ec40 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
2ec50 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2ec60 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
2ec70 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
2ec80 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2ec90 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2eca0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2ecb0 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
2ecc0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
2ecd0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
2ece0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
2ecf0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
2ed00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2ed10 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2ed20 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
2ed30 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2ed40 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
2ed50 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2ed60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ed70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2ed80 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
2ed90 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2eda0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
2edb0 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
2edc0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2edd0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2ede0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
2edf0 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
2ee00 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
2ee10 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
2ee20 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
2ee30 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
2ee40 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
2ee50 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
2ee60 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
2ee70 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
2ee80 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
2ee90 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
2eea0 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
2eeb0 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
2eec0 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
2eed0 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
2eee0 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
2eef0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
2ef00 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
2ef10 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
2ef20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2ef30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ef40 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2ef50 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2ef60 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
2ef70 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2ef80 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2ef90 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
2efa0 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20  roupBy, 0,.     
2efb0 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50       WHERE_GROUP
2efc0 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70  BY | (orderByGrp
2efd0 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   ? WHERE_SORTBYG
2efe0 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20  ROUP : 0), 0.   
2eff0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
2f000 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2f010 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2f020 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2f030 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2f040 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e  nfo)==pGroupBy->
2f050 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2f060 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
2f070 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
2f080 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
2f090 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
2f0a0 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
2f0b0 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
2f0c0 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
2f0d0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2f0e0 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
2f0f0 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
2f100 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
2f110 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
2f120 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
2f130 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
2f140 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
2f150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f160 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
2f170 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
2f180 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
2f190 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
2f1a0 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
2f1b0 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
2f1c0 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
2f1d0 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
2f1e0 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
2f1f0 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
2f200 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2f210 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
2f220 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
2f230 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
2f240 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
2f250 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2f260 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
2f270 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
2f280 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
2f290 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
2f2a0 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
2f2b0 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2f2c0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
2f2d0 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
2f2e0 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
2f2f0 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
2f300 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
2f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f320 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
2f330 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
2f340 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2f350 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
2f360 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
2f370 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2f380 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b  nCol = nGroupBy;
2f390 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2f3a0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
2f3b0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2f3c0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
2f3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2f3e0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
2f3f0 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
2f400 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2f410 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
2f420 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2f430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2f440 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
2f450 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2f460 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
2f470 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2f480 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2f490 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2f4a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2f4b0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
2f4c0 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
2f4d0 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  gBase, 0, 0);.  
2f4e0 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
2f4f0 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
2f500 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
2f510 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
2f520 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2f530 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
2f540 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
2f550 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
2f560 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
2f570 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
2f580 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
2f590 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b  1 = j + regBase;
2f5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2f5b0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
2f5c0 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73  olumnToReg(pPars
2f5d0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5f0 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
2f600 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
2f610 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b  ol->iTable, r1);
2f620 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
2f630 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f650 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
2f660 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2f670 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2f680 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2f690 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
2f6a0 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
2f6b0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
2f6c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f6d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
2f6e0 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67  rterInsert, sAgg
2f6f0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2f700 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
2f710 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
2f720 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
2f730 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
2f740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
2f750 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
2f760 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
2f770 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2f780 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2f790 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
2f7a0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2f7b0 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54  IdxPTab = sortPT
2f7c0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
2f7d0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72  b++;.        sor
2f7e0 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65  tOut = sqlite3Ge
2f7f0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
2f800 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f810 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f820 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f  P_OpenPseudo, so
2f830 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c  rtPTab, sortOut,
2f840 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
2f850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f860 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
2f870 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
2f880 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64  tingIdx, addrEnd
2f890 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2f8a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55  omment((v, "GROU
2f8b0 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64  P BY sort")); Vd
2f8c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2f8d0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2f8e0 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
2f8f0 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
2f900 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2f910 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
2f920 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
2f930 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d  the index or tem
2f940 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65  porary table use
2f950 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42  d by the GROUP B
2f960 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20  Y sort.      ** 
2f970 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64  will naturally d
2f980 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74  eliver rows in t
2f990 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65  he order require
2f9a0 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42  d by the ORDER B
2f9b0 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  Y.      ** claus
2f9c0 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70  e, cancel the ep
2f9d0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70  hemeral table op
2f9e0 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  en coded earlier
2f9f0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2fa00 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   ** This is an o
2fa10 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68  ptimization - th
2fa20 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
2fa30 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72   should result r
2fa40 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20  egardless..     
2fa50 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49   ** Use the SQLI
2fa60 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20  TE_GroupByOrder 
2fa70 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45  flag with SQLITE
2fa80 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
2fa90 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ZER to .      **
2faa0 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70   disable this op
2fab0 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
2fac0 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
2fad0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
2fae0 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74  rderByGrp && Opt
2faf0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
2fb00 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75  (db, SQLITE_Grou
2fb10 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20  pByOrder) .     
2fb20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72    && (groupBySor
2fb30 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72  t || sqlite3Wher
2fb40 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f  eIsSorted(pWInfo
2fb50 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  )).      ){.    
2fb60 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
2fb70 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  By = 0;.        
2fb80 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2fb90 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
2fba0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
2fbb0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2fbc0 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
2fbd0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
2fbe0 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
2fbf0 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
2fc00 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
2fc10 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
2fc20 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
2fc30 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
2fc40 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
2fc50 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
2fc60 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
2fc70 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
2fc80 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
2fc90 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
2fca0 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
2fcb0 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
2fcc0 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
2fcd0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
2fce0 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
2fcf0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
2fd00 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2fd10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2fd20 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2fd30 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72  e);.      if( gr
2fd40 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
2fd50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fd60 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
2fd70 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66  terData, sAggInf
2fd80 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  o.sortingIdx,.  
2fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fda0 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c          sortOut,
2fdb0 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20   sortPTab);.    
2fdc0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2fdd0 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
2fde0 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
2fdf0 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
2fe00 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
2fe10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fe20 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2fe30 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42   sortPTab, j, iB
2fe40 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
2fe50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2fe60 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
2fe70 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
2fe80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2fe90 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
2fea0 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
2feb0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
2fec0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2fed0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fee0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
2fef0 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
2ff00 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
2ff10 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
2ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2ff30 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
2ff40 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
2ff50 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
2ff60 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
2ff70 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2ff80 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2ff90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2ffa0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
2ffb0 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29  1+1, 0, addr1+1)
2ffc0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2ffd0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
2ffe0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
2fff0 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
30000 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
30010 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
30020 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55  nges in the GROU
30030 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
30040 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
30050 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
30060 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
30070 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
30080 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
30090 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
300a0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
300b0 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
300c0 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
300d0 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
300e0 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
300f0 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
30100 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
30110 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
30120 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
30130 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
30140 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
30150 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
30160 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
30170 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
30180 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
30190 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
301a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
301b0 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d  ve(pParse, iBMem
301c0 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iAMem, pGroupB
301d0 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  y->nExpr);.     
301e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
301f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
30200 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
30210 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
30220 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
30230 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
30240 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
30250 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30260 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
30270 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
30280 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
30290 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
302a0 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
302b0 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
302c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
302d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
302e0 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
302f0 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
30300 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
30310 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61   "reset accumula
30320 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
30330 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
30340 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
30350 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
30360 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
30370 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
30380 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
30390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
303a0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
303b0 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
303c0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
303d0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
303e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
303f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
30400 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61  eger, 1, iUseFla
30410 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
30420 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
30430 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
30440 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
30450 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
30460 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
30470 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
30480 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
30490 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
304a0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
304b0 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
304c0 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
304d0 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  OfLoop);.       
304e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
304f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
30510 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
30520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30530 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
30540 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
30550 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
30560 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
30570 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
30580 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
30590 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
305a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
305b0 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
305c0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
305d0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
305e0 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
305f0 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
30600 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
30610 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
30620 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30630 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
30640 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  v, addrEnd);..  
30650 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
30660 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
30670 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
30680 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
30690 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
306a0 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
306b0 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
306c0 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
306d0 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
306e0 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
306f0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
30700 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
30710 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
30720 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
30730 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
30740 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
30750 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
30760 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
30770 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
30780 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
30790 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
307a0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
307b0 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
307c0 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
307d0 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
307e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
307f0 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
30800 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
30810 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
30820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30830 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
30840 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
30850 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
30860 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
30870 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
30880 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30890 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
308a0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
308b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
308c0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
308d0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
308e0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
308f0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
30900 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
30910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
30930 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
30940 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
30950 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
30960 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
30970 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
30980 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
30990 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
309a0 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
309b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
309c0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
309d0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
309e0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
309f0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
30a00 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
30a10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
30a20 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
30a30 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
30a40 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
30a50 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
30a60 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
30a70 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
30a80 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f  pEList, -1, &sSo
30a90 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
30aa0 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74            &sDist
30ab0 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
30ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ad0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
30ae0 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
30af0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30b00 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
30b10 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
30b20 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
30b30 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
30b40 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
30b50 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
30b60 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
30b70 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
30b80 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
30b90 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
30ba0 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
30bb0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
30bc0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
30bd0 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  v, addrReset);. 
30be0 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
30bf0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
30c00 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
30c10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30c20 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
30c30 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20  regReset);.     
30c40 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
30c50 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e  pGroupBy.  Begin
30c60 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
30c70 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50  es without GROUP
30c80 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65   BY: */.    else
30c90 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
30ca0 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66  t *pDel = 0;.#if
30cb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30cc0 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
30cd0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
30ce0 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d       if( (pTab =
30cf0 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70   isSimpleCount(p
30d00 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30  , &sAggInfo))!=0
30d10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
30d20 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  f isSimpleCount(
30d30 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  ) returns a poin
30d40 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73  ter to a Table s
30d50 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20  tructure, then. 
30d60 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
30d70 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  L statement is o
30d80 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20  f the form:.    
30d90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
30da0 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
30db0 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20  (*) FROM <tbl>. 
30dc0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
30dd0 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54    ** where the T
30de0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72  able structure r
30df0 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e  eturned represen
30e00 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a  ts table <tbl>..
30e10 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30e20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65     ** This state
30e30 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f  ment is so commo
30e40 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74  n that it is opt
30e50 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79  imized specially
30e60 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
30e70 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75   OP_Count instru
30e80 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65  ction is execute
30e90 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20  d either on the 
30ea0 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61  intkey table tha
30eb0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
30ec0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66  tains the data f
30ed0 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f  or table <tbl> o
30ee0 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20  r on one of its 
30ef0 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20  indexes. It.    
30f00 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72      ** is better
30f10 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
30f20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20  op on an index, 
30f30 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  as indexes are a
30f40 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  lmost.        **
30f50 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61   always spread a
30f60 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73  cross less pages
30f70 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72   than their corr
30f80 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73  esponding tables
30f90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
30fa0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
30fb0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
30fc0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
30fd0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
30fe0 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ema);.        co
30ff0 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70  nst int iCsr = p
31000 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
31010 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
31020 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20  scan b-tree */. 
31030 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
31040 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
31050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31060 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
31070 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49   */.        KeyI
31080 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
31090 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
310a0 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20   /* Keyinfo for 
310b0 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f  scanned index */
310c0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
310d0 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
310e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
310f0 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e   Best index foun
31100 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  d so far */.    
31110 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
31120 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20  pTab->tnum;     
31130 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
31140 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64   page of scanned
31150 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
31160 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
31170 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
31180 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
31190 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
311a0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
311b0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
311c0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
311d0 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
311e0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68  for the index th
311f0 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73  at has the lowes
31200 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20  t scan cost..   
31210 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31220 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20  ** (2011-04-15) 
31230 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c  Do not do a full
31240 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72   scan of an unor
31250 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20  dered index..   
31260 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31270 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20  ** (2013-10-03) 
31280 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65  Do not count the
31290 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61   entries in a pa
312a0 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20  rtial index..   
312b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
312c0 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74  ** In practice t
312d0 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
312e0 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ture will not be
312f0 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c   used. It is onl
31300 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  y .        ** pa
31310 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f  ssed to keep OP_
31320 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a  OpenRead happy..
31330 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31340 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
31350 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d  (pTab) ) pBest =
31360 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
31370 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
31380 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
31390 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
313a0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
313b0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
313c0 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
313d0 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
313e0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49      && pIdx->szI
313f0 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
31400 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20  bRow.           
31410 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  && pIdx->pPartId
31420 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20  xWhere==0.      
31430 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20       && (!pBest 
31440 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  || pIdx->szIdxRo
31450 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f  w<pBest->szIdxRo
31460 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  w).          ){.
31470 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
31480 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
31490 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
314a0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
314b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
314c0 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e  Root = pBest->tn
314d0 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b  um;.          pK
314e0 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
314f0 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
31500 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
31510 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
31520 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
31530 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
31540 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
31550 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
31560 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
31570 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31580 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
31590 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
315a0 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  t, iDb, 1);.    
315b0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
315c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
315d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
315e0 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
315f0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
31600 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
31610 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
31620 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
31630 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73  P_Count, iCsr, s
31640 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
31650 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
31660 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31670 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
31680 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  Csr);.        ex
31690 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
316a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
316b0 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Best);.      }el
316c0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
316d0 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
316e0 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
316f0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
31700 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
31710 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
31720 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
31730 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31740 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
31750 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
31760 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
31770 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
31780 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
31790 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
317a0 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
317b0 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
317c0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
317d0 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
317e0 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
317f0 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
31800 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
31810 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
31820 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
31830 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
31840 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
31850 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
31860 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
31870 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
31880 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
31890 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
318a0 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
318b0 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
318c0 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
318d0 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
318e0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
318f0 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
31900 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
31910 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
31920 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
31930 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
31940 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
31950 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
31960 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
31970 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
31980 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
31990 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
319a0 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
319b0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
319c0 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
319d0 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
319e0 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77  havior as follow
319f0 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
31a00 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
31a10 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
31a20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
31a30 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
31a40 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ded by.        *
31a50 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
31a60 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
31a70 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
31a80 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
31a90 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ue.        **   
31aa0 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20    for x..       
31ab0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
31ac0 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72   + The optimizer
31ad0 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
31ae0 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74   (the thing that
31af0 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20   decides which. 
31b00 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
31b10 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
31b20 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
31b30 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
31b40 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
31b50 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
31b60 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
31b70 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
31b80 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
31b90 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
31ba0 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
31bb0 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
31bc0 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
31bd0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
31be0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45      */.        E
31bf0 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
31c00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
31c10 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52   flag = WHERE_OR
31c20 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
31c30 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61        .        a
31c40 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
31c50 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
31c60 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
31c70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
31c80 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b  p->pHaving==0 ){
31c90 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  .          flag 
31ca0 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73  = minMaxQuery(&s
31cb0 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61  AggInfo, &pMinMa
31cc0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
31cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
31ce0 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61  ag==0 || (pMinMa
31cf0 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d  x!=0 && pMinMax-
31d00 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20  >nExpr==1) );.. 
31d10 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20         if( flag 
31d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
31d30 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
31d40 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
31d50 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20  inMax, 0);.     
31d60 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
31d70 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Max;.          a
31d80 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
31d90 63 46 61 69 6c 65 64 20 7c 7c 20 70 4d 69 6e 4d  cFailed || pMinM
31da0 61 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ax!=0 );.       
31db0 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
31dc0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
31dd0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
31de0 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
31df0 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52  = flag!=WHERE_OR
31e00 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a  DERBY_MIN ?1:0;.
31e10 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
31e20 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
31e30 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
31e40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31e50 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
31e60 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
31e70 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
31e80 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
31e90 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
31ea0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
31eb0 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
31ec0 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
31ed0 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
31ee0 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20  ngle row.       
31ef0 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
31f00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31f10 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
31f20 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
31f30 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Info);.        p
31f40 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
31f50 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
31f60 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
31f70 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c  re, pMinMax,0,fl
31f80 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ag,0);.        i
31f90 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
31fa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31fb0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
31fc0 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
31fd0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
31fe0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
31ff0 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
32000 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
32010 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
32020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
32030 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e  inMax==0 || pMin
32040 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  Max->nExpr==1 );
32050 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
32060 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
32070 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a  ed(pWInfo)>0 ){.
32080 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32090 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c  3VdbeGoto(v, sql
320a0 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
320b0 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20  bel(pWInfo));.  
320c0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
320d0 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
320e0 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
320f0 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
32100 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
32110 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
32120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32130 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
32140 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
32150 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
32160 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
32170 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
32180 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f      }..      sSo
32190 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
321a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
321b0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
321c0 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
321d0 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
321e0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
321f0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
32200 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
32210 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20  st, -1, 0, 0, . 
32220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32230 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
32240 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
32250 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
32260 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
32270 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
32280 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
32290 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
322a0 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
322b0 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
322c0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
322d0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
322e0 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
322f0 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
32300 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
32310 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
32320 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
32330 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
32340 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
32350 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
32360 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
32370 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
32380 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
32390 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
323a0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
323b0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
323c0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
323d0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a  mpTable(pParse,.
323e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323f0 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
32400 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
32410 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
32420 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
32430 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
32440 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
32450 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
32460 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
32470 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
32480 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
32490 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
324a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
324b0 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
324c0 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
324d0 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
324e0 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
324f0 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
32500 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
32510 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
32520 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
32530 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
32540 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
32550 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
32560 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
32570 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
32580 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
32590 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
325a0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
325b0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
325c0 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
325d0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
325e0 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
325f0 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
32600 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
32610 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
32620 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
32630 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
32640 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
32650 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
32660 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
32670 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
32680 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
32690 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
326a0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
326b0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
326c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
326d0 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
326e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
326f0 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
32700 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45  aFunc);.#if SELE
32710 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
32720 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
32730 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70  pParse,p,("end p
32740 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
32750 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
32760 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
32770 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
32780 0a                                               .