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

Artifact 7003fe663bc0636b656874440845a85dcbad4ba7:


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 75 38 20 73 6f 72 74  ral */.  u8 sort
07c0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f  Flags;         /
07d0: 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53  * Zero or more S
07e0: 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74 73 20 2a  ORTFLAG_* bits *
07f0: 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f 52  /.};.#define SOR
0800: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
0810: 20 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20 53   0x01   /* Use S
0820: 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65 61  orterOpen instea
0830: 64 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65 72  d of OpenEphemer
0840: 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  al */../*.** Del
0850: 65 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 74  ete all the cont
0860: 65 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74 20  ent of a Select 
0870: 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 61 6c  structure.  Deal
0880: 6c 6f 63 61 74 65 20 74 68 65 20 73 74 72 75 63  locate the struc
0890: 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 6f  ture.** itself o
08a0: 6e 6c 79 20 69 66 20 62 46 72 65 65 20 69 73 20  nly if bFree is 
08b0: 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
08c0: 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74  void clearSelect
08d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
08e0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 62 46 72  lect *p, int bFr
08f0: 65 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  ee){.  while( p 
0900: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
0910: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
0920: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  r;.    sqlite3Ex
0930: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0940: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
0950: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0960: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72  elete(db, p->pSr
0970: 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  c);.    sqlite3E
0980: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0990: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
09a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
09b0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ete(db, p->pGrou
09c0: 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
09d0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
09e0: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
09f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0a00: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
0a10: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
0a20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0a30: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
0a40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a50: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
0a60: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
0a70: 33 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20  3WithDelete(db, 
0a80: 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69  p->pWith);.    i
0a90: 66 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74  f( bFree ) sqlit
0aa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
0ab0: 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b  .    p = pPrior;
0ac0: 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a  .    bFree = 1;.
0ad0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
0ae0: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0af0: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0b00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0b10: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0b20: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0b30: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0b40: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
0b50: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
0b60: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
0b70: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
0b80: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
0b90: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
0ba0: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0bb0: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0bc0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0bd0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0be0: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0bf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0c00: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0c10: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0c20: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0c30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0c40: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0c50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0c60: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0c70: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0c80: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0c90: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0ca0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0cb0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0cc0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0cd0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0ce0: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0cf0: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0d00: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0d10: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0d20: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0d30: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0d40: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0d50: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0d60: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0d70: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0d80: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0d90: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0da0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
0db0: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0dc0: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0dd0: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0de0: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0df0: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0e00: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0e10: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0e20: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0e30: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0e40: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0e50: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0e60: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0e70: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0e80: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0e90: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
0ea0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0eb0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0ec0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0ed0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0ee0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0ef0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
0f00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f10: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73  );.    pNew = &s
0f20: 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73  tandin;.    mems
0f30: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
0f40: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a  of(*pNew));.  }.
0f50: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
0f60: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
0f70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
0f80: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
0f90: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
0fa0: 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20 7d 0a  TK_ALL,0));.  }.
0fb0: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
0fc0: 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70   pEList;.  if( p
0fd0: 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20  Src==0 ) pSrc = 
0fe0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0ff0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
1000: 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pSrc));.  pNew->
1010: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
1020: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
1030: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
1040: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
1050: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
1060: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
1070: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1080: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
1090: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
10a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
10b0: 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
10c0: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
10d0: 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d   pLimit;.  pNew-
10e0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
10f0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  et;.  assert( pO
1100: 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d  ffset==0 || pLim
1110: 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  it!=0 || pParse-
1120: 3e 6e 45 72 72 3e 30 20 7c 7c 20 64 62 2d 3e 6d  >nErr>0 || db->m
1130: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
1140: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1150: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
1160: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
1170: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
1180: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1190: 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65  iled ) {.    cle
11a0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
11b0: 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  w, pNew!=&standi
11c0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  n);.    pNew = 0
11d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
11e0: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
11f0: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
1200: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
1210: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
1220: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
1230: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20  rn pNew;.}..#if 
1240: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1250: 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  LED./*.** Set th
1260: 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65  e name of a Sele
1270: 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  ct object.*/.voi
1280: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53  d sqlite3SelectS
1290: 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70  etName(Select *p
12a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
12b0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ame){.  if( p &&
12c0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71   zName ){.    sq
12d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
12e0: 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d  izeof(p->zSelNam
12f0: 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c  e), p->zSelName,
1300: 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20   "%s", zName);. 
1310: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1320: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
1330: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
1340: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
1350: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1360: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1370: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1380: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
1390: 65 63 74 20 2a 70 29 7b 0a 20 20 63 6c 65 61 72  ect *p){.  clear
13a0: 53 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29  Select(db, p, 1)
13b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
13c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
13d0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
13e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
13f0: 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f  n a compound..*/
1400: 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a  .static Select *
1410: 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65  findRightmost(Se
1420: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c  lect *p){.  whil
1430: 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20  e( p->pNext ) p 
1440: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  = p->pNext;.  re
1450: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1460: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
1470: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64  entifiers preced
1480: 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79  ing the JOIN key
1490: 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20  word, determine 
14a0: 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a  the.** type of j
14b0: 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  oin.  Return an 
14c0: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
14d0: 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20   that expresses 
14e0: 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20  that type.** in 
14f0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c  terms of the fol
1500: 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65  lowing bit value
1510: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f  s:.**.**     JT_
1520: 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  INNER.**     JT_
1530: 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f  CROSS.**     JT_
1540: 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  OUTER.**     JT_
1550: 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a  NATURAL.**     J
1560: 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54  T_LEFT.**     JT
1570: 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66  _RIGHT.**.** A f
1580: 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69  ull outer join i
1590: 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f  s the combinatio
15a0: 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64  n of JT_LEFT and
15b0: 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a   JT_RIGHT..**.**
15c0: 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f   If an illegal o
15d0: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
15e0: 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c  in type is seen,
15f0: 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
1600: 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70  rn.** a join typ
1610: 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72  e, but put an er
1620: 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73  ror in the pPars
1630: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1640: 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54  int sqlite3JoinT
1650: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
1660: 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f  e, Token *pA, To
1670: 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a  ken *pB, Token *
1680: 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74  pC){.  int joint
1690: 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e  ype = 0;.  Token
16a0: 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f   *apAll[3];.  To
16b0: 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  ken *p;.        
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35       /*   012345
16e0: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
16f0: 32 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a  23456789 123 */.
1700: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1710: 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d  har zKeyText[] =
1720: 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65   "naturaleftoute
1730: 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72  rightfullinnercr
1740: 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63  oss";.  static c
1750: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
1760: 20 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f    u8 i;        /
1770: 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b  * Beginning of k
1780: 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a  eyword text in z
1790: 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20  KeyText[] */.   
17a0: 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a   u8 nChar;    /*
17b0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b   Length of the k
17c0: 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63  eyword in charac
17d0: 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63  ters */.    u8 c
17e0: 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e  ode;     /* Join
17f0: 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20   type mask */.  
1800: 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b  } aKeyword[] = {
1810: 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20  .    /* natural 
1820: 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e  */ { 0,  7, JT_N
1830: 41 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20  ATURAL          
1840: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1850: 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20  left    */ { 6, 
1860: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f   4, JT_LEFT|JT_O
1870: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c  UTER          },
1880: 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20  .    /* outer   
1890: 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f  */ { 10, 5, JT_O
18a0: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20  UTER            
18b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
18c0: 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c  right   */ { 14,
18d0: 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f   5, JT_RIGHT|JT_
18e0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c  OUTER         },
18f0: 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20  .    /* full    
1900: 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c  */ { 19, 4, JT_L
1910: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
1920: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20  OUTER },.    /* 
1930: 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c  inner   */ { 23,
1940: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20   5, JT_INNER    
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1960: 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20  .    /* cross   
1970: 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49  */ { 28, 5, JT_I
1980: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20  NNER|JT_CROSS   
1990: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
19a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
19b0: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
19c0: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
19d0: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
19e0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
19f0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
1a00: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
1a10: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1a20: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1a30: 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rd); j++){.     
1a40: 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77   if( p->n==aKeyw
1a50: 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20  ord[j].nChar .  
1a60: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
1a70: 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
1a80: 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78  *)p->z, &zKeyTex
1a90: 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d  t[aKeyword[j].i]
1aa0: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
1ab0: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1ac0: 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f  = aKeyword[j].co
1ad0: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
1ae0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1af0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a  .    testcase( j
1b00: 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a  ==0 || j==1 || j
1b10: 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a  ==2 || j==3 || j
1b20: 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a  ==4 || j==5 || j
1b30: 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ==6 );.    if( j
1b40: 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  >=ArraySize(aKey
1b50: 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a  word) ){.      j
1b60: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
1b70: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1b80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1b90: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
1ba0: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
1bb0: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
1bc0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
1bd0: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1be0: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
1bf0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1c00: 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20  r *zSp = " ";.  
1c10: 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20    assert( pB!=0 
1c20: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30  );.    if( pC==0
1c30: 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20   ){ zSp++; }.   
1c40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c50: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
1c60: 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  n or unsupported
1c70: 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20   join type: ".  
1c80: 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22       "%T %T%s%T"
1c90: 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70  , pA, pB, zSp, p
1ca0: 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  C);.    jointype
1cb0: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1cc0: 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79  else if( (jointy
1cd0: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1ce0: 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0 .         && (
1cf0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
1d00: 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d  EFT|JT_RIGHT))!=
1d10: 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73  JT_LEFT ){.    s
1d20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d30: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
1d40: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
1d50: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
1d60: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
1d70: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
1d80: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1d90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
1da0: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
1db0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1dc0: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
1dd0: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
1de0: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
1df0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
1e00: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
1e10: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1e20: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
1e30: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
1e40: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
1e50: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1e60: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
1e70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1e80: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1e90: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
1ea0: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
1eb0: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1ec0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1ed0: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69  ** Search the fi
1ee0: 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20  rst N tables in 
1ef0: 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20  pSrc, from left 
1f00: 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e  to right, lookin
1f10: 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  g for a.** table
1f20: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75   that has a colu
1f30: 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20  mn named zCol.  
1f40: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e  .**.** When foun
1f50: 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e  d, set *piTab an
1f60: 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20  d *piCol to the 
1f70: 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20  table index and 
1f80: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20  column index.** 
1f90: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
1fa0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72  column and retur
1fb0: 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  n TRUE..**.** If
1fc0: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75   not found, retu
1fd0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
1fe0: 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64  tic int tableAnd
1ff0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53  ColumnIndex(.  S
2000: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
2010: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2020: 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68  tables to search
2030: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
2040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2050: 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2060: 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73  n pSrc->a[] to s
2070: 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  earch */.  const
2080: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
2090: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
20a0: 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f  olumn we are loo
20b0: 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  king for */.  in
20c0: 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20  t *piTab,       
20d0: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
20e0: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68  x of pSrc->a[] h
20f0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ere */.  int *pi
2100: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Col           /*
2110: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
2120: 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e  pSrc->a[*piTab].
2130: 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72  pTab->aCol[] her
2140: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2160: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2170: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  er tables in pSr
2180: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  c */.  int iCol;
2190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21a0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d  ndex of column m
21b0: 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a  atching zCol */.
21c0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61  .  assert( (piTa
21d0: 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30  b==0)==(piCol==0
21e0: 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72  ) );  /* Both or
21f0: 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c   neither are NUL
2200: 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  L */.  for(i=0; 
2210: 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<N; i++){.    i
2220: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
2230: 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61  x(pSrc->a[i].pTa
2240: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b, zCol);.    if
2250: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
2260: 20 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a     if( piTab ){.
2270: 20 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d          *piTab =
2280: 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43   i;.        *piC
2290: 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ol = iCol;.     
22a0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
22b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
22c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
22d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
22e0: 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74  is used to add t
22f0: 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20  erms implied by 
2300: 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74  JOIN syntax to t
2310: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
2320: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  se expression of
2330: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2340: 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72  ent. The new ter
2350: 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41  m, which.** is A
2360: 4e 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78  NDed with the ex
2370: 69 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61  isting WHERE cla
2380: 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66  use, is of the f
2390: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74  orm:.**.**    (t
23a0: 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e  ab1.col1 = tab2.
23b0: 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72  col2).**.** wher
23c0: 65 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53  e tab1 is the iS
23d0: 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53  rc'th table in S
23e0: 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20  rcList pSrc and 
23f0: 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20  tab2 is the .** 
2400: 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c  (iSrc+1)'th. Col
2410: 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75  umn col1 is colu
2420: 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74  mn iColLeft of t
2430: 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73  ab1, and col2 is
2440: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52  .** column iColR
2450: 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f  ight of tab2..*/
2460: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
2470: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72  WhereTerm(.  Par
2480: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24b0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
24c0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rc,             
24d0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
24e0: 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63  tables in FROM c
24f0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
2500: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2520: 64 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62  dex of first tab
2530: 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53  le to join in pS
2540: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rc */.  int iCol
2550: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2560: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2570: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69   of column in fi
2580: 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  rst table */.  i
2590: 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20  nt iRight,      
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b0: 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e  * Index of secon
25c0: 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20  d table in pSrc 
25d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67  */.  int iColRig
25e0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
25f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2600: 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e   column in secon
2610: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  d table */.  int
2620: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20   isOuterJoin,   
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2640: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2650: 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f  an OUTER join */
2660: 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72  .  Expr **ppWher
2670: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2680: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68     /* IN/OUT: Th
2690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26a0: 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  o add to */.){. 
26b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
26c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
26d0: 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a  r *pE1;.  Expr *
26e0: 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71  pE2;.  Expr *pEq
26f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ;..  assert( iLe
2700: 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61  ft<iRight );.  a
2710: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72  ssert( pSrc->nSr
2720: 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  c>iRight );.  as
2730: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c  sert( pSrc->a[iL
2740: 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61  eft].pTab );.  a
2750: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
2760: 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a  Right].pTab );..
2770: 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43    pE1 = sqlite3C
2780: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2790: 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  db, pSrc, iLeft,
27a0: 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45   iColLeft);.  pE
27b0: 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  2 = sqlite3Creat
27c0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
27d0: 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43  pSrc, iRight, iC
27e0: 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71  olRight);..  pEq
27f0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2800: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70  pParse, TK_EQ, p
2810: 45 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69  E1, pE2, 0);.  i
2820: 66 28 20 70 45 71 20 26 26 20 69 73 4f 75 74 65  f( pEq && isOute
2830: 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70  rJoin ){.    Exp
2840: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 71  rSetProperty(pEq
2850: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
2860: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2870: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 71  rHasProperty(pEq
2880: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2890: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
28a0: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
28b0: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52  erty(pEq, EP_NoR
28c0: 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45 71 2d  educe);.    pEq-
28d0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
28e0: 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61   = (i16)pE2->iTa
28f0: 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68  ble;.  }.  *ppWh
2900: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2910: 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72  rAnd(db, *ppWher
2920: 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, pEq);.}../*.*
2930: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
2940: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
2950: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
2960: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
2970: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
2980: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
2990: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
29a0: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
29b0: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
29c0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
29d0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
29e0: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
29f0: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2a00: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2a10: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2a20: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2a30: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2a40: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2a50: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2a60: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2a70: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
2a80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
2a90: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
2aa0: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
2ab0: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
2ac0: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
2ad0: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
2ae0: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2af0: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2b00: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2b10: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2b20: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2b30: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2b40: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2b50: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2b60: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2b70: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
2b80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
2b90: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
2ba0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
2bb0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
2bc0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
2bd0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
2be0: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
2bf0: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
2c00: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
2c10: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
2c20: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
2c30: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
2c40: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
2c50: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2c60: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
2c70: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
2c80: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
2c90: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
2ca0: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
2cb0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
2cc0: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
2cd0: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
2ce0: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
2cf0: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
2d00: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
2d10: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
2d20: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
2d30: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
2d40: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
2d50: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2d60: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
2d70: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
2d80: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
2d90: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
2da0: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
2db0: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
2dc0: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
2dd0: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
2de0: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
2df0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
2e00: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
2e10: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
2e20: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
2e30: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2e40: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
2e50: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2e60: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
2e70: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2e80: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2e90: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2ea0: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
2eb0: 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  e);.    p->iRigh
2ec0: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
2ed0: 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  6)iTable;.    if
2ee0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
2ef0: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
2f00: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
2f10: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
2f20: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
2f30: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2f40: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
2f50: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
2f60: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
2f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f80: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
2f90: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
2fa0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2fb0: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2fc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2fd0: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2fe0: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2ff0: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
3000: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
3010: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
3020: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
3030: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
3040: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3050: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
3060: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
3070: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
3080: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
3090: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
30a0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
30b0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
30c0: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
30d0: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
30e0: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
30f0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
3100: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
3110: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
3120: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
3130: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
3140: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
3150: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
3160: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
3170: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
3180: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
3190: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
31a0: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
31b0: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
31c0: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
31d0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
31e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
31f0: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
3200: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
3210: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
3220: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3230: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
3240: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
3250: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
3260: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
3270: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
3280: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
3290: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
32a0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
32c0: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
32d0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
32e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
3310: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
3320: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
3330: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
3340: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
3350: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
3360: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
3370: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
3380: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
3390: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
33a0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
33b0: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
33c0: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
33d0: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
33e0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
33f0: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
3400: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
3410: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
3420: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
3430: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
3440: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
3450: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
3460: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
3470: 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  ER(pLeftTab==0 |
3480: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20  | pRightTab==0) 
3490: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
34a0: 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68  isOuter = (pRigh
34b0: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
34c0: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
34d0: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
34e0: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
34f0: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
3500: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
3510: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
3520: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
3530: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
3540: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
3550: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3560: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
3570: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
3580: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3590: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
35a0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
35b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
35c0: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
35d0: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
35e0: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
35f0: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
3600: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
3610: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
3630: 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54  r(j=0; j<pRightT
3640: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
3650: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3660: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
3670: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  f column in the 
3680: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
3690: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
36a0: 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e  ;     /* Matchin
36b0: 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  g left table */.
36c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
36d0: 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69  tCol;  /* Matchi
36e0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ng column in the
36f0: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a   left table */..
3700: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3710: 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b  pRightTab->aCol[
3720: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
3730: 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f    if( tableAndCo
3740: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3750: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3760: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29  ft, &iLeftCol) )
3770: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
3780: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3790: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
37a0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a  eftCol, i+1, j,.
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
37d0: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
37e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
37f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
3800: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
3810: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
3820: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
3830: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3840: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70  pRight->pOn && p
3850: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3860: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3870: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3880: 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  cannot have both
3890: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a   ON and USING ".
38a0: 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73          "clauses
38b0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
38c0: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
38d0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
38e0: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
38f0: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
3900: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3910: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
3920: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
3930: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
3940: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3950: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
3960: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
3970: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
3980: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
3990: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
39a0: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
39b0: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
39c0: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
39d0: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
39e0: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
39f0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3a00: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
3a10: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
3a20: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
3a30: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
3a40: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
3a50: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
3a60: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
3a70: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3a80: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
3a90: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
3aa0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
3ab0: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
3ac0: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
3ad0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
3ae0: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
3af0: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
3b00: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
3b10: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
3b20: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
3b30: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
3b40: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3b50: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
3b60: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
3b70: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3b80: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
3b90: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
3ba0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
3bb0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
3bc0: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
3bd0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
3be0: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
3bf0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
3c00: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
3c10: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
3c20: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3c30: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3c40: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
3c50: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
3c60: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
3c70: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
3c80: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3c90: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
3ca0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3cb0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3cc0: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
3cd0: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
3ce0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3cf0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3d00: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
3d10: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
3d20: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
3d30: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3d40: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
3d50: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
3d60: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
3d70: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
3d80: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
3d90: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
3da0: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3db0: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3dc0: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
3dd0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3de0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3df0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3e00: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
3e10: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
3e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
3e30: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
3e40: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
3e50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
3e60: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
3e70: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
3e80: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3e90: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3ea0: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
3eb0: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
3ec0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3ed0: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3ee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3ef0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3f00: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
3f10: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
3f20: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
3f30: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
3f40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3f50: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
3f60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3f70: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
3f80: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
3f90: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
3fa0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
3fb0: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
3fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
3fd0: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
3fe0: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
3ff0: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
4000: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
4010: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
4020: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
4030: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65   */.);../*.** Ge
4040: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
4050: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
4060: 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65  ecord in registe
4070: 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68  rs regData.** th
4080: 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44  rough regData+nD
4090: 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73  ata-1 onto the s
40a0: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
40b0: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
40c0: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
40d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
40e0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
40f0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
4100: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  Sort,        /* 
4110: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
4120: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  t the ORDER BY c
4130: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
4140: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
4150: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
4160: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
4170: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
4180: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
4190: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
41a0: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
41b0: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74   sorted */.  int
41c0: 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20   nData,         
41d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
41e0: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
41f0: 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20   data array */. 
4200: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
4210: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4220: 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72  f reg prior to r
4230: 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65  egData available
4240: 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20   for use */.){. 
4250: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4260: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20    /* Stmt under 
4290: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
42a0: 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70    int bSeq = ((p
42b0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
42c0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
42d0: 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74  rter)==0);.  int
42e0: 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e   nExpr = pSort->
42f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4310: 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59   No. of ORDER BY
4320: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
4330: 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20  nBase = nExpr + 
4340: 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20  bSeq + nData;   
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4360: 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72  Fields in sorter
4370: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
4380: 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
43b0: 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72   Regs for sorter
43c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
43d0: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70   regRecord = ++p
43e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4400: 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65   Assembled sorte
4410: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4420: 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74  t nOBSat = pSort
4430: 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  ->nOBSat;       
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4450: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
4460: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e   to skip */.  in
4470: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64   /* Opcode to ad
44a0: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
44b0: 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20  to sorter */..  
44c0: 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20  assert( bSeq==0 
44d0: 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20  || bSeq==1 );.  
44e0: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20 29  if( nPrefixReg )
44f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
4500: 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b  refixReg==nExpr+
4510: 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42  bSeq );.    regB
4520: 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20  ase = regData - 
4530: 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20  nExpr - bSeq;.  
4540: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
4550: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
4560: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
4570: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
4580: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
4590: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
45a0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70  pParse, pSort->p
45b0: 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65  OrderBy, regBase
45c0: 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  , SQLITE_ECEL_DU
45d0: 50 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29  P);.  if( bSeq )
45e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
45f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
4600: 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69  quence, pSort->i
4610: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
4620: 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69  +nExpr);.  }.  i
4630: 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30  f( nPrefixReg==0
4640: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4650: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
4660: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
4670: 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c  Base+nExpr+bSeq,
4680: 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20   nData);.  }..  
4690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46a0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
46b0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
46c0: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
46d0: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
46e0: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
46f0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4700: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4710: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4720: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
4730: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
4740: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
4750: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
4760: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
4770: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4780: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
4790: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
47a0: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
47b0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
47c0: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
47d0: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
47e0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
47f0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
4800: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
4810: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
4820: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
4830: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
4840: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
4850: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
4860: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
4870: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
4880: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
4890: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
48a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
48b0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
48c0: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
48d0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
48e0: 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62   bSeq;.    if( b
48f0: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Seq ){.      add
4900: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4910: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4920: 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b  _IfNot, regBase+
4930: 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c  nExpr); .    }el
4940: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69  se{.      addrFi
4950: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
4960: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
4970: 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72  quenceTest, pSor
4980: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
4990: 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65    }.    VdbeCove
49a0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
49b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
49c0: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
49d0: 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73  gPrevKey, regBas
49e0: 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  e, pSort->nOBSat
49f0: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
4a00: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
4a10: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
4a20: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
4a30: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
4a40: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
4a50: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  n;.    pOp->p2 =
4a60: 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20   nKey + nData;. 
4a70: 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34     pKI = pOp->p4
4a80: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d  .pKeyInfo;.    m
4a90: 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74  emset(pKI->aSort
4aa0: 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e  Order, 0, pKI->n
4ab0: 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73  Field); /* Makes
4ac0: 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74   OP_Jump below t
4ad0: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4ae0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4af0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4b00: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4b10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4b20: 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20   pKI->nXField>2 
4b30: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
4b40: 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
4b50: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
4b60: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4b70: 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20  derBy, nOBSat,. 
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e            pKI->n
4bb0: 58 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61  XField-1);.    a
4bc0: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
4bd0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4be0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4bf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4c00: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
4c10: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
4c20: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4c30: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
4c40: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
4c50: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4c60: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
4c70: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
4c80: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
4c90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4ca0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
4cb0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
4cc0: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
4cd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4ce0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
4cf0: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
4d00: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4d10: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4d20: 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73  Here(v, addrFirs
4d30: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4d40: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
4d50: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67  se, regBase, reg
4d60: 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e  PrevKey, pSort->
4d70: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c  nOBSat);.    sql
4d80: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4d90: 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20  (v, addrJmp);.  
4da0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  }.  if( pSort->s
4db0: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
4dc0: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
4dd0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72  .    op = OP_Sor
4de0: 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c  terInsert;.  }el
4df0: 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  se{.    op = OP_
4e00: 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20  IdxInsert;.  }. 
4e10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e20: 70 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d  p2(v, op, pSort-
4e30: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
4e40: 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 53 65  cord);.  if( pSe
4e50: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
4e60: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
4e70: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
4e80: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
4e90: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
4ea0: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
4eb0: 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20  ->iOffset+1;.   
4ec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c   }else{.      iL
4ed0: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
4ee0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20  iLimit;.    }.  
4ef0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
4f00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4f10: 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d  _IfNotZero, iLim
4f20: 69 74 2c 20 30 2c 20 2d 31 29 3b 20 56 64 62 65  it, 0, -1); Vdbe
4f30: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4f40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f50: 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70  p1(v, OP_Last, p
4f60: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4f70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4f80: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
4f90: 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ete, pSort->iECu
4fa0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4fb0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4fc0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
4fd0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
4fe0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
4ff0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
5000: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
5010: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
5020: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5030: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5040: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
5050: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
5060: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
5070: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
5080: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
5090: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
50a0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
50b0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
50c0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
50d0: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  fset>0 ){.    in
50e0: 74 20 61 64 64 72 3b 0a 20 20 20 20 61 64 64 72  t addr;.    addr
50f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5100: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp3(v, OP_IfNeg
5110: 2c 20 69 4f 66 66 73 65 74 2c 20 30 2c 20 2d 31  , iOffset, 0, -1
5120: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
5130: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
5140: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5150: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
5160: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
5170: 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f  ment((v, "skip O
5180: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
5190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
51a0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
51b0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
51c0: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
51d0: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
51e0: 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67  e sure the N reg
51f0: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
5200: 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20  at iMem.** form 
5210: 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79  a distinct entry
5220: 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72  .  iTab is a sor
5230: 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
5240: 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79  holds previously
5250: 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61  .** seen combina
5260: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76  tions of the N v
5270: 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e  alues.  A new en
5280: 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69  try is made in i
5290: 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75  Tab.** if the cu
52a0: 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61  rrent N values a
52b0: 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20  re new..**.** A 
52c0: 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65  jump to addrRepe
52d0: 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74  at is made and t
52e0: 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72  he N+1 values ar
52f0: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
5300: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
5310: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
5320: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
5330: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5340: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a  d codeDistinct(.
5350: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5360: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
5370: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
5380: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5390: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
53a0: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
53b0: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
53c0: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
53d0: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
53e0: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
53f0: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
5400: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
5410: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
5420: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5430: 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  f elements */.  
5440: 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20  int iMem        
5450: 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d     /* First elem
5460: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
5470: 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a   *v;.  int r1;..
5480: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
5490: 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  dbe;.  r1 = sqli
54a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
54b0: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
54c0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
54d0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
54e0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65   addrRepeat, iMe
54f0: 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72  m, N); VdbeCover
5500: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
5510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5520: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
5530: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
5540: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5550: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
5560: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
5570: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5580: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5590: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
55a0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
55b0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
55c0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
55d0: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
55e0: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
55f0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
5600: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
5610: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
5620: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
5630: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
5640: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
5650: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
5660: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
5670: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
5680: 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a   used to occur.*
5690: 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  * in multiple pl
56a0: 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f  aces.  (The erro
56b0: 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e  r only occurs in
56c0: 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20   one place now, 
56d0: 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e  but we.** retain
56e0: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
56f0: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65  to minimize code
5700: 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f   disruption.).*/
5710: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
5720: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
5730: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
5740: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5750: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
5760: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
5770: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
5780: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
5790: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
57a0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
57b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
57c0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
57d0: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
57e0: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
57f0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
5800: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
5810: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
5820: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
5830: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
5840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5850: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
5860: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
5870: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
5880: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
5890: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
58a0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
58b0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
58c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
58d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23  eturn 0;.  }.}.#
58e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
58f0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
5900: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
5910: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
5920: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
5930: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
5940: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73  .** If srcTab is
5950: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
5960: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
5970: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
5980: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
5990: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
59a0: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
59b0: 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20  If srcTab is.** 
59c0: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68  zero or more, th
59d0: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
59e0: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
59f0: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
5a00: 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74   only .** to get
5a10: 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d 6e 73 20   number columns 
5a20: 61 6e 64 20 74 68 65 20 64 61 74 61 74 79 70 65  and the datatype
5a30: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
5a40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5a50: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
5a60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5a70: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
5a80: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
5a90: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
5aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5ab0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
5ac0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
5ad0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
5ae0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5af0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
5b00: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
5b10: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
5b20: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
5b30: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
5b40: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
5b50: 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74  able */.  SortCt
5b60: 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20  x *pSort,       
5b70: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
5b80: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5b90: 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42   process ORDER B
5ba0: 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  Y */.  DistinctC
5bb0: 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f  tx *pDistinct, /
5bc0: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
5bd0: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
5be0: 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a  ocess DISTINCT *
5bf0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
5c00: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
5c10: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
5c20: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
5c30: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
5c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5c50: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
5c60: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
5c70: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5c90: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
5ca0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
5cb0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
5cc0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5cd0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
5ce0: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
5cf0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
5d00: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
5d10: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
5d20: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
5d30: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
5d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
5d50: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
5d60: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
5d70: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
5d80: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
5d90: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
5da0: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
5db0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
5dc0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
5dd0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
5de0: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
5df0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
5e00: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
5e10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5e20: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
5e30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
5e40: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
5e50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
5e60: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
5e70: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
5e80: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
5e90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  );.  assert( pEL
5ea0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
5eb0: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
5ec0: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
5ed0: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
5ee0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
5ef0: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
5f00: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
5f10: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
5f20: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
5f30: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
5f40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
5f50: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
5f60: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
5f70: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
5f80: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
5f90: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
5fa0: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
5fb0: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
5fc0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
5fd0: 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ;..  if( pDest->
5fe0: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
5ff0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
6000: 20 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20     nPrefixReg = 
6010: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
6020: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >nExpr;.      if
6030: 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  ( !(pSort->sortF
6040: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
6050: 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72  UseSorter) ) nPr
6060: 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20  efixReg++;.     
6070: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6080: 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20   nPrefixReg;.   
6090: 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53   }.    pDest->iS
60a0: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
60b0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
60c0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
60d0: 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tCol;.  }else if
60e0: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e  ( pDest->iSdst+n
60f0: 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72  ResultCol > pPar
6100: 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  se->nMem ){.    
6110: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  /* This is an er
6120: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68  ror condition th
6130: 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66  at can result, f
6140: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
6150: 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a   a SELECT.    **
6160: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
6170: 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e  nd side of an IN
6180: 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  SERT contains mo
6190: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
61a0: 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  s than.    ** th
61b0: 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  ere are columns 
61c0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  in the table on 
61d0: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65  the left.  The e
61e0: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75  rror will be cau
61f0: 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72  ght.    ** and r
6200: 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20  eported later.  
6210: 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
6220: 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20  ake sure enough 
6230: 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
6240: 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76  ted.    ** to av
6250: 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f  oid other spurio
6260: 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  us errors in the
6270: 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20   meantime. */.  
6280: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
6290: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
62a0: 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  }.  pDest->nSdst
62b0: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
62c0: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
62d0: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28  st->iSdst;.  if(
62e0: 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20   srcTab>=0 ){.  
62f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
6300: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
6310: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6320: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6330: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
6340: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
6350: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
6360: 28 76 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  (v, "%s", pEList
6370: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  ->a[i].zName));.
6380: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
6390: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
63a0: 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sts ){.    /* If
63b0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
63c0: 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e   is an EXISTS(..
63d0: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  .) expression, t
63e0: 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a  he actual.    **
63f0: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
6400: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61   by the SELECT a
6410: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  re not required.
6420: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65  .    */.    u8 e
6430: 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20 69 66  celFlags;.    if
6440: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
6450: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f   || eDest==SRT_O
6460: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
6470: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
6480: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
6490: 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   = SQLITE_ECEL_D
64a0: 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  UP;.    }else{. 
64b0: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d       ecelFlags =
64c0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
64d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
64e0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
64f0: 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  List, regResult,
6500: 20 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d   ecelFlags);.  }
6510: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
6520: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
6530: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
6540: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6550: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
6560: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
6570: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
6580: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
6590: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
65a0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
65b0: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
65c0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74  inct ){.    swit
65d0: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
65e0: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
65f0: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
6600: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
6610: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
6620: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
6630: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
6640: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
6650: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
6660: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
6670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6680: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
6690: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
66a0: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
66b0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
66c0: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
66d0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
66e0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
66f0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
6700: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
6710: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
6720: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
6730: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
6740: 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20  esultCol;..     
6750: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
6760: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
6770: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
6780: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
6790: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
67a0: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
67b0: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
67c0: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
67d0: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
67e0: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
67f0: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
6800: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
6810: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
6820: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
6830: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
6840: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
6850: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
6860: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
6870: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
6880: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
6890: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
68a0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
68b0: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
68c0: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
68d0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
68e0: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
68f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
6900: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
6910: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
6920: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
6930: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
6940: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
6950: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
6960: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
6970: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20  ResultCol;.     
6980: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
6990: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
69a0: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
69b0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
69c0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
69d0: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
69e0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
69f0: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
6a00: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
6a10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6a20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
6a30: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
6a40: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
6a50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
6a60: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6a70: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
6a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6aa0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
6ab0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
6ac0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
6ad0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
6ae0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
6af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6b00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6b10: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
6b20: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
6b30: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
6b40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6b50: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
6b60: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
6b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6b80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6b90: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6ba0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
6bb0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
6bc0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
6bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6be0: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
6bf0: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
6c00: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
6c10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6c20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6c30: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
6c40: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
6c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6c60: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
6c70: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
6c80: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
6c90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
6ca0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
6cb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6cc0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
6cd0: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
6ce0: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
6cf0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
6d00: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
6d10: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
6d20: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
6d30: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
6d50: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
6d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6d70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
6d80: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
6d90: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6da0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
6db0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
6dc0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
6dd0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
6de0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
6df0: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
6e00: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
6e10: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
6e20: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
6e30: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
6e40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
6e50: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
6e60: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
6e70: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
6e80: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
6e90: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6ea0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
6eb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6ec0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6ed0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6ee0: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
6ef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6f00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
6f10: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
6f20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6f30: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6f40: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
6f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6f60: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
6f70: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
6f80: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
6f90: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
6fa0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
6fb0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
6fc0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
6fd0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
6fe0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
6ff0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
7000: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
7010: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
7020: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7030: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7040: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
7050: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
7060: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
7070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7080: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7090: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
70a0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
70b0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
70c0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
70d0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
70e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
70f0: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
7100: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
7110: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
7120: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
7130: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
7140: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
7150: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
7160: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
7170: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
7180: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
7190: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
71a0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
71b0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
71c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
71d0: 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29  Dest==SRT_Fifo )
71e0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
71f0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
7200: 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73  tFifo );.      s
7210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7220: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
7230: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
7240: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72  esultCol, r1+nPr
7250: 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65  efixReg);.#ifnde
7260: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
7270: 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  E.      if( eDes
7280: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7290: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
72a0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
72b0: 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68   is DistFifo, th
72c0: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
72d0: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
72e0: 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68      ** on an eph
72f0: 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66  emeral index. If
7300: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
7310: 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
7320: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ent.        ** i
7330: 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20  n the index, do 
7340: 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20  not write it to 
7350: 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e  the output. If n
7360: 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20  ot, add the.    
7370: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72      ** current r
7380: 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ow to the index 
7390: 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
73a0: 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74   writing it to t
73b0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
73c0: 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65  tput table as we
73d0: 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
73e0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
73f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
7400: 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20  r(v) + 4;.      
7410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7420: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
7430: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64  nd, iParm+1, add
7440: 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  r, r1, 0);.     
7450: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
7460: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
7470: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7480: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
7490: 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20  Parm+1, r1);.   
74a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f       assert( pSo
74b0: 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  rt==0 );.      }
74c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
74d0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
74e0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
74f0: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
7500: 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65   p, r1+nPrefixRe
7510: 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67  g, 1, nPrefixReg
7520: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7530: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
7540: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7550: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
7560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7570: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
7580: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
7590: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
75a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
75b0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
75c0: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
75d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
75e0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
75f0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
7600: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7610: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7620: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
7630: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7640: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7650: 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67  , r1, nPrefixReg
7660: 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +1);.      break
7670: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
7680: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
7690: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
76a0: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
76b0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
76c0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
76d0: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
76e0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
76f0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
7700: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
7710: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
7720: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
7730: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
7740: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
7750: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
7760: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
7770: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
7780: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
7790: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
77a0: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
77b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
77c0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
77d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
77e0: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
77f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
7800: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
7810: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
7820: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
7830: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
7840: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
7850: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
7860: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
7870: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
7880: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
7890: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
78a0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
78b0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
78c0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
78d0: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
78e0: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
78f0: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
7900: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
7910: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7920: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7930: 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69  esult, 1, nPrefi
7940: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
7950: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
7960: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7970: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
7980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7990: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
79a0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
79b0: 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65  esult,1,r1, &pDe
79c0: 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b  st->affSdst, 1);
79d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
79e0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
79f0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7a00: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
7a10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7a20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7a30: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7a40: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
7a50: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7a60: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
7a70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7a80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
7a90: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
7aa0: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
7ab0: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
7ac0: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
7ad0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
7ae0: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
7af0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7b00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7b10: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
7b20: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
7b30: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
7b40: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
7b50: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
7b60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7b70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
7b80: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
7b90: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
7ba0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
7bb0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
7bc0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
7bd0: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
7be0: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
7bf0: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
7c00: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
7c10: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
7c20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
7c30: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
7c40: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20  ( nResultCol==1 
7c50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7c60: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7c70: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7c80: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7c90: 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72  egResult, 1, nPr
7ca0: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
7cb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
7cc0: 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74  ssert( regResult
7cd0: 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20  ==iParm );.     
7ce0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
7cf0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
7d00: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
7d10: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
7d20: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7d30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
7d40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d50: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
7d60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
7d70: 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f  routine:       /
7d80: 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61  * Send data to a
7d90: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
7da0: 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70     case SRT_Outp
7db0: 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  ut: {        /* 
7dc0: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
7dd0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
7de0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7df0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
7e00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7e10: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
7e20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7e30: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7e40: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7e50: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7e60: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7e70: 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67  tCol, nPrefixReg
7e80: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7e90: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  f( eDest==SRT_Co
7ea0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
7eb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ec0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
7ed0: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
7ee0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7f00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7f10: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
7f20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7f30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7f40: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
7f50: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
7f60: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7f70: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
7f80: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7f90: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
7fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7fb0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
7fc0: 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72  esults into a pr
7fd0: 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68 61  iority queue tha
7fe0: 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72  t is order accor
7ff0: 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70  ding to.    ** p
8000: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28  Dest->pOrderBy (
8010: 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d  in pSO).  pDest-
8020: 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61  >iSDParm (in iPa
8030: 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73 6f  rm) is the curso
8040: 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  r for an.    ** 
8050: 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e  index with pSO->
8060: 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e  nExpr+2 columns.
8070: 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73    Build a key us
8080: 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20  ing pSO for the 
8090: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f  first.    ** pSO
80a0: 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c  ->nExpr columns,
80b0: 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
80c0: 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69  all keys are uni
80d0: 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a  que by adding a.
80e0: 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f      ** final OP_
80f0: 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e  Sequence column.
8100: 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d    The last colum
8110: 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64 20  n is the record 
8120: 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a  as a blob..    *
8130: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  /.    case SRT_D
8140: 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61  istQueue:.    ca
8150: 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a  se SRT_Queue: {.
8160: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a        int nKey;.
8170: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
8180: 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  , r3;.      int 
8190: 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20  addrTest = 0;.  
81a0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
81b0: 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70  O;.      pSO = p
81c0: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Dest->pOrderBy;.
81d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
81e0: 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20  O );.      nKey 
81f0: 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pSO->nExpr;.  
8200: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
8210: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
8220: 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  e);.      r2 = s
8230: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
8240: 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b  ge(pParse, nKey+
8250: 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72  2);.      r3 = r
8260: 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20  2+nKey+1;.      
8270: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
8280: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
8290: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
82a0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
82b0: 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72  tQueue, then cur
82c0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
82d0: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
82e0: 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68   on a second eph
82f0: 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61  emeral index tha
8300: 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75  t holds all valu
8310: 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f 75  es every previou
8320: 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  sly.        ** a
8330: 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 75  dded to the queu
8340: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64  e. */.        ad
8350: 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  drTest = sqlite3
8360: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
8370: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d   OP_Found, iParm
8380: 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  +1, 0, .        
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
83c0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
83d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
83e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
83f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8400: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8410: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
8420: 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20  esultCol, r3);. 
8430: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
8440: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
8450: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8460: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8470: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
8480: 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  m+1, r3);.      
8490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
84a0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
84b0: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
84c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
84d0: 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69  r(i=0; i<nKey; i
84e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
84f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8500: 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20  , OP_SCopy,.    
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 20        regResult 
8530: 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  + pSO->a[i].u.x.
8540: 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c  iOrderByCol - 1,
8550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8560: 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69 29             r2+i)
8570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8580: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8590: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
85a0: 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79  , iParm, r2+nKey
85b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
85c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
85d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c  _MakeRecord, r2,
85e0: 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20   nKey+2, r1);.  
85f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8600: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8610: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
8620: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64  );.      if( add
8630: 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33 56  rTest ) sqlite3V
8640: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
8650: 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20  ddrTest);.      
8660: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8670: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
8680: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8690: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
86a0: 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65  (pParse, r2, nKe
86b0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61  y+2);.      brea
86c0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
86d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
86e0: 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65  TE */....#if !de
86f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8700: 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f  T_TRIGGER).    /
8710: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65  * Discard the re
8720: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
8730: 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20  used for SELECT 
8740: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
8750: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64  e.    ** the bod
8760: 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20  y of a TRIGGER. 
8770: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
8780: 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20  such selects is 
8790: 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75  to call.    ** u
87a0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
87b0: 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
87c0: 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57  side effects.  W
87d0: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20  e do not care.  
87e0: 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61    ** about the a
87f0: 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66  ctual results of
8800: 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20   the select..   
8810: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
8820: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
8830: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63   eDest==SRT_Disc
8840: 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ard );.      bre
8850: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8860: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
8870: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
8880: 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
8890: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 20  MIT is reached. 
88a0: 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a   Except, if.  **
88b0: 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72 74   there is a sort
88c0: 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  er, in which cas
88d0: 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73  e the sorter has
88e0: 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64   already limited
88f0: 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  .  ** the output
8900: 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20   for us..  */.  
8910: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20  if( pSort==0 && 
8920: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
8930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8940: 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
8950: 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  pZero, p->iLimit
8960: 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
8970: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
8980: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
8990: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
89a0: 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f  ct sufficient fo
89b0: 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20  r an index of N 
89c0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a  key columns and.
89d0: 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d  ** X extra colum
89e0: 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ns..*/.KeyInfo *
89f0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
8a00: 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  loc(sqlite3 *db,
8a10: 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a   int N, int X){.
8a20: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73    KeyInfo *p = s
8a30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8a40: 72 6f 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20  ro(0, .         
8a50: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
8a60: 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b 58  (KeyInfo) + (N+X
8a70: 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  )*(sizeof(CollSe
8a80: 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28 20 70  q*)+1));.  if( p
8a90: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74   ){.    p->aSort
8aa0: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d  Order = (u8*)&p-
8ab0: 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20  >aColl[N+X];.   
8ac0: 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31   p->nField = (u1
8ad0: 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69  6)N;.    p->nXFi
8ae0: 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20  eld = (u16)X;.  
8af0: 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64    p->enc = ENC(d
8b00: 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
8b10: 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20  db;.    p->nRef 
8b20: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
8b30: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
8b40: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ed = 1;.  }.  re
8b50: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
8b60: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65   Deallocate a Ke
8b70: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
8b80: 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49  void sqlite3KeyI
8b90: 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f  nfoUnref(KeyInfo
8ba0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
8bb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8bc0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d  nRef>0 );.    p-
8bd0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
8be0: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71   p->nRef==0 ) sq
8bf0: 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
8c00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8c10: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
8c20: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
8c30: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
8c40: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
8c50: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
8c60: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
8c70: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
8c80: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
8c90: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
8ca0: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
8cb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
8cc0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
8cd0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
8ce0: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
8cf0: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
8d00: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
8d10: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
8d20: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
8d30: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
8d40: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
8d50: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8d60: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
8d70: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
8d80: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
8d90: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
8da0: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
8db0: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
8dc0: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
8dd0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8de0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
8df0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
8e00: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
8e10: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
8e20: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
8e30: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
8e40: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
8e50: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
8e60: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
8e70: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
8e80: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
8e90: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
8ea0: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
8eb0: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
8ec0: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
8ed0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
8ee0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
8ef0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
8f00: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
8f10: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
8f20: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
8f30: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
8f40: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
8f50: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
8f60: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
8f70: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
8f80: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
8f90: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
8fa0: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
8fb0: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
8fc0: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
8fd0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
8fe0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
8ff0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
9000: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
9010: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
9020: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
9030: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
9040: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
9050: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
9060: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
9070: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
9080: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
9090: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
90a0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
90b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
90c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
90d0: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
90e0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
90f0: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
9100: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
9110: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
9120: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
9130: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
9140: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
9150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9160: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
9170: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
9180: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
9190: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
91a0: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
91b0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
91c0: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
91d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
91e0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
91f0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
9200: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
9210: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
9220: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
9230: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
9240: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
9250: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9260: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
9270: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
9280: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
9290: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
92a0: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
92b0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
92c0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
92d0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
92e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
92f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
9300: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
9310: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
9320: 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
9330: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  fltColl;.      p
9340: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53  Info->aColl[i-iS
9350: 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  tart] = pColl;. 
9360: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
9370: 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d  tOrder[i-iStart]
9380: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
9390: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
93a0: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
93b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
93c0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
93d0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
93e0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
93f0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
9400: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
9410: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
9420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
9430: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
9440: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
9450: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
9460: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
9470: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
9480: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
9490: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
94a0: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
94b0: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
94c0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
94d0: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
94e0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
94f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
9500: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
9510: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
9520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
9530: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
9540: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
9550: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66  D_SELECT */..#if
9560: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9570: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
9580: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
9590: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
95a0: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
95b0: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
95c0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
95d0: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
95e0: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
95f0: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
9600: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
9610: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
9620: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
9630: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
9640: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
9650: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
9660: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
9670: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
9680: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
9690: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
96a0: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
96b0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
96c0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
96d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
96e0: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
96f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9700: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
9710: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  age){.  if( pPar
9720: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
9730: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
9740: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
9750: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
9760: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
9770: 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20  Parse->db, "USE 
9780: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
9790: 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20  %s", zUsage);.  
97a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
97b0: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
97c0: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
97d0: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
97e0: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
97f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69   }.}../*.** Assi
9800: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
9810: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
9820: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
9830: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
9840: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
9850: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
9860: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
9870: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
9880: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
9890: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
98a0: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
98b0: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
98c0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
98d0: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
98e0: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
98f0: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
9900: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
9910: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
9920: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
9930: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
9940: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
9950: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
9960: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
9970: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
9980: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
9990: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
99a0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
99b0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
99c0: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
99d0: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
99e0: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
99f0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
9a00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9a10: 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64  T_EXPLAIN) && !d
9a20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9a30: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
9a40: 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  CT)./*.** Unless
9a50: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
9a60: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
9a70: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
9a80: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
9a90: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
9aa0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
9ab0: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
9ac0: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
9ad0: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
9ae0: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
9af0: 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ion is of one of
9b00: 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a   the two forms:.
9b10: 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  **.**   "COMPOSI
9b20: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
9b30: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f  ub1 and iSub2 (o
9b40: 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  p)".**   "COMPOS
9b50: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
9b60: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55  Sub1 and iSub2 U
9b70: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
9b80: 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65   (op)".**.** whe
9b90: 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  re iSub1 and iSu
9ba0: 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  b2 are the integ
9bb0: 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ers passed as th
9bc0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
9bd0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ** function para
9be0: 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69  meters, and op i
9bf0: 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  s the text repre
9c00: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
9c10: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
9c20: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
9c30: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f  The parameter "o
9c40: 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p" must be one o
9c50: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
9c60: 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54  XCEPT,.** TK_INT
9c70: 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c  ERSECT or TK_ALL
9c80: 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  . The first form
9c90: 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75   is used if argu
9ca0: 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20  ment bUseTmp is 
9cb0: 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68  .** false, or th
9cc0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66  e second form if
9cd0: 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   it is true..*/.
9ce0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
9cf0: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20  ainComposite(.  
9d00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
9d30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
9d60: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
9d70: 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  EPT etc. */.  in
9d80: 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20  t iSub1,        
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9da0: 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a   Subquery id 1 *
9db0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20  /.  int iSub2,  
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
9de0: 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55  id 2 */.  int bU
9df0: 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20  seTmp           
9e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
9e10: 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c  e if a temp tabl
9e20: 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b  e was used */.){
9e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
9e40: 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54  K_UNION || op==T
9e50: 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
9e60: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20  TK_INTERSECT || 
9e70: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20  op==TK_ALL );.  
9e80: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
9e90: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
9ea0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9eb0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
9ec0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
9ed0: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
9ee0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d  pParse->db, "COM
9ef0: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
9f00: 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73   %d AND %d %s(%s
9f10: 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  )", iSub1, iSub2
9f20: 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d  ,.        bUseTm
9f30: 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  p?"USING TEMP B-
9f40: 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63  TREE ":"", selec
9f50: 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20  tOpName(op).    
9f60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9f70: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
9f80: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
9f90: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
9fa0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
9fb0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
9fc0: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
9fd0: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
9fe0: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
9ff0: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
a000: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43   define explainC
a010: 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79  omposite(v,w,x,y
a020: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
a030: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
a040: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
a050: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
a060: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
a070: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
a080: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
a090: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
a0a0: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
a0b0: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
a0c0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
a0d0: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
a0e0: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
a0f0: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
a100: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
a110: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
a120: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
a130: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
a140: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
a150: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
a160: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
a170: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
a180: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
a190: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
a1a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
a1b0: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
a1c0: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
a1d0: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
a1e0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
a1f0: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
a200: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
a210: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
a220: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
a230: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
a240: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
a250: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
a260: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a270: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
a280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a290: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
a2a0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
a2b0: 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  drBreak = sqlite
a2c0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a2d0: 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  );     /* Jump h
a2e0: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
a2f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
a300: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
a310: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
a320: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
a330: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
a340: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  /.  int addr;.  
a350: 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
a360: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
a370: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
a380: 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  By = pSort->pOrd
a390: 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73  erBy;.  int eDes
a3a0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
a3b0: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
a3c0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a  pDest->iSDParm;.
a3d0: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
a3e0: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20  int regRowid;.  
a3f0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  int nKey;.  int 
a400: 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20  iSortTab;       
a410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a420: 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20  orter cursor to 
a430: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
a440: 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20 20  nt nSortData;   
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a460: 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75 65  * Trailing value
a470: 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 73  s to read from s
a480: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  orter */.  int i
a490: 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20  ;.  int bSeq;   
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
a4c0: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63  orter record inc
a4d0: 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a  ludes seq. no. *
a4e0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
a4f0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
a500: 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63 74  OMMENTS.  struct
a510: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
a520: 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69  aOutEx = p->pELi
a530: 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a 20  st->a;.#endif.. 
a540: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65   if( pSort->labe
a550: 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  lBkOut ){.    sq
a560: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a570: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f  v, OP_Gosub, pSo
a580: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  rt->regReturn, p
a590: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a5a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a5b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
a5c0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 42 72 65 61  oto, 0, addrBrea
a5d0: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
a5e0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
a5f0: 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  v, pSort->labelB
a600: 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61  kOut);.  }.  iTa
a610: 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  b = pSort->iECur
a620: 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  sor;.  if( eDest
a630: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
a640: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
a650: 74 69 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52  tine ){.    regR
a660: 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  owid = 0;.    re
a670: 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53  gRow = pDest->iS
a680: 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61  dst;.    nSortDa
a690: 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ta = nColumn;.  
a6a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f  }else{.    regRo
a6b0: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
a6c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a6d0: 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71  .    regRow = sq
a6e0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
a6f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f  pParse);.    nSo
a700: 72 74 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a  rtData = 1;.  }.
a710: 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42    nKey = pOrderB
a720: 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74  y->nExpr - pSort
a730: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20  ->nOBSat;.  if( 
a740: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
a750: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
a760: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  orter ){.    int
a770: 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b   regSortOut = ++
a780: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
a790: 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61    iSortTab = pPa
a7a0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
a7b0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65   if( pSort->labe
a7c0: 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  lBkOut ){.      
a7d0: 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74  addrOnce = sqlit
a7e0: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
a7f0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
a800: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
a810: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a820: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
a830: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
a840: 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b  SortOut, nKey+1+
a850: 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20  nSortData);.    
a860: 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73  if( addrOnce ) s
a870: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
a880: 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b  re(v, addrOnce);
a890: 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20  .    addr = 1 + 
a8a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a8b0: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
a8c0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
a8d0: 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
a8e0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63  verage(v);.    c
a8f0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
a900: 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  iOffset, addrCon
a910: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
a920: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a930: 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
a940: 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  iTab, regSortOut
a950: 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20  , iSortTab);.   
a960: 20 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c   bSeq = 0;.  }el
a970: 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  se{.    addr = 1
a980: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
a990: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  dOp2(v, OP_Sort,
a9a0: 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b   iTab, addrBreak
a9b0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
a9c0: 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  v);.    codeOffs
a9d0: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
a9e0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
a9f0: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
aa00: 69 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d  iTab;.    bSeq =
aa10: 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   1;.  }.  for(i=
aa20: 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20  0; i<nSortData; 
aa30: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
aa40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
aa50: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54  P_Column, iSortT
aa60: 61 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c  ab, nKey+bSeq+i,
aa70: 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20   regRow+i);.    
aa80: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
aa90: 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  "%s", aOutEx[i].
aaa0: 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69  zName ? aOutEx[i
aab0: 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78  ].zName : aOutEx
aac0: 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d  [i].zSpan));.  }
aad0: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
aae0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
aaf0: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
ab00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ab10: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
ab20: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  wid, iParm, regR
ab30: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
ab40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ab50: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
ab60: 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  rm, regRow, regR
ab70: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
ab80: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
ab90: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
aba0: 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  D);.      break;
abb0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
abc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
abd0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
abe0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
abf0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
ac00: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
ac10: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
ac20: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
ac30: 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69  gRow, 1, regRowi
ac40: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
ac50: 20 20 20 20 20 20 20 20 20 20 20 26 70 44 65 73             &pDes
ac60: 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a  t->affSdst, 1);.
ac70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ac80: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
ac90: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
aca0: 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  Row, 1);.      s
acb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
acc0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
acd0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
ace0: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
acf0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ad00: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
ad10: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
ad20: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
ad30: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
ad40: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
ad50: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
ad60: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
ad70: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
ad80: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
ad90: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
ada0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
adb0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
adc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
add0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
ade0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
adf0: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
ae00: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
ae10: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
ae20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ae30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
ae40: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
ae50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
ae60: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
ae70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ae80: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
ae90: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
aea0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
aeb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
aec0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
aed0: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
aee0: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
aef0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
af00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
af10: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
af20: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
af30: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
af40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
af50: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
af60: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c  Rowid ){.    sql
af70: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
af80: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
af90: 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  w);.    sqlite3R
afa0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
afb0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
afc0: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f  .  }.  /* The bo
afd0: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
afe0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
aff0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b000: 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  v, addrContinue)
b010: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  ;.  if( pSort->s
b020: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
b030: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
b040: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b050: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
b060: 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  terNext, iTab, a
b070: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
b080: 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(v);.  }else{.
b090: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b0a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
b0b0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
b0c0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b0d0: 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d    }.  if( pSort-
b0e0: 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c  >regReturn ) sql
b0f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
b100: 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f  , OP_Return, pSo
b110: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  rt->regReturn);.
b120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b130: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
b140: 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rBreak);.}../*.*
b150: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
b160: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
b170: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
b180: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
b190: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
b1a0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
b1b0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
b1c0: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
b1d0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
b1e0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74  **.** Also try t
b1f0: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73  o estimate the s
b200: 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ize of the retur
b210: 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65  ned value and re
b220: 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73  turn that.** res
b230: 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74  ult in *pEstWidt
b240: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  h..**.** The dec
b250: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
b260: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
b270: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
b280: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
b290: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
b2a0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
b2b0: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
b2c0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
b2d0: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
b2e0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
b2f0: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
b300: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
b310: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
b320: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
b330: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
b340: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
b350: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
b360: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
b370: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
b380: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
b390: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b3a0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
b3b0: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
b3c0: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
b3d0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
b3e0: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
b3f0: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
b400: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
b410: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
b420: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
b430: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
b440: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
b450: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
b460: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
b470: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
b480: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
b490: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
b4a0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
b4b0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
b4c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b4d0: 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20  tine has either 
b4e0: 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72  3 or 6 parameter
b4f0: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  s depending on w
b500: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
b510: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
b520: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
b530: 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TA compile-time 
b540: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
b550: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
b560: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
b570: 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65  ETADATA.# define
b580: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
b590: 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54  C,D,E,F) columnT
b5a0: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
b5b0: 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66  E,F).#else /* if
b5c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b5d0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
b5e0: 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65  ETADATA) */.# de
b5f0: 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28  fine columnType(
b600: 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c  A,B,C,D,E,F) col
b610: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
b620: 46 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  F).#endif.static
b630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
b640: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
b650: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
b660: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
b670: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b680: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b690: 41 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68  ADATA.  const ch
b6a0: 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20  ar **pzOrigDb,. 
b6b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
b6c0: 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74  OrigTab,.  const
b6d0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f   char **pzOrigCo
b6e0: 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a  l,.#endif.  u8 *
b6f0: 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63  pEstWidth.){.  c
b700: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
b710: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
b720: 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31   u8 estWidth = 1
b730: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
b740: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b750: 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f  TADATA.  char co
b760: 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  nst *zOrigDb = 0
b770: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
b780: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
b790: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
b7a0: 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  gCol = 0;.#endif
b7b0: 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  ..  if( NEVER(pE
b7c0: 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e  xpr==0) || pNC->
b7d0: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
b7e0: 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68  turn 0;.  switch
b7f0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
b800: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
b810: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
b820: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
b830: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
b840: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
b850: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
b860: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
b870: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
b880: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
b890: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
b8a0: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
b8b0: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
b8c0: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
b8d0: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
b8e0: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
b8f0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
b900: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b910: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
b920: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
b930: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
b940: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
b950: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b960: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
b970: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
b980: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
b990: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
b9a0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
b9b0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
b9c0: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
b9d0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
b9e0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
b9f0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
ba00: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
ba10: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
ba20: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
ba30: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
ba40: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54       SrcList *pT
ba50: 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  abList = pNC->pS
ba60: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  rcList;.        
ba70: 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69  for(j=0;j<pTabLi
ba80: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
ba90: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
baa0: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
bab0: 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  e;j++);.        
bac0: 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  if( j<pTabList->
bad0: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
bae0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
baf0: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
bb00: 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61          pS = pTa
bb10: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c  bList->a[j].pSel
bb20: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ect;.        }el
bb30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
bb40: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
bb50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bb60: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
bb70: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
bb80: 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20  /* At one time, 
bb90: 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45  code such as "SE
bba0: 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68  LECT new.x" with
bbb0: 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75  in a trigger wou
bbc0: 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ld.        ** ca
bbd0: 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69  use this conditi
bbe0: 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63  on to run.  Sinc
bbf0: 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20  e then, we have 
bc00: 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77  restructured how
bc10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67  .        ** trig
bc20: 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65  ger code is gene
bc30: 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69  rated and so thi
bc40: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  s condition is n
bc50: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
bc60: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48    ** possible. H
bc70: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73  owever, it can s
bc80: 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72  till be true for
bc90: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
bca0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
bcb0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
bcc0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
bcd0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
bce0: 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b  t1(col INTEGER);
bcf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
bd00: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e  LECT (SELECT t1.
bd10: 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74  col) FROM FROM t
bd20: 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  1;.        **.  
bd30: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f        ** when co
bd40: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
bd50: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
bd60: 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20  ession "t1.col" 
bd70: 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
bd80: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49  ** sub-select. I
bd90: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74  n this case, set
bda0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
bdb0: 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20   to NULL, even. 
bdc0: 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68         ** though
bdd0: 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c   it should reall
bde0: 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a  y be "INTEGER"..
bdf0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
be00: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
be10: 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20  t a problem, as 
be20: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
be30: 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e  of "t1.col" is n
be40: 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ever.        ** 
be50: 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d  used. When colum
be60: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
be70: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
be80: 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ion .        ** 
be90: 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29  "(SELECT t1.col)
bea0: 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  ", the correct t
beb0: 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ype is returned 
bec0: 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45  (see the TK_SELE
bed0: 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72  CT.        ** br
bee0: 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  anch below.  */.
bef0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bf00: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
bf10: 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45  sert( pTab && pE
bf20: 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20  xpr->pTab==pTab 
bf30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
bf40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
bf50: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
bf60: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
bf70: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
bf80: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
bf90: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
bfa0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
bfb0: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
bfc0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
bfd0: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
bfe0: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
bff0: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
c000: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
c010: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
c020: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
c030: 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Col>=0 && ALWAYS
c040: 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74  (iCol<pS->pEList
c050: 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
c060: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c        /* If iCol
c070: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
c080: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ro, then the exp
c090: 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73  ression requests
c0a0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
c0b0: 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73  * rowid of the s
c0c0: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
c0d0: 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69  w. This expressi
c0e0: 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65  on is legal (see
c0f0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
c100: 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32  est case misc2.2
c110: 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20  .2) - it always 
c120: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
c130: 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  L..          **.
c140: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65            ** The
c150: 20 41 4c 57 41 59 53 28 29 20 69 73 20 62 65 63   ALWAYS() is bec
c160: 61 75 73 65 20 69 43 6f 6c 3e 3d 70 53 2d 3e 70  ause iCol>=pS->p
c170: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 77 69 6c  EList->nExpr wil
c180: 6c 20 68 61 76 65 20 62 65 65 6e 0a 20 20 20 20  l have been.    
c190: 20 20 20 20 20 20 2a 2a 20 63 61 75 67 68 74 20        ** caught 
c1a0: 61 6c 72 65 61 64 79 20 62 79 20 6e 61 6d 65 20  already by name 
c1b0: 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20 20  resolution..    
c1c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c1d0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
c1e0: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
c1f0: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
c200: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
c210: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
c220: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
c230: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
c240: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
c250: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
c260: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
c270: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
c280: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
c290: 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67  e(&sNC, p,&zOrig
c2a0: 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f  Db,&zOrigTab,&zO
c2b0: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
c2c0: 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  h); .        }. 
c2d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
c2e0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
c2f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
c300: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
c310: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
c320: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
c330: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
c340: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
c350: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
c360: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
c370: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
c380: 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ol) );.#ifdef SQ
c390: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c3a0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
c3b0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
c3c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
c3d0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
c3e0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
c3f0: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
c400: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c410: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
c420: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
c430: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
c440: 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d  zOrigCol = pTab-
c450: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
c460: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
c470: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
c480: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
c490: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c4a0: 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61    zOrigTab = pTa
c4b0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
c4c0: 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73    if( pNC->pPars
c4d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
c4e0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
c4f0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e  SchemaToIndex(pN
c500: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
c510: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
c520: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62           zOrigDb
c530: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
c540: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
c550: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
c560: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
c570: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
c580: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
c590: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
c5a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c5b0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
c5c0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
c5d0: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
c5e0: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
c5f0: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
c600: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
c610: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
c620: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
c630: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
c640: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
c650: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
c660: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
c670: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
c680: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
c690: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
c6a0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
c6b0: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
c6c0: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
c6d0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
c6e0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
c6f0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
c700: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
c710: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
c720: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
c730: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
c740: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
c750: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
c760: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
c770: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
c780: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
c790: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
c7a0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
c7b0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
c7c0: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
c7d0: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
c7e0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
c7f0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
c800: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
c810: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
c820: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
c830: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  ab, &zOrigCol, &
c840: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
c850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
c860: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65  endif.  }..#ifde
c870: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c880: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
c890: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62   .  if( pzOrigDb
c8a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c8b0: 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f  pzOrigTab && pzO
c8c0: 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  rigCol );.    *p
c8d0: 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44  zOrigDb = zOrigD
c8e0: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61  b;.    *pzOrigTa
c8f0: 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20  b = zOrigTab;.  
c900: 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a    *pzOrigCol = z
c910: 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e  OrigCol;.  }.#en
c920: 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69  dif.  if( pEstWi
c930: 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68  dth ) *pEstWidth
c940: 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72   = estWidth;.  r
c950: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
c960: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
c970: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
c980: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
c990: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
c9a0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
c9b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
c9c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
c9d0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
c9e0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
c9f0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
ca00: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
ca10: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
ca20: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
ca30: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
ca40: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
ca50: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
ca60: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
ca70: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
ca80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ca90: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
caa0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
cab0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
cac0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
cad0: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
cae0: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
caf0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
cb00: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  arse;.  for(i=0;
cb10: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
cb20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
cb30: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
cb40: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
cb50: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
cb60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cb70: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
cb80: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
cb90: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
cba0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
cbb0: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
cbc0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
cbd0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
cbe0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
cbf0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
cc00: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
cc10: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30  ab, &zOrigCol, 0
cc20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
cc30: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
cc40: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
cc50: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
cc60: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
cc70: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
cc80: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
cc90: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
cca0: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
ccb0: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
ccc0: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
ccd0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
cce0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ccf0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
cd00: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
cd10: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
cd20: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
cd30: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
cd40: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
cd50: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
cd60: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
cd70: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
cd80: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
cd90: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
cda0: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
cdb0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cdc0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
cdd0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
cde0: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c  sNC, p, 0, 0, 0,
cdf0: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
ce00: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
ce10: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
ce20: 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54  AME_DECLTYPE, zT
ce30: 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ype, SQLITE_TRAN
ce40: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64  SIENT);.  }.#end
ce50: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
ce60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
ce70: 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  YPE) */.}../*.**
ce80: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ce90: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
cea0: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
ceb0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
cec0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
ced0: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
cee0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
cef0: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
cf00: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
cf10: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
cf20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
cf30: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
cf40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
cf50: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
cf60: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
cf70: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
cf80: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
cf90: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
cfa0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
cfb0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
cfc0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
cfd0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
cfe0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
cff0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
d000: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
d010: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d020: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
d030: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
d040: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d050: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
d060: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
d070: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
d080: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
d090: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
d0a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
d0b0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
d0c0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
d0d0: 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20   || NEVER(v==0) 
d0e0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
d0f0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
d100: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
d110: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
d120: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
d130: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
d140: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
d150: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
d160: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
d170: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
d180: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
d190: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
d1a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
d1b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
d1c0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
d1d0: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
d1e0: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
d1f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
d200: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63   NEVER(p==0) ) c
d210: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
d220: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
d230: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
d240: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
d250: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
d260: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d270: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d280: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d290: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Name, SQLITE_TRA
d2a0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c  NSIENT);.    }el
d2b0: 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54  se if( (p->op==T
d2c0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f  K_COLUMN || p->o
d2d0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
d2e0: 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  ) && pTabList ){
d2f0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
d300: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
d310: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
d320: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
d330: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
d340: 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c  ; ALWAYS(j<pTabL
d350: 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29  ist->nSrc); j++)
d360: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
d370: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
d380: 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20  rsor==p->iTable 
d390: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
d3a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
d3b0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
d3c0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
d3d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
d3e0: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Tab;.      if( i
d3f0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
d400: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
d410: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
d420: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
d430: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
d440: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
d450: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
d460: 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22    zCol = "rowid"
d470: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d480: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
d490: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
d4a0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
d4b0: 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61      if( !shortNa
d4c0: 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65  mes && !fullName
d4d0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
d4e0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d4f0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d500: 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20  _NAME, .        
d510: 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72      sqlite3DbStr
d520: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
d530: 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c  a[i].zSpan), SQL
d540: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
d550: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75      }else if( fu
d560: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
d570: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
d580: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
d590: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
d5a0: 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
d5b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
d5c0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
d5d0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d5e0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d5f0: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
d600: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
d610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d630: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d640: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
d650: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
d660: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ENT);.      }.  
d670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
d680: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
d690: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
d6a0: 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d  n;.      z = z==
d6b0: 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  0 ? sqlite3MPrin
d6c0: 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64  tf(db, "column%d
d6d0: 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65  ", i+1) : sqlite
d6e0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29  3DbStrDup(db, z)
d6f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d700: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d710: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d720: 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  , z, SQLITE_DYNA
d730: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
d740: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
d750: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
d760: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
d770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
d780: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
d790: 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61  st (which is rea
d7a0: 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20  lly the list of 
d7b0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
d7c0: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73  hat form the res
d7d0: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
d7e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63  ECT statement) c
d7f0: 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61  ompute appropria
d800: 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d  te.** column nam
d810: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74  es for a table t
d820: 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  hat would hold t
d830: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
d840: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  st..**.** All co
d850: 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20  lumn names will 
d860: 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a  be unique..**.**
d870: 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   Only the column
d880: 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75   names are compu
d890: 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79  ted.  Column.zTy
d8a0: 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  pe, Column.zColl
d8b0: 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  ,.** and other f
d8c0: 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20  ields of Column 
d8d0: 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
d8e0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
d8f0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
d900: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
d910: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
d920: 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55  urs,.** store NU
d930: 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64  LL in *paCol and
d940: 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64   0 in *pnCol and
d950: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d960: 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  OMEM..*/.static 
d970: 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  int selectColumn
d980: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  sFromExprList(. 
d990: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d9b0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d9c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
d9d0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  t,       /* Expr
d9e0: 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68   list from which
d9f0: 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d   to derive colum
da00: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36  n names */.  i16
da10: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
da20: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
da30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
da40: 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f  mns here */.  Co
da50: 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20  lumn **paCol    
da60: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
da70: 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69  he new column li
da80: 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  st here */.){.  
da90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
daa0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44  arse->db;   /* D
dab0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
dac0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  on */.  int i, j
dad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dae0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
daf0: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
db00: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
db10: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61        /* Index a
db20: 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  dded to make the
db30: 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a   name unique */.
db40: 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20    Column *aCol, 
db50: 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a  *pCol;        /*
db60: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
db70: 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  r result columns
db80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
dbb0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
dbc0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
dbd0: 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  pr *p;          
dbe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
dbf0: 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69  ression for a si
dc00: 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
dc10: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  mn */.  char *zN
dc20: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
dc30: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
dc40: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
dc50: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
dc60: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
dc70: 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a  ame in zName[] *
dc80: 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  /..  if( pEList 
dc90: 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
dca0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
dcb0: 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
dcc0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
dcd0: 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
dce0: 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
dcf0: 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
dd00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
dd10: 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20  l = 0;.    aCol 
dd20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f  = 0;.  }.  *pnCo
dd30: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
dd40: 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
dd50: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
dd60: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
dd70: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47  Col++){.    /* G
dd80: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
dd90: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
dda0: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
ddb0: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
ddc0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
ddd0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
dde0: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
ddf0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
de00: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
de10: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
de20: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
de30: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
de40: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
de50: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
de60: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
de70: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
de80: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
de90: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
dea0: 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20  olExpr = p;  /* 
deb0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
dec0: 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  hat is the resul
ded0: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  t column name */
dee0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
def0: 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab;         /* T
df00: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
df10: 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73  with this expres
df20: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68  sion */.      wh
df30: 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ile( pColExpr->o
df40: 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
df50: 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20       pColExpr = 
df60: 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74  pColExpr->pRight
df70: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
df80: 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b  ( pColExpr!=0 );
df90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
dfa0: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
dfb0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c  =TK_COLUMN && AL
dfc0: 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70  WAYS(pColExpr->p
dfd0: 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Tab!=0) ){.     
dfe0: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
dff0: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
e000: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
e010: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
e020: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
e030: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  mn;.        pTab
e040: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
e050: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
e060: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
e070: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
e080: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e090: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e0a0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
e0b0: 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20        iCol>=0 ? 
e0c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
e0d0: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
e0e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e0f0: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
e100: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
e110: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
e120: 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
e130: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
e140: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
e150: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
e160: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43  ntf(db, "%s", pC
e170: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
e180: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e190: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
e1a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
e1b0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
e1c0: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
e1d0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
e1e0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e1f0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
e200: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  , pEList->a[i].z
e210: 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Span);.      }. 
e220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
e230: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
e250: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
e260: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e270: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
e280: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
e290: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
e2a0: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
e2b0: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
e2c0: 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e   ** append an in
e2d0: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
e2e0: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
e2f0: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
e300: 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20   */.    nName = 
e310: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e320: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
e330: 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  j=cnt=0; j<i; j+
e340: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
e350: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
e360: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
e370: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
e380: 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b   char *zNewName;
e390: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  .        int k;.
e3a0: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e 4e          for(k=nN
e3b0: 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73 71  ame-1; k>1 && sq
e3c0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
e3d0: 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20  me[k]); k--){}. 
e3e0: 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 30 20         if( k>=0 
e3f0: 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a 27  && zName[k]==':'
e400: 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20 20   ) nName = k;.  
e410: 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d        zName[nNam
e420: 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  e] = 0;.        
e430: 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74  zNewName = sqlit
e440: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
e450: 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b  s:%d", zName, ++
e460: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  cnt);.        sq
e470: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e480: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
e490: 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65  zName = zNewName
e4a0: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  ;.        j = -1
e4b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
e4c0: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ame==0 ) break;.
e4d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e4e0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
e4f0: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zName;.  }.  if(
e500: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e510: 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
e520: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
e530: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e540: 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
e550: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
e560: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e570: 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
e580: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
e590: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
e5a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e5b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
e5c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e5d0: 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63  * Add type and c
e5e0: 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
e5f0: 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  tion to a column
e600: 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a   list based on.*
e610: 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  * a SELECT state
e620: 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ment..** .** The
e630: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65   column list pre
e640: 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f  sumably came fro
e650: 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61  m selectColumnNa
e660: 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mesFromExprList(
e670: 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  )..** The column
e680: 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e   list has only n
e690: 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20  ames, not types 
e6a0: 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20  or collations.  
e6b0: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
e6c0: 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64  goes through and
e6d0: 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20   adds the types 
e6e0: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a  and collations..
e6f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e700: 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ne requires that
e710: 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73   all identifiers
e720: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a   in the SELECT.*
e730: 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72  * statement be r
e740: 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  esolved..*/.stat
e750: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64  ic void selectAd
e760: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
e770: 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  llation(.  Parse
e780: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e790: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
e7a0: 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20  exts */.  Table 
e7b0: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
e7c0: 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79  /* Add column ty
e7d0: 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  pe information t
e7e0: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
e7f0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
e800: 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43  t       /* SELEC
e810: 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  T used to determ
e820: 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  ine types and co
e830: 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  llations */.){. 
e840: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e850: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d  Parse->db;.  Nam
e860: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
e870: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
e880: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
e890: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
e8a0: 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  *p;.  struct Exp
e8b0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
e8c0: 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a   u64 szAll = 0;.
e8d0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
e8e0: 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
e8f0: 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
e900: 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
e910: 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
e920: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
e930: 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
e940: 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
e950: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
e960: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
e970: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
e980: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
e990: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
e9a0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
e9b0: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
e9c0: 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
e9d0: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
e9e0: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
e9f0: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
ea00: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
ea10: 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  {.    p = a[i].p
ea20: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 43  Expr;.    if( pC
ea30: 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 7b 0a  ol->zType==0 ){.
ea40: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70        pCol->zTyp
ea50: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
ea60: 44 75 70 28 64 62 2c 20 0a 20 20 20 20 20 20 20  Dup(db, .       
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
ea90: 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c  , p,0,0,0, &pCol
eaa0: 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 7d  ->szEst));.    }
eab0: 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43  .    szAll += pC
eac0: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70  ol->szEst;.    p
ead0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
eae0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
eaf0: 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
eb00: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
eb10: 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  0 ) pCol->affini
eb20: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
eb30: 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  BLOB;.    pColl 
eb40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
eb50: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
eb60: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  .    if( pColl &
eb70: 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30  & pCol->zColl==0
eb80: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
eb90: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44  zColl = sqlite3D
eba0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c  bStrDup(db, pCol
ebb0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
ebc0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54  .  }.  pTab->szT
ebd0: 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  abRow = sqlite3L
ebe0: 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a  ogEst(szAll*4);.
ebf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
ec00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ec10: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
ec20: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
ec30: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
ec40: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
ec50: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
ec60: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
ec70: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
ec80: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
ec90: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
eca0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
ecb0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
ecc0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ecd0: 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
ece0: 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
ecf0: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
ed00: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
ed10: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
ed20: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
ed30: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
ed40: 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
ed50: 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
ed60: 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
ed70: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
ed80: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
ed90: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
eda0: 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
edb0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
edc0: 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
edd0: 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
ede0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
edf0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
ee00: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
ee10: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
ee20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ee30: 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
ee40: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
ee50: 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
ee60: 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
ee70: 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
ee80: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
ee90: 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
eea0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
eeb0: 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d  ed==0 );.  pTab-
eec0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
eed0: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
eee0: 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
eef0: 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
ef00: 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
ef10: 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
ef20: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
ef30: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
ef40: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
ef50: 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
ef60: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
ef70: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
ef80: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
ef90: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
efa0: 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d  Select);.  pTab-
efb0: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69  >iPKey = -1;.  i
efc0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
efd0: 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
efe0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
eff0: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74  , pTab);.    ret
f000: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
f010: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
f020: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
f030: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
f040: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
f050: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
f060: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
f070: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
f080: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
f090: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
f0a0: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
f0b0: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
f0c0: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
f0d0: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
f0e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
f0f0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
f100: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
f110: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
f120: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29  beCreate(pParse)
f130: 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20 73 71  ;.    if( v ) sq
f140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
f150: 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 20  v, OP_Init);.   
f160: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f   if( pParse->pTo
f170: 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20 20 26  plevel==0.     &
f180: 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
f190: 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
f1a0: 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75  ,SQLITE_FactorOu
f1b0: 74 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b 0a 20  tConst).    ){. 
f1c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43       pParse->okC
f1d0: 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a  onstFactor = 1;.
f1e0: 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72 65 74      }..  }.  ret
f1f0: 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn v;.}.../*.**
f200: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69   Compute the iLi
f210: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
f220: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45  fields of the SE
f230: 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68  LECT based on th
f240: 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20  e.** pLimit and 
f250: 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69  pOffset expressi
f260: 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64  ons.  pLimit and
f270: 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   pOffset hold th
f280: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
f290: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
f2a0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
f2b0: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
f2c0: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
f2d0: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
f2e0: 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
f2f0: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
f300: 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
f310: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
f320: 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
f330: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
f340: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
f350: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
f360: 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
f370: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
f380: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
f390: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
f3a0: 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
f3b0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
f3c0: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
f3d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f3e0: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
f3f0: 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20  alues of iLimit 
f400: 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
f410: 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
f420: 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
f430: 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e  ned by pLimit an
f440: 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d pOffset.  iLim
f450: 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
f460: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
f470: 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
f480: 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
f490: 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a   values (zero).*
f4a0: 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  * prior to calli
f4b0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
f4c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73  .**.** The iOffs
f4d0: 65 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20  et register (if 
f4e0: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
f4f0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
f500: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65   value.** of the
f510: 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c   OFFSET.  The iL
f520: 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73  imit register is
f530: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
f540: 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72  LIMIT.  Register
f550: 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73  .** iOffset+1 is
f560: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
f570: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a  LIMIT+OFFSET..**
f580: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
f590: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
f5a0: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
f5b0: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
f5c0: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
f5d0: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
f5e0: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
f5f0: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
f600: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
f610: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
f620: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
f630: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
f640: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
f650: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
f660: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
f670: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
f680: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
f690: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
f6a0: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
f6b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
f6c0: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
f6d0: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
f6e0: 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  r1, n;.  if( p->
f6f0: 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b  iLimit ) return;
f700: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  ..  /* .  ** "LI
f710: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
f720: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
f730: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
f740: 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61  ** controversy a
f750: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
f760: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
f770: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
f780: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
f790: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
f7a0: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
f7b0: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
f7c0: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ows..  */.  sqli
f7d0: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
f7e0: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  r(pParse);.  ass
f7f0: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
f800: 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21  =0 || p->pLimit!
f810: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
f820: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
f830: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
f840: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
f850: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
f860: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f870: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21  ;.    assert( v!
f880: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  =0 );.    if( sq
f890: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
f8a0: 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  er(p->pLimit, &n
f8b0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
f8c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f8d0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69  OP_Integer, n, i
f8e0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
f8f0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
f900: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
f910: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
f920: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f930: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f940: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
f950: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
f960: 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
f970: 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36 34 29  nSelectRow>(u64)
f980: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  n ){.        p->
f990: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b 0a  nSelectRow = n;.
f9a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
f9b0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
f9c0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f9d0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d   p->pLimit, iLim
f9e0: 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
f9f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
fa00: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c  OP_MustBeInt, iL
fa10: 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
fa20: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
fa30: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
fa40: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
fa50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fa60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fa70: 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42  fNot, iLimit, iB
fa80: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
fa90: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
faa0: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
fab0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   ){.      p->iOf
fac0: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
fad0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
fae0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
faf0: 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
fb00: 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
fb10: 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
fb20: 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  +offset */.     
fb30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fb40: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
fb50: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
fb60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fb70: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
fb80: 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29  tBeInt, iOffset)
fb90: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
fba0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
fbb0: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
fbc0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
fbd0: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
fbe0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
fbf0: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
fc00: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
fc10: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
fc20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fc30: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
fc40: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
fc50: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fc60: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
fc70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fc80: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c  ddOp3(v, OP_Add,
fc90: 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
fca0: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
fcb0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
fcc0: 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
fcd0: 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  T"));.      addr
fce0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
fcf0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
fd00: 73 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  s, iLimit); Vdbe
fd10: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fd20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fd30: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
fd40: 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b  er, -1, iOffset+
fd50: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
fd60: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
fd70: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20   addr1);.    }. 
fd80: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
fd90: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
fda0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
fdb0: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
fdc0: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
fdd0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
fde0: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
fdf0: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
fe00: 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
fe10: 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
fe20: 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
fe30: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
fe40: 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
fe50: 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
fe60: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
fe70: 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
fe80: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
fe90: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
fea0: 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
feb0: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
fec0: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
fed0: 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
fee0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fef0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
ff00: 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
ff10: 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
ff20: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
ff30: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
ff40: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
ff50: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
ff60: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
ff70: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
ff80: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
ff90: 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
ffa0: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
ffb0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
ffc0: 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20  iCol>=0 );.  /* 
ffd0: 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73  iCol must be les
ffe0: 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74  s than p->pEList
fff0: 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77  ->nExpr.  Otherw
10000 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75  ise an error wou
10010 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ld.  ** have bee
10020 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20  n thrown during 
10030 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
10040 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74  and we would not
10050 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a   have gotten.  *
10060 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20  * this far */.  
10070 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41  if( pRet==0 && A
10080 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45  LWAYS(iCol<p->pE
10090 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
100a0 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
100b0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
100c0 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
100d0 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
100e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
100f0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
10100 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
10110 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
10120 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
10130 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
10140 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e  ELECT.** with an
10150 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
10160 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10170 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65  allocates and re
10180 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a  turns a KeyInfo.
10190 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73 75 69  ** structure sui
101a0 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d  table for implem
101b0 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
101c0 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65   BY..**.** Space
101d0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
101e0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
101f0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
10200 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c  malloc. The call
10210 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
10220 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
10230 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  or ensuring that
10240 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
10250 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
10260 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
10270 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69  c KeyInfo *multi
10280 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
10290 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
102a0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
102b0 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78  nt nExtra){.  Ex
102c0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
102d0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
102e0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d    int nOrderBy =
102f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45   p->pOrderBy->nE
10300 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr;.  sqlite3 *
10310 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10320 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74  .  KeyInfo *pRet
10330 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
10340 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65  oAlloc(db, nOrde
10350 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a  rBy+nExtra, 1);.
10360 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
10370 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
10380 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
10390 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
103a0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
103b0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72  em *pItem = &pOr
103c0 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20  derBy->a[i];.   
103d0 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d     Expr *pTerm =
103e0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
103f0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
10400 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  oll;..      if( 
10410 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
10420 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
10430 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
10440 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
10450 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a  pParse, pTerm);.
10460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10470 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c       pColl = mul
10480 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
10490 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d  pParse, p, pItem
104a0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
104b0 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l-1);.        if
104c0 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f  ( pColl==0 ) pCo
104d0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
104e0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  ll;.        pOrd
104f0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
10500 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   =.          sql
10510 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
10520 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c  teString(pParse,
10530 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a   pTerm, pColl->z
10540 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
10550 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
10560 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
10570 74 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a  teable(pRet) );.
10580 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c        pRet->aCol
10590 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
105a0 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f      pRet->aSortO
105b0 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72  rder[i] = pOrder
105c0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
105d0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  er;.    }.  }.. 
105e0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
105f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10600 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54  OMIT_CTE./*.** T
10610 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
10620 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20  rates VDBE code 
10630 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
10640 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48  ontent of a WITH
10650 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75   RECURSIVE.** qu
10660 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ery of the form:
10670 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73  .**.**   <recurs
10680 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c  ive-table> AS (<
10690 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49  setup-query> UNI
106a0 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73  ON [ALL] <recurs
106b0 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20  ive-query>).**  
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
106e0 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20  ___/            
106f0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
10700 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20  p->pPrior       
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10740 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  .**.**.** There 
10750 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72  is exactly one r
10760 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
10770 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
10780 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
10790 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69  se.** of recursi
107a0 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64  ve-query, marked
107b0 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73   with the SrcLis
107c0 74 2d 3e 61 5b 5d 2e 69 73 52 65 63 75 72 73 69  t->a[].isRecursi
107d0 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54  ve flag..**.** T
107e0 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72  he setup-query r
107f0 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65  uns once to gene
10800 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20  rate an initial 
10810 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  set of rows that
10820 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75   go.** into a Qu
10830 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73  eue table.  Rows
10840 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
10850 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61  rom the Queue ta
10860 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e  ble one by.** on
10870 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74  e.  Each row ext
10880 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
10890 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70  e is output to p
108a0 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Dest.  Then the 
108b0 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63  single.** extrac
108c0 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20  ted row (now in 
108d0 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62  the iCurrent tab
108e0 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  le) becomes the 
108f0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a  content of the.*
10900 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  * recursive-tabl
10910 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76  e for a recursiv
10920 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68  e-query run.  Th
10930 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
10940 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a  recursive-query.
10950 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b  ** is added back
10960 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
10970 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f  table.  Then ano
10980 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72  ther row is extr
10990 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
109a0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72  .** and the iter
109b0 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20  ation continues 
109c0 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
109d0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
109e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
109f0 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72  pound query oper
10a00 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68  ator is UNION th
10a10 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20  en no duplicate 
10a20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a  rows are ever.**
10a30 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
10a40 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
10a50 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74   The iDistinct t
10a60 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70  able keeps a cop
10a70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a  y of all rows.**
10a80 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20   that have ever 
10a90 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
10aa0 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75  to Queue and cau
10ab0 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74  ses duplicates t
10ac0 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65  o be.** discarde
10ad0 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61  d.  If the opera
10ae0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c  tor is UNION ALL
10af0 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65  , then duplicate
10b00 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  s are allowed..*
10b10 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  * .** If the que
10b20 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20  ry has an ORDER 
10b30 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73  BY, then entries
10b40 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61   in the Queue ta
10b50 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a  ble are kept in.
10b60 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  ** ORDER BY orde
10b70 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  r and the first 
10b80 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74  entry is extract
10b90 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c  ed for each cycl
10ba0 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61  e.  Without.** a
10bb0 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
10bc0 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a  Queue table is j
10bd0 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a  ust a FIFO..**.*
10be0 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61  * If a LIMIT cla
10bf0 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c  use is provided,
10c00 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
10c10 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20  ion stops after 
10c20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61  LIMIT rows.** ha
10c30 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74  ve been output t
10c40 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49  o pDest.  A LIMI
10c50 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20  T of zero means 
10c60 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77  to output no row
10c70 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74  s and a.** negat
10c80 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20  ive LIMIT means 
10c90 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f  to output all ro
10ca0 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ws.  If there is
10cb0 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20   also an OFFSET 
10cc0 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61  clause.** with a
10cd0 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
10ce0 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
10cf0 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61  OFFSET outputs a
10d00 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74  re discarded rat
10d10 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e  her.** than bein
10d20 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e  g sent to pDest.
10d30 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e    The LIMIT coun
10d40 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
10d50 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46   until after OFF
10d60 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65  SET.** rows have
10d70 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a   been skipped..*
10d80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
10d90 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
10da0 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73  iveQuery(.  Pars
10db0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10dc0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
10dd0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
10de0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10df0 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65  /* The recursive
10e00 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f   SELECT to be co
10e10 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
10e20 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
10e30 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
10e40 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
10e50 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
10e60 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
10e70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
10e80 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
10e90 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
10ea0 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  */.  int nCol = 
10eb0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
10ec0 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
10ed0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
10ee0 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a  ecursive table *
10ef0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
10f00 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
10f10 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
10f20 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
10f30 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
10f40 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74  /.  Select *pSet
10f50 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20  up = p->pPrior; 
10f60 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71    /* The setup q
10f70 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64  uery */.  int ad
10f80 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
10f90 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
10fa0 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
10fb0 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  int addrCont, ad
10fc0 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a  drBreak;      /*
10fd0 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52   CONTINUE and BR
10fe0 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f  EAK addresses */
10ff0 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
11000 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
11010 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20   /* The Current 
11020 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
11030 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20  egCurrent;      
11040 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11050 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72  ster holding Cur
11060 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
11070 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20  int iQueue;     
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11090 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   The Queue table
110a0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69   */.  int iDisti
110b0 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nct = 0;        
110c0 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
110d0 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20   unique results 
110e0 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e  if UNION */.  in
110f0 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69  t eDest = SRT_Fi
11100 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  fo;         /* H
11110 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51  ow to write to Q
11120 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ueue */.  Select
11130 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20  Dest destQueue; 
11140 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
11150 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67  tDest targetting
11160 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11170 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
111a0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
111d0 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c   code */.  ExprL
111e0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
111f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11200 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11210 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
11220 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20  t, *pOffset;    
11230 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49     /* Saved LIMI
11240 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
11250 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20    int regLimit, 
11260 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20  regOffset;      
11270 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65  /* Registers use
11280 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f  d by LIMIT and O
11290 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  FFSET */..  /* O
112a0 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74  btain authorizat
112b0 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75  ion to do a recu
112c0 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
112d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
112e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
112f0 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20  LITE_RECURSIVE, 
11300 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
11310 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73  n;..  /* Process
11320 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
11330 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69  FFSET clauses, i
11340 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a  f they exist */.
11350 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71    addrBreak = sq
11360 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11370 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65  el(v);.  compute
11380 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
11390 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72  Parse, p, addrBr
113a0 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d  eak);.  pLimit =
113b0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f   p->pLimit;.  pO
113c0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
113d0 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d  et;.  regLimit =
113e0 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65   p->iLimit;.  re
113f0 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  gOffset = p->iOf
11400 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  fset;.  p->pLimi
11410 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  t = p->pOffset =
11420 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20   0;.  p->iLimit 
11430 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  = p->iOffset = 0
11440 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
11450 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  ->pOrderBy;..  /
11460 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72  * Locate the cur
11470 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
11480 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
11490 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c  */.  for(i=0; AL
114a0 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72  WAYS(i<pSrc->nSr
114b0 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  c); i++){.    if
114c0 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52  ( pSrc->a[i].isR
114d0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
114e0 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
114f0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
11500 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11510 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
11520 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
11530 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
11540 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
11550 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
11560 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
11570 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
11580 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
11590 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
115a0 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
115b0 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
115c0 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
115d0 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
115e0 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
115f0 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
11600 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
11610 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
11620 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
11630 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
11640 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
11650 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
11660 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
11670 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
11680 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
11690 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
116a0 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
116b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
116c0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
116d0 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
116e0 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
116f0 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
11700 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
11710 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
11720 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
11730 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
11740 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
11750 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
11760 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
11770 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
11780 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
11790 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
117a0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
117b0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
117c0 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
117d0 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
117e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
117f0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11800 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
11810 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
11820 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
11830 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
11840 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
11850 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
11860 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
11870 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
11880 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
11890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
118a0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
118b0 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
118c0 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
118d0 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
118e0 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
118f0 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
11900 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
11910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11920 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
11930 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
11940 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
11950 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
11960 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
11970 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
11980 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11990 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
119a0 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
119b0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
119c0 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
119d0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
119e0 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
119f0 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
11a00 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72  ->pNext = 0;.  r
11a10 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
11a20 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70  t(pParse, pSetup
11a30 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20  , &destQueue);. 
11a40 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
11a50 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   p;.  if( rc ) g
11a60 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72  oto end_of_recur
11a70 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f  sive_query;..  /
11a80 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
11a90 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65  row in the Queue
11aa0 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74   and output that
11ab0 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f   row */.  addrTo
11ac0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
11ad0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
11ae0 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72  nd, iQueue, addr
11af0 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
11b00 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  rage(v);..  /* T
11b10 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74  ransfer the next
11b20 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76   row in Queue ov
11b30 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f  er to Current */
11b40 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11b50 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
11b60 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f  ow, iCurrent); /
11b70 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d  * To reset colum
11b80 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28  n cache */.  if(
11b90 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
11ba0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11bb0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
11bc0 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
11bd0 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43  y->nExpr+1, regC
11be0 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  urrent);.  }else
11bf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11c00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
11c10 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72  wData, iQueue, r
11c20 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a  egCurrent);.  }.
11c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11c40 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
11c50 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
11c60 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67   Output the sing
11c70 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
11c80 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20  t */.  addrCont 
11c90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
11ca0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64  eLabel(v);.  cod
11cb0 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66  eOffset(v, regOf
11cc0 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b  fset, addrCont);
11cd0 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
11ce0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
11cf0 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e  >pEList, iCurren
11d00 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70  t,.      0, 0, p
11d10 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Dest, addrCont, 
11d20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
11d30 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20  ( regLimit ){.  
11d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11d50 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
11d60 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74  mpZero, regLimit
11d70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
11d80 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11d90 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11da0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11db0 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a  (v, addrCont);..
11dc0 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65    /* Execute the
11dd0 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
11de0 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e  T taking the sin
11df0 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
11e00 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76  nt as.  ** the v
11e10 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63  alue for the rec
11e20 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74  ursive-table. St
11e30 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
11e40 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20  in the Queue..  
11e50 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
11e60 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   0;.  sqlite3Sel
11e70 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
11e80 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 61 73  destQueue);.  as
11e90 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
11ea0 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f  =0 );.  p->pPrio
11eb0 72 20 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f  r = pSetup;..  /
11ec0 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74  * Keep running t
11ed0 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68  he loop until th
11ee0 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79  e Queue is empty
11ef0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
11f00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
11f10 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  to, 0, addrTop);
11f20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
11f30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
11f40 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f  drBreak);..end_o
11f50 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
11f60 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  y:.  sqlite3Expr
11f70 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
11f80 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  e->db, p->pOrder
11f90 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72  By);.  p->pOrder
11fa0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
11fb0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
11fc0 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  mit;.  p->pOffse
11fd0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72  t = pOffset;.  r
11fe0 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
11ff0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
12000 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  TE */../* Forwar
12010 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
12020 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
12030 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
12040 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12050 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12060 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
12070 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
12080 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
12090 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
120a0 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
120b0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
120c0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
120d0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
120e0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a  y results */.);.
120f0 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73  ./*.** Error mes
12100 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77  sage for when tw
12110 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20  o or more terms 
12120 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
12130 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65 72  lect have differ
12140 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75  ent.** size resu
12150 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lt sets..*/.void
12160 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72   sqlite3SelectWr
12170 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72  ongNumTermsError
12180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12190 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
121a0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
121b0 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20  SF_Values ){.   
121c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
121d0 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41  (pParse, "all VA
121e0 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74  LUES must have t
121f0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
12200 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c  f terms");.  }el
12210 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
12220 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12230 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
12240 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
12250 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
12260 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
12270 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
12280 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
12290 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
122a0 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
122b0 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63   Handle the spec
122c0 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f  ial case of a co
122d0 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
122e0 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
122f0 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63  om a.** VALUES c
12300 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c  lause.  By handl
12310 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70  ing this as a sp
12320 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61  ecial case, we a
12330 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63  void deep.** rec
12340 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73  ursion, and thus
12350 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
12360 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49  enforce the SQLI
12370 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
12380 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61  D_SELECT.** on a
12390 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a   VALUES clause..
123a0 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68  **.** Because th
123b0 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  e Select object 
123c0 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
123d0 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a  a VALUES clause:
123e0 0a 2a 2a 20 20 20 28 31 29 20 49 74 20 68 61 73  .**   (1) It has
123f0 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46   no LIMIT or OFF
12400 53 45 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c  SET.**   (2) All
12410 20 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e   terms are UNION
12420 20 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68   ALL.**   (3) Th
12430 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
12440 42 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61  BY clause.*/.sta
12450 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
12460 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72  ectValues(.  Par
12470 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12480 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12490 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
124a0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
124b0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
124c0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
124d0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
124e0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
124f0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
12500 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
12510 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  sults */.){.  Se
12520 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20  lect *pPrior;.  
12530 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20  int nRow = 1;.  
12540 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73  int rc = 0;.  as
12550 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
12560 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
12570 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61  e );.  do{.    a
12580 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
12590 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
125a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
125b0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28  >op==TK_ALL || (
125c0 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
125d0 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30   && p->pPrior==0
125e0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
125f0 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b   p->pLimit==0 );
12600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12610 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20  pOffset==0 );.  
12620 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
12630 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69  xt==0 || p->pELi
12640 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e  st->nExpr==p->pN
12650 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ext->pEList->nEx
12660 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  pr );.    if( p-
12670 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65  >pPrior==0 ) bre
12680 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
12690 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  p->pPrior->pNext
126a0 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70  ==p );.    p = p
126b0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52  ->pPrior;.    nR
126c0 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31  ow++;.  }while(1
126d0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
126e0 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  .    pPrior = p-
126f0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
12700 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
12710 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
12720 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  ct(pParse, p, pD
12730 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  est);.    p->pPr
12740 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
12750 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
12760 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
12770 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
12780 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
12790 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
127a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
127b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
127c0 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70  o process a comp
127d0 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20  ound query form 
127e0 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d  from.** two or m
127f0 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
12800 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ries using UNION
12810 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43  , UNION ALL, EXC
12820 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52  EPT, or.** INTER
12830 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  SECT.**.** "p" p
12840 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
12850 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
12860 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
12870 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
12880 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
12890 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
128a0 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
128b0 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
128c0 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
128d0 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
128e0 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
128f0 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
12900 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
12910 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
12920 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
12930 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
12940 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
12950 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
12960 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
12970 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
12980 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
12990 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
129a0 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
129b0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
129c0 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
129d0 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
129e0 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
129f0 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
12a00 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
12a10 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
12a20 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
12a30 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
12a40 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
12a50 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
12a60 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
12a80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12a90 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
12aa0 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
12ab0 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
12ac0 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
12ad0 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
12ae0 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
12af0 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
12b00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12b10 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
12b20 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
12b30 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
12b40 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
12b50 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
12b60 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
12b70 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
12b80 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
12b90 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
12ba0 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
12bb0 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
12bc0 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
12bd0 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
12be0 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
12bf0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
12c00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
12c10 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
12c20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
12c30 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
12c40 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
12c50 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
12c60 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
12c70 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
12c80 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
12c90 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
12ca0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
12cb0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
12cc0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
12cd0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12ce0 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
12cf0 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
12d00 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
12d10 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
12d20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
12d30 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
12d40 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
12d50 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
12d60 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
12d70 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
12d80 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
12d90 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
12da0 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
12db0 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
12dc0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65  */.  Select *pDe
12dd0 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68  lete = 0;  /* Ch
12de0 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65  ain of simple se
12df0 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20  lects to delete 
12e00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12e10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
12e20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12e30 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  n */.#ifndef SQL
12e40 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
12e50 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30  .  int iSub1 = 0
12e60 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
12e70 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  id of left-hand 
12e80 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
12e90 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub2 = 0;       
12ea0 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69   /* EQP id of ri
12eb0 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  ght-hand query *
12ec0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  /.#endif..  /* M
12ed0 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
12ee0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72  s no ORDER BY or
12ef0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
12f00 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20   prior SELECTs. 
12f10 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c   Only.  ** the l
12f20 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29  ast (right-most)
12f30 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73   SELECT in the s
12f40 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61  eries may have a
12f50 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  n ORDER BY or LI
12f60 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  MIT..  */.  asse
12f70 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69  rt( p && p->pPri
12f80 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e  or );  /* Callin
12f90 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61  g function guara
12fa0 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20  ntees this much 
12fb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  */.  assert( (p-
12fc0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
12fd0 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20  ecursive)==0 || 
12fe0 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  p->op==TK_ALL ||
12ff0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
13000 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
13010 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20  e->db;.  pPrior 
13020 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  = p->pPrior;.  d
13030 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20  est = *pDest;.  
13040 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
13050 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
13060 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13070 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
13080 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
13090 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
130a0 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
130b0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
130c0 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
130d0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
130e0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
130f0 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
13100 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
13110 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13120 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
13130 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
13140 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
13150 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
13160 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
13170 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
13180 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
13190 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71  d;.  }..  v = sq
131a0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
131b0 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
131c0 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  v!=0 );  /* The 
131d0 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65  VDBE already cre
131e0 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ated by calling 
131f0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  function */..  /
13200 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
13210 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
13220 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
13230 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
13240 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
13250 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
13260 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
13270 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  st );.    sqlite
13280 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13290 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
132a0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70   dest.iSDParm, p
132b0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
132c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
132d0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
132e0 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
132f0 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
13300 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
13310 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e    /* Special han
13320 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70  dling for a comp
13330 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
13340 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20 61   originates as a
13350 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a   VALUES clause..
13360 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
13370 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
13380 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63  iValue ){.    rc
13390 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61   = multiSelectVa
133a0 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  lues(pParse, p, 
133b0 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f  &dest);.    goto
133c0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
133d0 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  d;.  }..  /* Mak
133e0 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
133f0 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
13400 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
13410 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
13420 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
13430 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
13440 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
13450 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
13460 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
13470 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13480 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72  t->nExpr==pPrior
13490 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
134a0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
134b0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66  TE_OMIT_CTE.  if
134c0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
134d0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
134e0 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68      generateWith
134f0 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70  RecursiveQuery(p
13500 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
13510 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
13520 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20  ..  /* Compound 
13530 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76  SELECTs that hav
13540 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
13550 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  ause are handled
13560 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a   separately..  *
13570 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  /.  if( p->pOrde
13580 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
13590 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  n multiSelectOrd
135a0 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  erBy(pParse, p, 
135b0 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pDest);.  }else.
135c0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
135d0 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
135e0 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
135f0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
13600 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
13610 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
13620 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
13630 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
13640 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20     int nLimit;. 
13650 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
13660 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
13670 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
13680 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
13690 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
136a0 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  iOffset = p->iOf
136b0 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69  fset;.      pPri
136c0 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
136d0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  pLimit;.      pP
136e0 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20  rior->pOffset = 
136f0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
13700 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
13710 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
13720 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
13730 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13740 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
13750 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
13760 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
13770 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
13780 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
13790 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
137a0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
137b0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
137c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
137d0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
137e0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
137f0 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
13800 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
13810 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
13820 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
13830 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
13840 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
13850 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
13860 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  fNot, p->iLimit)
13870 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
13880 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
13890 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
138a0 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
138b0 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
138c0 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69    }.      explai
138d0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
138e0 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
138f0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
13900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
13910 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
13920 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
13930 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
13940 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
13950 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
13960 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
13970 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
13980 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
13990 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
139a0 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  ectRow;.      if
139b0 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
139c0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
139d0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
139e0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20  pPrior->pLimit, 
139f0 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20  &nLimit).       
13a00 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70  && nLimit>0 && p
13a10 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28  ->nSelectRow > (
13a20 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20  u64)nLimit .    
13a30 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e    ){.        p->
13a40 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69  nSelectRow = nLi
13a50 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mit;.      }.   
13a60 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
13a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13a80 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
13a90 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
13aa0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13ab0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
13ac0 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
13ad0 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
13ae0 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
13af0 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
13b00 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
13b10 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
13b20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
13b30 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  u8 op = 0;      
13b40 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
13b50 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
13b60 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
13b70 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
13b80 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
13b90 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
13ba0 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
13bb0 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
13bc0 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
13bd0 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61   *pOffset; /* Sa
13be0 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
13bf0 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e  >nLimit and p->n
13c00 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  Offset */.      
13c10 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
13c20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e  SelectDest union
13c30 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73  dest;..      tes
13c40 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
13c50 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20  _EXCEPT );.     
13c60 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
13c70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
13c80 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
13c90 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
13ca0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
13cb0 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
13cc0 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
13cd0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
13ce0 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
13cf0 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
13d00 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68  .        ** righ
13d10 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
13d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13d30 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20  >pLimit==0 );   
13d40 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
13d50 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
13d60 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
13d70 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
13d80 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f  fset==0 );     /
13d90 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
13da0 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
13db0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e  ts */.        un
13dc0 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
13dd0 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  DParm;.      }el
13de0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
13df0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
13e00 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
13e10 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
13e20 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
13e30 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
13e40 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
13e50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
13e60 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
13e70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
13e80 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
13e90 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
13ea0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
13eb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13ec0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
13ed0 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
13ee0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13ef0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
13f00 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
13f10 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
13f20 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
13f30 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
13f40 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
13f50 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
13f60 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  eral;.        as
13f70 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
13f80 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
13f90 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
13fa0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
13fb0 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
13fc0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
13fd0 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
13fe0 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71  erBy );.      sq
13ff0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
14000 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20  nit(&uniondest, 
14010 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
14020 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b);.      explai
14030 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
14040 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
14050 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14070 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
14080 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b  or, &uniondest);
14090 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
140a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
140b0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
140c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
140d0 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
140e0 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
140f0 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ent.      */.   
14100 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
14110 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20  _EXCEPT ){.     
14120 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65     op = SRT_Exce
14130 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  pt;.      }else{
14140 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14150 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
14160 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   );.        op =
14170 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
14180 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
14190 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
141a0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
141b0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
141c0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
141d0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
141e0 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
141f0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
14200 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20  uniondest.eDest 
14210 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c  = op;.      expl
14220 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14230 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
14240 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14250 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14260 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14270 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
14280 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14290 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
142a0 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c       /* Query fl
142b0 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69  attening in sqli
142c0 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68  te3Select() migh
142d0 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64  t refill p->pOrd
142e0 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42  erBy..      ** B
142f0 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65  e sure to delete
14300 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68   p->pOrderBy, th
14310 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69  erefore, to avoi
14320 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e  d a memory leak.
14330 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
14340 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
14350 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
14360 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
14370 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
14380 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
14390 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
143a0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
143b0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
143c0 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65  K_UNION ) p->nSe
143d0 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
143e0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
143f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14400 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
14410 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
14420 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
14430 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
14440 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
14450 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
14460 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
14470 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  et = 0;..      /
14480 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
14490 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
144a0 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
144b0 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
144c0 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
144d0 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
144e0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
144f0 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e     assert( union
14500 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72  Tab==dest.iSDPar
14510 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21  m || dest.eDest!
14520 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20  =priorOp );.    
14530 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
14540 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
14550 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
14560 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
14570 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14580 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
14590 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
145a0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
145b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
145c0 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
145d0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
145e0 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
145f0 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
14600 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
14610 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
14620 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
14630 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
14640 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
14650 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
14660 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14670 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
14680 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
14690 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
146a0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
146b0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
146c0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
146d0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
146e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
146f0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
14700 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20  onTab, iBreak); 
14710 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14720 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
14730 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
14740 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
14750 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
14760 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
14770 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
14780 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
147a0 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
147b0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
147c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
147d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
147e0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
147f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14800 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
14810 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64  Tab, iStart); Vd
14820 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14840 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
14850 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
14860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14870 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
14880 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
14890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
148a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
148b0 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
148c0 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  p->op==TK_INTERS
148d0 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ECT ); {.      i
148e0 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
148f0 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
14900 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
14910 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
14920 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20  it, *pOffset;.  
14930 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
14940 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69      SelectDest i
14950 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20  ntersectdest;.  
14960 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20      int r1;..   
14970 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
14980 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
14990 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
149a0 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
149b0 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
149c0 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
149d0 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
149e0 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
149f0 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
14a00 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
14a10 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
14a20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14a30 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
14a40 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
14a50 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
14a60 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
14a70 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
14a80 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20   );..      addr 
14a90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14aa0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
14ab0 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30  hemeral, tab1, 0
14ac0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14ad0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14ae0 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
14af0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
14b00 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
14b10 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73      findRightmos
14b20 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  t(p)->selFlags |
14b30 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
14b40 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  al;.      assert
14b50 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
14b60 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
14b70 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
14b80 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
14b90 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
14ba0 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
14bb0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14bc0 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
14bd0 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
14be0 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
14bf0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14c00 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14c10 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14c20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14c30 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14c40 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72  , pPrior, &inter
14c50 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
14c60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
14c70 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14c80 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
14c90 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
14ca0 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
14cb0 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
14cc0 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
14cd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
14ce0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14cf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
14d00 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
14d10 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  2, 0);.      ass
14d20 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
14d30 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
14d40 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
14d50 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72  enEphm[1] = addr
14d60 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
14d70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
14d80 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
14d90 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
14da0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
14db0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
14dc0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
14dd0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  et = 0;.      in
14de0 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50  tersectdest.iSDP
14df0 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
14e00 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14e10 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
14e20 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14e30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14e40 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14e50 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63  se, p, &intersec
14e60 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  tdest);.      te
14e70 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
14e80 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
14e90 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
14ea0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
14eb0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
14ec0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
14ed0 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53  ctRow>pPrior->nS
14ee0 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
14ef0 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
14f00 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
14f10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14f20 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
14f30 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
14f40 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
14f50 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
14f60 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20  t = pOffset;..  
14f70 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
14f80 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
14f90 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
14fa0 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
14fb0 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
14fc0 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
14fd0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
14fe0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
14ff0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
15000 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
15010 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
15020 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
15030 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
15040 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
15050 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
15060 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
15070 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
15080 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
15090 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
150a0 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
150b0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
150c0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
150d0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
150e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
150f0 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
15100 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
15110 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
15120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15130 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
15140 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
15150 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
15160 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  e(v);.      r1 =
15170 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
15180 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
15190 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
151a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
151b0 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c  OP_RowKey, tab1,
151c0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
151d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
151e0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
151f0 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
15200 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
15210 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
15220 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15230 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
15240 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
15250 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
15260 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
15270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15280 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
15290 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
152a0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
152b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
152c0 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
152d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
152e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
152f0 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
15300 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15310 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15320 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15330 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
15340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15350 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
15360 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
15370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15380 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
15390 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
153a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
153b0 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ..  explainCompo
153c0 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
153d0 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
153e0 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  , p->op!=TK_ALL)
153f0 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
15400 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
15410 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a  ces used by .  *
15420 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
15430 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
15440 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
15450 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
15460 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
15470 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
15480 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
15490 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
154a0 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
154b0 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
154c0 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
154d0 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
154e0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
154f0 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
15500 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
15510 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
15520 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
15530 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
15540 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
15550 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
15560 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
15570 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
15580 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
15590 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
155a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
155b0 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
155c0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
155f0 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
15600 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
15610 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
15620 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
15630 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
15640 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f  .    Select *pLo
15650 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
15660 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
15670 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54  g through SELECT
15680 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
15690 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43     CollSeq **apC
156a0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
156b0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
156c0 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f  through pKeyInfo
156d0 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  ->aColl[] */.   
156e0 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15700 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
15710 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
15720 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  t */..    assert
15730 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b  ( p->pNext==0 );
15740 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
15750 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
15760 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
15770 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
15780 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  (db, nCol, 1);. 
15790 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
157a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
157b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
157c0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
157d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
157e0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
157f0 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
15800 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
15810 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
15820 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
15830 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
15840 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
15850 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
15860 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
15870 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
15880 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
15890 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
158a0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
158b0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
158c0 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
158d0 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
158e0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
158f0 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
15900 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
15910 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
15920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
15930 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
15940 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
15950 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
15960 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
15970 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
15980 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
15990 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
159a0 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
159b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
159c0 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
159d0 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
159e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
159f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15a00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
15a10 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
15a20 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
15a30 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
15a40 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
15a50 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
15a60 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
15a90 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
15aa0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
15ab0 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
15ac0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
15ad0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
15ae0 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
15af0 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
15b00 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
15b10 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
15b20 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
15b30 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
15b40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
15b50 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
15b60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15b70 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15b80 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
15b90 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
15ba0 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20   Code an output 
15bb0 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  subroutine for a
15bc0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
15bd0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a  mentation of a.*
15be0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e  * SELECT statmen
15bf0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74  t..**.** The dat
15c00 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69  a to be output i
15c10 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70  s contained in p
15c20 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72  In->iSdst.  Ther
15c30 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53  e are.** pIn->nS
15c40 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  dst columns to b
15c50 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
15c60 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
15c70 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
15c80 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
15c90 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
15ca0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
15cb0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
15cc0 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
15cd0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
15ce0 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
15cf0 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  >0 then it is th
15d00 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
15d10 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
15d20 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
15d30 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
15d40 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
15d50 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
15d60 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
15d70 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
15d80 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
15d90 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
15da0 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
15db0 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
15dc0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
15dd0 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
15de0 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
15df0 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
15e00 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
15e10 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
15e20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
15e30 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
15e40 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
15e50 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
15e60 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
15e70 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
15e80 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
15e90 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
15ea0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ec0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
15ed0 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
15ee0 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
15ef0 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
15f00 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
15f10 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
15f20 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
15f30 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
15f40 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
15f50 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
15f60 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
15f70 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
15f80 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
15f90 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
15fa0 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
15fb0 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
15fc0 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
15fd0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
15fe0 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
15ff0 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
16000 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
16010 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16030 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
16040 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
16050 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
16060 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
16070 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
16080 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
16090 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
160a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
160b0 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
160c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
160d0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
160e0 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
160f0 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
16100 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
16110 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
16120 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
16130 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a  nt j1, j2;.    j
16140 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
16150 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
16160 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62  t, regPrev); Vdb
16170 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16180 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
16190 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
161a0 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64  ompare, pIn->iSd
161b0 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
161c0 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20  In->nSdst,.     
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
161f0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
16200 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
16210 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
16220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16230 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32  v, OP_Jump, j2+2
16240 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b  , iContinue, j2+
16250 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
16260 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
16270 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16280 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
16290 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
162a0 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73  _Copy, pIn->iSds
162b0 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
162c0 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20  n->nSdst-1);.   
162d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
162e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
162f0 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 1, regPrev);. 
16300 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
16310 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16320 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
16330 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65   /* Suppress the
16340 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e   first OFFSET en
16350 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69  tries if there i
16360 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  s an OFFSET clau
16370 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66  se.  */.  codeOf
16380 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
16390 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
163a0 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
163b0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ->eDest!=SRT_Exi
163c0 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sts );.  assert(
163d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
163e0 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77  RT_Table );.  sw
163f0 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
16400 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
16410 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
16420 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
16430 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
16440 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
16450 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
16460 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
16470 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
16480 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32  e);.      int r2
16490 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
164a0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
164b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
164c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
164d0 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
164e0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
164f0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
16500 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16510 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65  OP_NewRowid, pDe
16520 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29  st->iSDParm, r2)
16530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16540 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16550 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
16560 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b  SDParm, r1, r2);
16570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16580 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
16590 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
165a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
165b0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
165c0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
165d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
165e0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
165f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16600 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
16610 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16620 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
16630 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
16640 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
16650 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
16660 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
16670 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
16680 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
16690 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
166a0 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
166b0 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
166c0 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
166d0 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
166e0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
166f0 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
16700 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73  nt r1;.      ass
16710 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
16720 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =1 || pParse->nE
16730 72 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 44  rr>0 );.      pD
16740 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a  est->affSdst = .
16750 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16760 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
16770 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
16780 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
16790 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31  fSdst);.      r1
167a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
167b0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
167c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
167d0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
167e0 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
167f0 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73  st, 1, r1, &pDes
16800 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20  t->affSdst,1);. 
16810 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16820 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
16830 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
16840 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  >iSdst, 1);.    
16850 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16860 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
16870 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
16880 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
16890 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
168a0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
168b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
168c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
168d0 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
168e0 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
168f0 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
16900 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
16910 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
16920 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
16930 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
16940 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
16950 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
16960 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
16970 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
16980 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
16990 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
169a0 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =1 || pParse->nE
169b0 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73  rr>0 );  testcas
169c0 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31  e( pIn->nSdst!=1
169d0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
169e0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
169f0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
16a00 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16a10 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
16a20 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
16a30 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
16a40 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
16a50 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
16a60 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
16a70 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
16a80 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
16a90 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
16aa0 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
16ab0 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
16ac0 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
16ad0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
16ae0 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
16af0 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
16b00 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
16b10 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
16b20 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
16b30 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
16b40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
16b50 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
16b60 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
16b70 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
16b80 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
16b90 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
16ba0 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
16bb0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
16bc0 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
16bd0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
16be0 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49  pDest->iSdst, pI
16bf0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
16c00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16c10 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
16c20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
16c30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16c40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
16c50 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
16c60 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
16c70 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
16c80 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
16c90 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
16ca0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
16cb0 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
16cc0 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
16cd0 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
16ce0 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
16cf0 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
16d00 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
16d10 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
16d20 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
16d30 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
16d40 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
16d50 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
16d60 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
16d70 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
16d80 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
16d90 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
16da0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
16db0 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
16dc0 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
16dd0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
16de0 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
16df0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
16e00 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
16e10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16e20 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
16e30 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
16e40 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
16e50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
16e60 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
16e70 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
16e80 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16e90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16ea0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
16eb0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
16ec0 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
16ed0 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
16ee0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
16ef0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
16f00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16f10 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
16f20 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
16f30 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
16f40 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
16f50 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
16f60 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
16f70 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
16f80 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
16f90 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
16fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16fb0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
16fc0 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
16fd0 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
16fe0 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
16ff0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
17000 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
17010 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
17020 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
17030 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
17040 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
17050 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
17060 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
17070 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
17080 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
17090 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
170a0 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
170b0 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
170c0 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
170d0 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
170e0 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
170f0 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
17100 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
17110 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
17120 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
17130 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
17140 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
17150 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
17160 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
17170 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
17180 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
17190 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
171a0 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
171b0 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
171c0 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
171d0 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
171e0 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
171f0 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
17200 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
17210 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
17220 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
17230 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
17240 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
17250 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
17260 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
17270 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
17280 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
17290 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
172a0 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
172b0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
172d0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
172e0 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
172f0 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
17300 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
17310 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
17320 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
17330 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
17340 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
17350 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
17360 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
17370 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
17380 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
17390 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
173a0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
173b0 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
173c0 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
173d0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
173e0 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
173f0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
17400 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
17410 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
17420 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
17430 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
17440 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
17450 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
17460 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
17470 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
17480 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
17490 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
174a0 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
174b0 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
174c0 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
174d0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
174e0 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
174f0 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
17500 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
17510 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
17520 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
17530 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
17540 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
17550 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
17560 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
17570 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
17580 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
17590 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
175a0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
175b0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
175c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
175d0 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
175e0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
175f0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
17600 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
17610 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
17620 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
17630 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
17640 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
17650 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
17660 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
17670 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
17680 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
17690 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
176a0 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
176b0 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
176c0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
176d0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
176e0 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
176f0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
17700 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
17710 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
17720 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
17730 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
17740 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
17750 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
17760 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
17770 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
17780 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
17790 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
177a0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
177b0 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
177c0 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
177d0 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
177e0 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
177f0 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
17800 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
17810 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
17820 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
17830 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
17840 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
17850 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
17860 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
17870 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
17880 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
17890 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
178a0 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
178b0 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
178c0 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
178d0 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
178e0 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
178f0 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
17900 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
17910 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
17920 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
17930 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
17940 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
17950 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
17960 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
17970 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
17980 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
17990 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
179a0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
179b0 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
179c0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
179d0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
179e0 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
179f0 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
17a00 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
17a10 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
17a20 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
17a30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
17a40 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
17a50 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
17a60 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
17a70 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
17a80 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
17a90 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
17aa0 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
17ab0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
17ac0 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
17ad0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
17ae0 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
17af0 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
17b00 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
17b10 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
17b20 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
17b30 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
17b40 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
17b50 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
17b60 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
17b70 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
17b80 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
17b90 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
17ba0 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
17bb0 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
17bc0 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
17bd0 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
17be0 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
17bf0 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
17c00 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
17c10 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
17c20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
17c30 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
17c40 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
17c50 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
17c60 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
17c70 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
17c80 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
17c90 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
17ca0 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
17cb0 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
17cc0 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
17cd0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
17ce0 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
17cf0 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
17d00 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
17d10 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
17d20 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
17d30 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
17d40 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
17d50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
17d60 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
17d70 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
17d80 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
17d90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17da0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
17db0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
17dc0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
17dd0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
17de0 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
17df0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
17e00 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
17e10 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
17e20 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
17e30 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
17e40 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
17e50 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
17e60 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
17e70 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
17e80 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
17e90 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
17ea0 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
17eb0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
17ec0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
17ed0 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
17ee0 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
17ef0 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
17f00 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
17f10 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
17f20 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
17f30 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
17f40 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
17f50 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
17f60 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
17f70 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
17f80 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
17f90 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
17fa0 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
17fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17fc0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
17fd0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
17fe0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17ff0 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
18000 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18010 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
18020 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18030 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
18040 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18050 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
18060 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
18070 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
18080 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
18090 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
180a0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
180b0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
180c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
180d0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
180e0 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
180f0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18100 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
18110 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18120 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
18130 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18140 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
18150 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
18160 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
18170 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18180 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
18190 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
181a0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
181b0 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
181c0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
181d0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
181e0 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
181f0 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
18200 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
18210 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
18220 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18230 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
18240 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
18250 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18260 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
18270 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18280 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
18290 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
182a0 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
182b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
182c0 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
182d0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
182e0 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
182f0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
18300 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
18310 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
18320 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
18330 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
18340 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
18350 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
18360 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
18370 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
18380 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
18390 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
183a0 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
183b0 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
183c0 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
183d0 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
183e0 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
183f0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
18400 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
18410 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
18420 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
18430 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
18440 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
18450 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
18460 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
18470 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
18480 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
18490 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
184a0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
184b0 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
184c0 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
184d0 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20  */.  int j1;    
184e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
184f0 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
18500 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
18510 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
18520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18530 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
18540 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
18550 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
18560 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
18570 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
18580 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
18590 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
185a0 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
185b0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
185c0 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
185d0 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
185e0 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
185f0 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
18600 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
18610 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
18620 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
18630 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
18640 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
18650 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
18660 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
18670 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18680 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
18690 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
186a0 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
186b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
186c0 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
186d0 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
186e0 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
186f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18700 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
18710 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
18720 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
18730 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
18740 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
18750 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18760 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
18770 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
18780 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
18790 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
187a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
187b0 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
187c0 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
187d0 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
187e0 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
187f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
18800 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
18810 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
18820 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
18830 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
18840 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
18850 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
18860 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
18870 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18880 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
18890 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
188a0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
188b0 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
188c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
188d0 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
188e0 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
188f0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
18900 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
18910 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
18920 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
18930 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
18940 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
18950 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
18960 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
18970 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
18980 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
18990 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
189a0 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
189b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
189c0 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
189d0 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
189e0 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
189f0 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
18a00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18a10 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
18a20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
18a30 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
18a40 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
18a50 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
18a60 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
18a70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
18a80 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
18a90 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
18aa0 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
18ab0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
18ac0 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
18ad0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
18ae0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
18af0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
18b00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
18b10 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18b20 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
18b30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18b40 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
18b50 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
18b60 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
18b70 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
18b80 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
18b90 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
18ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
18bb0 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
18bc0 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
18bd0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
18be0 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
18bf0 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
18c00 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
18c10 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
18c20 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
18c30 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
18c40 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
18c50 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
18c60 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
18c70 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
18c80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18c90 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
18ca0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
18cb0 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
18cc0 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
18cd0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
18ce0 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
18cf0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
18d00 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
18d10 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
18d20 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
18d30 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
18d40 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
18d50 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
18d60 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
18d70 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
18d80 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
18d90 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
18da0 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
18db0 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
18dc0 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
18dd0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
18de0 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
18df0 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
18e00 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
18e10 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
18e20 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  *nOrderBy);.  if
18e30 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
18e40 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
18e50 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
18e60 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
18e70 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
18e80 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  <nOrderBy; i++, 
18e90 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
18ea0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
18eb0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
18ec0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
18ed0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18ee0 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c  derByCol<=p->pEL
18ef0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
18f00 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20      aPermute[i] 
18f10 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  = pItem->u.x.iOr
18f20 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20  derByCol - 1;.  
18f30 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
18f40 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  e = multiSelectO
18f50 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
18f60 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d  arse, p, 1);.  }
18f70 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65  else{.    pKeyMe
18f80 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rge = 0;.  }..  
18f90 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20  /* Reattach the 
18fa0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18fb0 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  to the query..  
18fc0 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
18fd0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
18fe0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
18ff0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
19000 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
19010 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a   pOrderBy, 0);..
19020 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
19030 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61  range of tempora
19040 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ry registers and
19050 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65   the KeyInfo nee
19060 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ded.  ** for the
19070 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f   logic that remo
19080 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65  ves duplicate re
19090 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74  sult rows when t
190a0 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  he.  ** operator
190b0 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50   is UNION, EXCEP
190c0 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20  T, or INTERSECT 
190d0 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41  (but not UNION A
190e0 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LL)..  */.  if( 
190f0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
19100 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20    regPrev = 0;. 
19110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
19120 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  nExpr = p->pELis
19130 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73  t->nExpr;.    as
19140 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d  sert( nOrderBy>=
19150 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
19160 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
19170 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
19180 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
19190 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
191a0 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69  Expr+1;.    sqli
191b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
191c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
191d0 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b  regPrev);.    pK
191e0 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b  eyDup = sqlite3K
191f0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
19200 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69  nExpr, 1);.    i
19210 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20  f( pKeyDup ){.  
19220 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
19230 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
19240 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29  eable(pKeyDup) )
19250 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
19260 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
19270 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
19280 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74  >aColl[i] = mult
19290 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
192a0 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
192b0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
192c0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30  SortOrder[i] = 0
192d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
192e0 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72    }. .  /* Separ
192f0 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64  ate the left and
19300 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79   the right query
19310 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65   from one anothe
19320 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69  r.  */.  p->pPri
19330 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72  or = 0;.  pPrior
19340 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73  ->pNext = 0;.  s
19350 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
19360 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
19370 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
19380 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66  , "ORDER");.  if
19390 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
193a0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
193b0 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
193c0 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50  oupBy(pParse, pP
193d0 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f  rior, pPrior->pO
193e0 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
193f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
19400 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65  ute the limit re
19410 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d  gisters */.  com
19420 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
19430 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61  rs(pParse, p, la
19440 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  belEnd);.  if( p
19450 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d  ->iLimit && op==
19460 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
19470 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72  gLimitA = ++pPar
19480 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
19490 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72  gLimitB = ++pPar
194a0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
194b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
194c0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69  v, OP_Copy, p->i
194d0 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66  Offset ? p->iOff
194e0 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69  set+1 : p->iLimi
194f0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b       regLimitA);
19520 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19530 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
19540 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65  y, regLimitA, re
19550 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73  gLimitB);.  }els
19560 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  e{.    regLimitA
19570 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30   = regLimitB = 0
19580 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
19590 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
195a0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70  >pLimit);.  p->p
195b0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c  Limit = 0;.  sql
195c0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
195d0 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  b, p->pOffset);.
195e0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
195f0 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20  ;..  regAddrA = 
19600 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19610 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70    regAddrB = ++p
19620 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
19630 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73  egOutA = ++pPars
19640 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
19650 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
19660 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Mem;.  sqlite3Se
19670 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
19680 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stA, SRT_Corouti
19690 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ne, regAddrA);. 
196a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
196b0 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53  stInit(&destB, S
196c0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
196d0 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47  gAddrB);..  /* G
196e0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
196f0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
19700 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
19710 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
19720 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
19730 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
19740 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
19750 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
19760 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctA = sqlite3Vdb
19770 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
19780 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69  + 1;.  j1 = sqli
19790 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
197a0 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
197b0 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20  e, regAddrA, 0, 
197c0 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20  addrSelectA);.  
197d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
197e0 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b  "left SELECT"));
197f0 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
19800 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
19810 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
19820 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
19830 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
19840 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
19850 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
19860 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
19870 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
19880 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
19890 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  e, regAddrA);.  
198a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
198b0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 2f  ere(v, j1);..  /
198c0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
198d0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
198e0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
198f0 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a  atement on .  **
19900 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65   the right - the
19910 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f   "B" select.  */
19920 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d  .  addrSelectB =
19930 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19940 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
19950 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
19960 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
19970 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
19980 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53  gAddrB, 0, addrS
19990 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43  electB);.  VdbeC
199a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68  omment((v, "righ
199b0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73  t SELECT"));.  s
199c0 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
199d0 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
199e0 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
199f0 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
19a00 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
19a10 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
19a20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
19a30 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
19a40 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
19a50 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
19a60 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
19a70 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d  estB);.  p->iLim
19a80 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b  it = savedLimit;
19a90 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
19aa0 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73  savedOffset;.  s
19ab0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
19ac0 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74  (v, OP_EndCorout
19ad0 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
19ae0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
19af0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
19b00 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
19b10 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
19b20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
19b30 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
19b40 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
19b50 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
19b60 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
19b70 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
19b80 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
19b90 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
19ba0 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
19bb0 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bd0 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
19be0 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
19c00 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
19c10 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
19c20 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
19c30 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
19c40 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
19c50 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
19c60 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
19c70 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
19c80 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
19c90 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
19ca0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
19cb0 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
19cc0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
19cd0 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
19ce0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
19cf0 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
19d00 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
19d10 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
19d20 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
19d30 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
19d40 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d60 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
19d70 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
19d80 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  }.  sqlite3KeyIn
19d90 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29  foUnref(pKeyDup)
19da0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19db0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
19dc0 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
19dd0 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
19de0 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
19df0 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
19e00 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
19e10 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
19e20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
19e30 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
19e40 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
19e50 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64  drEofA_noB = add
19e60 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64  rEofA = labelEnd
19e70 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
19e80 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
19e90 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
19ea0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
19eb0 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
19ec0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19ed0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
19ee0 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
19ef0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
19f00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19f10 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19f20 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e  egAddrB, labelEn
19f30 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
19f60 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
19f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19f80 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
19f90 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d  ddrEofA);.    p-
19fa0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70  >nSelectRow += p
19fb0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
19fc0 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  w;.  }..  /* Gen
19fd0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
19fe0 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
19ff0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
1a000 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
1a010 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
1a020 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
1a030 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
1a040 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1a050 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1a060 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
1a070 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70  rEofA;.    if( p
1a080 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70  ->nSelectRow > p
1a090 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1a0a0 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
1a0b0 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
1a0c0 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b  ectRow;.  }else{
1a0d0 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
1a0e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
1a0f0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1a100 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1a110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a120 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1a130 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1a140 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a150 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1a160 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1a170 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43  labelEnd); VdbeC
1a180 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1a190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a1a0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1a1b0 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a   addrEofB);.  }.
1a1c0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1a1d0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1a1e0 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20  e case of A<B.  
1a1f0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1a200 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42  ment((v, "A-lt-B
1a210 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1a220 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c    addrAltB = sql
1a230 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a240 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1a250 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1a260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a270 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1a280 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1a290 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
1a2a0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1a2b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a2c0 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
1a2d0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  mpr);..  /* Gene
1a2e0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1a2f0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1a300 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20  A==B.  */.  if( 
1a310 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1a320 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1a330 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69  rAltB;.  }else i
1a340 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
1a350 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ECT ){.    addrA
1a360 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1a370 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a      addrAltB++;.
1a380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
1a390 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a3a0 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74   "A-eq-B subrout
1a3b0 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1a3c0 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74  AeqB =.    sqlit
1a3d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a3e0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a3f0 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
1a400 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a420 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1a430 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
1a440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1a450 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1a460 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1a470 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
1a480 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1a490 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
1a4a0 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
1a4b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1a4c0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
1a4d0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1a4e0 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1a4f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a500 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1a510 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1a520 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
1a530 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a540 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a550 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1a560 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a570 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a580 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1a590 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
1a5a0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
1a5b0 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69  e runs once to i
1a5c0 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74  nitialize everyt
1a5d0 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  hing..  */.  sql
1a5e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1a5f0 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74  (v, j1);.  sqlit
1a600 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a610 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a620 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  rA, addrEofA_noB
1a630 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a640 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1a650 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a660 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1a670 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1a680 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
1a690 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d   Implement the m
1a6a0 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20  ain merge loop. 
1a6b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1a6c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a6d0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73   labelCmpr);.  s
1a6e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a6f0 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  (v, OP_Permutati
1a700 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  on, 0, 0, 0, (ch
1a710 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34  ar*)aPermute, P4
1a720 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71  _INTARRAY);.  sq
1a730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1a740 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64  v, OP_Compare, d
1a750 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74  estA.iSdst, dest
1a760 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42  B.iSdst, nOrderB
1a770 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1a780 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1a790 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34  r*)pKeyMerge, P4
1a7a0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
1a7b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1a7c0 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  (v, OPFLAG_PERMU
1a7d0 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TE);.  sqlite3Vd
1a7e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
1a7f0 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61  ump, addrAltB, a
1a800 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74  ddrAeqB, addrAgt
1a810 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1a820 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  (v);..  /* Jump 
1a830 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
1a840 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
1a850 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
1a860 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
1a870 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1a880 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
1a890 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
1a8a0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63  mber of output c
1a8b0 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
1a8c0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
1a8d0 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
1a8e0 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
1a8f0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77   = pPrior;.    w
1a900 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
1a910 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
1a920 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
1a930 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
1a940 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
1a950 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
1a960 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  t);.  }..  /* Re
1a970 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
1a980 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
1a990 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
1a9a0 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
1a9b0 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
1a9c0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
1a9d0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
1a9e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
1a9f0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
1aa00 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
1aa10 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1aa20 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e  or;.  pPrior->pN
1aa30 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a  ext = p;..  /***
1aa40 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75   TBD:  Insert su
1aa50 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74  broutine calls t
1aa60 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  o close cursors 
1aa70 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20  on incomplete.  
1aa80 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  **** subqueries 
1aa90 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43  ****/.  explainC
1aaa0 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
1aab0 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
1aac0 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75  Sub2, 0);.  retu
1aad0 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21  rn pParse->nErr!
1aae0 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  =0;.}.#endif..#i
1aaf0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1ab00 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1ab10 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1ab20 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1ab30 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
1ab40 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
1ab50 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1ab60 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78  ist(sqlite3*, Ex
1ab70 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78  prList*, int, Ex
1ab80 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
1ab90 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1aba0 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65  t(sqlite3*, Sele
1abb0 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ct *, int, ExprL
1abc0 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ist *);../*.** S
1abd0 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
1abe0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
1abf0 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
1ac00 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
1ac10 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
1ac20 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
1ac30 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
1ac40 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
1ac50 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
1ac60 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
1ac70 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1ac80 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
1ac90 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
1aca0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1acb0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1acc0 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
1acd0 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
1ace0 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
1acf0 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
1ad00 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
1ad10 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
1ad20 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
1ad30 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
1ad40 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
1ad50 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
1ad60 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
1ad70 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
1ad80 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
1ad90 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
1ada0 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
1adb0 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
1adc0 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
1add0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1ade0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
1adf0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1ae00 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
1ae10 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
1ae20 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
1ae30 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70  c Expr *substExp
1ae40 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
1ae50 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f  ,        /* Repo
1ae60 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
1ae70 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   to this connect
1ae80 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1ae90 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
1aea0 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
1aeb0 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
1aec0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
1aed0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  e,         /* Ta
1aee0 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
1aef0 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
1af00 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
1af10 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70  * Substitute exp
1af20 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  ressions */.){. 
1af30 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1af40 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1af50 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1af60 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
1af70 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
1af80 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1af90 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
1afa0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1afb0 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
1afc0 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
1afd0 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
1afe0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
1aff0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
1b000 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1b010 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1b020 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
1b030 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
1b040 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
1b050 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1b060 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70  (db, pEList->a[p
1b070 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
1b080 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
1b090 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1b0a0 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
1b0b0 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77      pExpr = pNew
1b0c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1b0d0 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  .    pExpr->pLef
1b0e0 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
1b0f0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1b100 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b110 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  .    pExpr->pRig
1b120 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ht = substExpr(d
1b130 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
1b140 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b150 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
1b160 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1b170 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1b180 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1b190 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  lect(db, pExpr->
1b1a0 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  x.pSelect, iTabl
1b1b0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1b1c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62  }else{.      sub
1b1d0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1b1e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  Expr->x.pList, i
1b1f0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b200 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1b210 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74  rn pExpr;.}.stat
1b220 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
1b230 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33  rList(.  sqlite3
1b240 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
1b250 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
1b260 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
1b270 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
1b280 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
1b290 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63  scan and in whic
1b2a0 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1b2b0 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tutes */.  int i
1b2c0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
1b2d0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73  /* Table to be s
1b2e0 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20  ubstituted */.  
1b2f0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1b300 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
1b310 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  te values */.){.
1b320 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1b330 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1b340 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1b350 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1b360 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
1b370 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74  i].pExpr = subst
1b380 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Expr(db, pList->
1b390 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
1b3a0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
1b3b0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1b3c0 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71  ubstSelect(.  sq
1b3d0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1b3e0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
1b3f0 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
1b400 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1b410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
1b420 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1b430 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
1b440 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a  ubstitutions */.
1b450 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1b460 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1b470 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a  to be replaced *
1b480 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1b490 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
1b4a0 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
1b4b0 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
1b4c0 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Src;.  struct Sr
1b4d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1b4e0 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
1b4f0 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
1b500 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1b510 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54  b, p->pEList, iT
1b520 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b530 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1b540 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
1b550 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b560 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
1b570 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
1b580 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b590 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  );.  p->pHaving 
1b5a0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b5b0 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62  p->pHaving, iTab
1b5c0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70  le, pEList);.  p
1b5d0 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1b5e0 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
1b5f0 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  re, iTable, pELi
1b600 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65  st);.  substSele
1b610 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  ct(db, p->pPrior
1b620 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b630 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  );.  pSrc = p->p
1b640 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1b650 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20  Src );  /* Even 
1b660 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77  for (SELECT 1) w
1b670 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20  e have: pSrc!=0 
1b680 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d  but pSrc->nSrc==
1b690 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59  0 */.  if( ALWAY
1b6a0 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66  S(pSrc) ){.    f
1b6b0 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c  or(i=pSrc->nSrc,
1b6c0 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20   pItem=pSrc->a; 
1b6d0 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
1b6e0 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53  +){.      substS
1b6f0 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d  elect(db, pItem-
1b700 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  >pSelect, iTable
1b710 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
1b720 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
1b730 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b740 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1b750 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1b760 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
1b770 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1b780 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1b790 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1b7a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1b7b0 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  W)./*.** This ro
1b7c0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
1b7d0 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
1b7e0 72 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72  ries as a perfor
1b7f0 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  mance optimizati
1b800 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
1b810 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66  ine returns 1 if
1b820 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65   it makes change
1b830 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c  s and 0 if no fl
1b840 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e  attening occurs.
1b850 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73  .**.** To unders
1b860 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74  tand the concept
1b870 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20   of flattening, 
1b880 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  consider the fol
1b890 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a  lowing.** query:
1b8a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
1b8b0 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T a FROM (SELECT
1b8c0 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
1b8d0 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57  1 WHERE z<100) W
1b8e0 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54  HERE a>5.**.** T
1b8f0 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f  he default way o
1b900 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
1b910 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20  his query is to 
1b920 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73  execute the.** s
1b930 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e  ubquery first an
1b940 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
1b950 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  lts in a tempora
1b960 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  ry table, then.*
1b970 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20  * run the outer 
1b980 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65  query on that te
1b990 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
1b9a0 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77  This requires tw
1b9b0 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72  o.** passes over
1b9c0 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74   the data.  Furt
1b9d0 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65  hermore, because
1b9e0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
1b9f0 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69  able.** has no i
1ba00 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52  ndices, the WHER
1ba10 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  E clause on the 
1ba20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
1ba30 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ot be.** optimiz
1ba40 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
1ba50 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
1ba60 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69  to rewrite queri
1ba70 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61  es such as the a
1ba80 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  bove into.** a s
1ba90 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63  ingle flat selec
1baa0 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  t, like this:.**
1bab0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78  .**     SELECT x
1bac0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1bad0 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20  WHERE z<100 AND 
1bae0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  a>5.**.** The co
1baf0 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  de generated for
1bb00 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61   this simplifica
1bb10 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73  tion gives the s
1bb20 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75  ame result.** bu
1bb30 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63  t only has to sc
1bb40 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65  an the data once
1bb50 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69  .  And because i
1bb60 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a  ndices might .**
1bb70 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61   exist on the ta
1bb80 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65  ble t1, a comple
1bb90 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64  te scan of the d
1bba0 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ata might be.** 
1bbb0 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  avoided..**.** F
1bbc0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c  lattening is onl
1bbd0 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61  y attempted if a
1bbe0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
1bbf0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
1bc00 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73  .**   (1)  The s
1bc10 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1bc20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1bc30 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72  ot both use aggr
1bc40 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
1bc50 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (2)  The subquer
1bc60 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1bc70 65 67 61 74 65 20 6f 72 20 28 32 61 29 20 74 68  egate or (2a) th
1bc80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1bc90 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20   not a join.**  
1bca0 20 20 20 20 20 20 61 6e 64 20 28 32 62 29 20 74        and (2b) t
1bcb0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1bcc0 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 75 62 71  oes not use subq
1bcd0 75 65 72 69 65 73 20 6f 74 68 65 72 20 74 68 61  ueries other tha
1bce0 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20  n the one.**    
1bcf0 20 20 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20      FROM-clause 
1bd00 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73  subquery that is
1bd10 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
1bd20 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 32   flattening.  (2
1bd30 62 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 64  b is.**        d
1bd40 75 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66  ue to ticket [2f
1bd50 37 31 37 30 64 37 33 62 66 39 61 62 66 38 30 5d  7170d73bf9abf80]
1bd60 20 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39   from 2015-02-09
1bd70 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  .).**.**   (3)  
1bd80 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1bd90 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
1bda0 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
1bdb0 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20  outer join.**   
1bdc0 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79       (Originally
1bdd0 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53   ticket #306.  S
1bde0 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74  trengthened by t
1bdf0 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a  icket #3300).**.
1be00 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
1be10 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
1be20 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  STINCT..**.**  (
1be30 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e  **)  At one poin
1be40 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  t restrictions (
1be50 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e  4) and (5) defin
1be60 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44  ed a subset of D
1be70 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20  ISTINCT.**      
1be80 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68    sub-queries th
1be90 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64  at were excluded
1bea0 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d   from this optim
1beb0 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63  ization. Restric
1bec0 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20  tion .**        
1bed0 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65  (4) has since be
1bee0 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65  en expanded to e
1bef0 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49  xclude all DISTI
1bf00 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a  NCT subqueries..
1bf10 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
1bf20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1bf30 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
1bf40 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
1bf50 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
1bf60 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
1bf70 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
1bf80 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
1bf90 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f  FROM clause.  TO
1bfa0 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72  DO:  For subquer
1bfb0 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20  ies without.**  
1bfc0 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61        A FROM cla
1bfd0 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64  use, consider ad
1bfe0 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73  ding a FROM clos
1bff0 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  e with the speci
1c000 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62  al.**        tab
1c010 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74  le sqlite_once t
1c020 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
1c030 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e  a single row con
1c040 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20  taining a.**    
1c050 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e      single NULL.
1c060 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68  .**.**   (8)  Th
1c070 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1c080 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
1c090 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c0a0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
1c0b0 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65  **.**   (9)  The
1c0c0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1c0d0 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1c0e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c0f0 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
1c100 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
1c110 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1c120 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29  Restriction (10)
1c130 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f   was removed fro
1c140 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30  m the code on 20
1c150 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a  05-02-05 but we.
1c160 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64 65  **        accide
1c170 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68 65  ntly carried the
1c180 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64   comment forward
1c190 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31   until 2014-09-1
1c1a0 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20  5.  Original.** 
1c1b0 20 20 20 20 20 20 20 74 65 78 74 3a 20 22 54 68         text: "Th
1c1c0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1c1d0 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
1c1e0 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
1c1f0 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20  query .**       
1c200 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1c210 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31  MIT.".**.**  (11
1c220 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c230 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1c240 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
1c250 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
1c260 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  auses..**.**  (*
1c270 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  *)  Not implemen
1c280 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
1c290 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
1c2a0 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
1c2b0 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
1c2c0 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
1c2d0 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
1c2e0 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
1c2f0 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
1c300 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
1c310 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1c320 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54  t both use LIMIT
1c330 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54  ..**.**  (14)  T
1c340 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c350 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e   not use OFFSET.
1c360 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68  .**.**  (15)  Th
1c370 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1c380 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63   not part of a c
1c390 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f  ompound select o
1c3a0 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
1c3b0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c3c0 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63  t have a LIMIT c
1c3d0 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  lause..**       
1c3e0 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33   (See ticket #23
1c3f0 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30  39 and ticket [0
1c400 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a  2a8e81d44])..**.
1c410 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75  **  (16)  The ou
1c420 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1c430 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1c440 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   the subquery do
1c450 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74  es.**        not
1c460 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
1c470 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34  Y.  (Ticket #294
1c480 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f  2)  This used to
1c490 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20   not matter.**  
1c4a0 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69        until we i
1c4b0 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72  ntroduced the gr
1c4c0 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e  oup_concat() fun
1c4d0 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20  ction.  .**.**  
1c4e0 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71 75  (17)  The sub-qu
1c4f0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d  ery is not a com
1c500 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72  pound select, or
1c510 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41   it is a UNION A
1c520 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  LL .**        co
1c530 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61  mpound clause ma
1c540 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f  de up entirely o
1c550 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  f non-aggregate 
1c560 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a  queries, and .**
1c570 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72 65          the pare
1c580 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  nt query:.**.** 
1c590 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
1c5a0 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66  t itself part of
1c5b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1c5c0 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ct,.**          
1c5d0 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  * is not an aggr
1c5e0 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43  egate or DISTINC
1c5f0 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20  T query, and.** 
1c600 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
1c610 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20  t a join.**.**  
1c620 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
1c630 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
1c640 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
1c650 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
1c660 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
1c670 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
1c680 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
1c690 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
1c6a0 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
1c6b0 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
1c6c0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54  FSET clauses.  T
1c6d0 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e  he subquery cann
1c6e0 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f  ot use any compo
1c6f0 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
1c700 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61  erator other tha
1c710 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61  n UNION ALL beca
1c720 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  use all the othe
1c730 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  r compound.**   
1c740 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68       operators h
1c750 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44  ave an implied D
1c760 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69 73  ISTINCT which is
1c770 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a   disallowed by.*
1c780 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69 63  *        restric
1c790 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20  tion (4)..**.** 
1c7a0 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63         Also, eac
1c7b0 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74  h component of t
1c7c0 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73  he sub-query mus
1c7d0 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  t return the sam
1c7e0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20  e number.**     
1c7f0 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c     of result col
1c800 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63  umns. This is ac
1c810 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65  tually a require
1c820 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d  ment for any com
1c830 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1c840 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1c850 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f  , but all the co
1c860 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73 20  de here does is 
1c870 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e  make sure that n
1c880 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68  o.**        such
1c890 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71   (illegal) sub-q
1c8a0 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65  uery is flattene
1c8b0 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
1c8c0 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a  ll detect the.**
1c8d0 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20 65          syntax e
1c8e0 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20  rror and return 
1c8f0 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61  a detailed messa
1c900 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20  ge..**.**  (18) 
1c910 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1c920 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1c930 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c  select, then all
1c940 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
1c950 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62 79          ORDER by
1c960 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70   clause of the p
1c970 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69  arent must be si
1c980 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  mple references 
1c990 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  to .**        co
1c9a0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62  lumns of the sub
1c9b0 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28  -query..**.**  (
1c9c0 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  19)  The subquer
1c9d0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1c9e0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1c9f0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1ca00 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
1ca10 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
1ca20 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
1ca30 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1ca40 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1ca50 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
1ca60 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
1ca70 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
1ca80 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
1ca90 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
1caa0 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
1cab0 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
1cac0 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
1cad0 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
1cae0 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
1caf0 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
1cb00 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
1cb10 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
1cb20 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
1cb30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1cb40 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
1cb50 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
1cb60 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
1cb70 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
1cb80 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
1cb90 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62 71    (21)  The subq
1cba0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1cbb0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1cbc0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1cbd0 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
1cbe0 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b  INCT.  (See tick
1cbf0 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29  et [752e1646fc])
1cc00 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54  ..**.**  (22)  T
1cc10 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1cc20 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 43  ot a recursive C
1cc30 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20  TE..**.**  (23) 
1cc40 20 54 68 65 20 70 61 72 65 6e 74 20 69 73 20 6e   The parent is n
1cc50 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 43  ot a recursive C
1cc60 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62 2d 71  TE, or the sub-q
1cc70 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  uery is not a.**
1cc80 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
1cc90 20 71 75 65 72 79 2e 20 54 68 69 73 20 72 65 73   query. This res
1cca0 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61  triction is beca
1ccb0 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67  use transforming
1ccc0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70   the.**        p
1ccd0 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f  arent to a compo
1cce0 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73  und query confus
1ccf0 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  es the code that
1cd00 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20   handles.**     
1cd10 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65     recursive que
1cd20 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c  ries in multiSel
1cd30 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  ect()..**.**  (2
1cd40 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1cd50 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1cd60 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74  gate that uses t
1cd70 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28  he built-in min(
1cd80 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  ) or .**        
1cd90 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
1cda0 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68  ns.  (Without th
1cdb0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20  is restriction, 
1cdc0 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a  a query like:.**
1cdd0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
1cde0 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d  x FROM (SELECT m
1cdf0 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31  ax(y), x FROM t1
1ce00 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63  )" would not nec
1ce10 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20  essarily.**     
1ce20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61     return the va
1ce30 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20  lue X for which 
1ce40 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a  Y was maximal.).
1ce50 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  **.**.** In this
1ce60 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
1ce70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
1ce80 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1ce90 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
1cea0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1ceb0 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
1cec0 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
1ced0 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
1cee0 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
1cef0 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
1cf00 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
1cf10 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
1cf20 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
1cf30 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
1cf40 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
1cf50 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
1cf60 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1cf70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
1cf80 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1cf90 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
1cfa0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1cfb0 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
1cfc0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1cfd0 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
1cfe0 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
1cff0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
1d000 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
1d010 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
1d020 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
1d030 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
1d040 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
1d050 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1d060 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1d070 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1d080 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
1d090 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
1d0a0 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
1d0b0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
1d0c0 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
1d0d0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
1d0e0 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
1d0f0 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
1d100 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
1d110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d120 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
1d130 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
1d140 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
1d150 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
1d160 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
1d170 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1d180 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1d190 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  tions */.){.  co
1d1a0 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
1d1b0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
1d1c0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1d1d0 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50  xt;.  Select *pP
1d1e0 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20  arent;.  Select 
1d1f0 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
1d200 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
1d210 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
1d220 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
1d230 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
1d240 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
1d250 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
1d260 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
1d270 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
1d280 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1d290 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1d2a0 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
1d2b0 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
1d2c0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1d2d0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1d2e0 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
1d2f0 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
1d300 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1d310 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d320 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
1d330 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
1d340 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
1d350 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
1d360 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
1d370 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1d380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d390 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
1d3a0 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3c0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1d3d0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1d3e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1d3f0 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
1d400 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
1d410 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d420 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
1d430 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
1d440 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1d450 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
1d460 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
1d470 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
1d480 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
1d490 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55  rior==0 );  /* U
1d4a0 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e  nable to flatten
1d4b0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65   compound querie
1d4c0 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  s */.  if( Optim
1d4d0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1d4e0 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
1d4f0 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74  Flattener) ) ret
1d500 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
1d510 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
1d520 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
1d530 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
1d540 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
1d550 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
1d560 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
1d570 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
1d580 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
1d590 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1d5a0 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
1d5b0 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  ub!=0 );.  if( s
1d5c0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1d5d0 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20      if( isAgg ) 
1d5e0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d600 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d610 72 69 63 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f  riction (1)   */
1d620 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
1d630 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
1d640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d660 74 72 69 63 74 69 6f 6e 20 28 32 61 29 20 20 2a  triction (2a)  *
1d670 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 57  /.    if( (p->pW
1d680 68 65 72 65 20 26 26 20 45 78 70 72 48 61 73 50  here && ExprHasP
1d690 72 6f 70 65 72 74 79 28 70 2d 3e 70 57 68 65 72  roperty(p->pWher
1d6a0 65 2c 45 50 5f 53 75 62 71 75 65 72 79 29 29 0a  e,EP_Subquery)).
1d6b0 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33       || (sqlite3
1d6c0 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d  ExprListFlags(p-
1d6d0 3e 70 45 4c 69 73 74 29 20 26 20 45 50 5f 53 75  >pEList) & EP_Su
1d6e0 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20 20  bquery)!=0.     
1d6f0 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c  || (sqlite3ExprL
1d700 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64  istFlags(p->pOrd
1d710 65 72 42 79 29 20 26 20 45 50 5f 53 75 62 71 75  erBy) & EP_Subqu
1d720 65 72 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  ery)!=0.    ){. 
1d730 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d770 69 63 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a  iction (2b)  */.
1d780 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20      }.  }.    . 
1d790 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
1d7a0 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1d7b0 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a   pSubSrc );.  /*
1d7c0 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f   Prior to versio
1d7d0 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49  n 3.1.2, when LI
1d7e0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68  MIT and OFFSET h
1d7f0 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20  ad to be simple 
1d800 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20  constants,.  ** 
1d810 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78  not arbitrary ex
1d820 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c  pressions, we al
1d830 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69  lowed some combi
1d840 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e  ning of LIMIT an
1d850 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
1d860 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64  cause they could
1d870 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20   be computed at 
1d880 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42  compile-time.  B
1d890 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  ut when LIMIT an
1d8a0 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
1d8b0 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65  came arbitrary e
1d8c0 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77  xpressions, we w
1d8d0 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64  ere forced to ad
1d8e0 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  d restrictions (
1d8f0 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34  13).  ** and (14
1d900 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ). */.  if( pSub
1d910 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
1d920 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
1d930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1d940 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1d950 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  3) */.  if( pSub
1d960 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75  ->pOffset ) retu
1d970 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d990 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1d9a0 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  4) */.  if( (p->
1d9b0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
1d9c0 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53  mpound)!=0 && pS
1d9d0 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
1d9e0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da10 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1da20 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20  ction (15) */.  
1da30 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  }.  if( pSubSrc-
1da40 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
1da50 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1da60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1da70 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a  striction (7)  *
1da80 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  /.  if( pSub->se
1da90 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1daa0 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
1dab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1dac0 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a  striction (5)  *
1dad0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1dae0 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e  imit && (pSrc->n
1daf0 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
1db00 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1db10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1db20 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29  trictions (8)(9)
1db30 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
1db40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1db50 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20  Distinct)!=0 && 
1db60 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1db70 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1db80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1db90 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20  iction (6)  */. 
1dba0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
1dbb0 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
1dbc0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
1dbd0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dc10 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
1dc20 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
1dc30 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
1dc40 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1dc50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1dc60 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20  ction (16) */.  
1dc70 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1dc80 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20   && p->pWhere ) 
1dc90 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1dca0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1dcb0 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20  ction (19) */.  
1dcc0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1dcd0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
1dce0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
1dcf0 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  =0 ){.     retur
1dd00 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
1dd10 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29  Restriction (21)
1dd20 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   */.  }.  testca
1dd30 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  se( pSub->selFla
1dd40 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
1dd50 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  e );.  testcase(
1dd60 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1dd70 26 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29  & SF_MinMaxAgg )
1dd80 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  ;.  if( pSub->se
1dd90 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63  lFlags & (SF_Rec
1dda0 75 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78  ursive|SF_MinMax
1ddb0 41 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Agg) ){.    retu
1ddc0 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
1ddd0 74 69 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28  tions (22) and (
1dde0 32 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  24) */.  }.  if(
1ddf0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1de00 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26  SF_Recursive) &&
1de10 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b   pSub->pPrior ){
1de20 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
1de30 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
1de40 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  3) */.  }..  /* 
1de50 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
1de60 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63   1:.  ** Restric
1de70 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
1de80 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
1de90 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
1dea0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
1deb0 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
1dec0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1ded0 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
1dee0 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
1def0 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
1df00 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1df10 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1df20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1df30 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
1df40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1df50 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1df60 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1df70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1df80 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1df90 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
1dfa0 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
1dfb0 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
1dfc0 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
1dfd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c  .  **.  ** OBSOL
1dfe0 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20  ETE COMMENT 2:. 
1dff0 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
1e000 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
1e010 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1e020 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
1e030 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
1e040 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
1e050 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1e060 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
1e070 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
1e080 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
1e090 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
1e0a0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1e0b0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1e0c0 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
1e0d0 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
1e0e0 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
1e0f0 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
1e100 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
1e110 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
1e120 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
1e130 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
1e140 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
1e150 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
1e160 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
1e170 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
1e180 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
1e190 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
1e1a0 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
1e1b0 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
1e1c0 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
1e1d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20  .  **.  ** THIS 
1e1e0 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45  OVERRIDES OBSOLE
1e1f0 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e  TE COMMENTS 1 AN
1e200 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20  D 2 ABOVE:.  ** 
1e210 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f  Ticket #3300 sho
1e220 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69  ws that flatteni
1e230 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ng the right ter
1e240 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
1e250 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74  .  ** is fraught
1e260 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42   with danger.  B
1e270 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65  est to avoid the
1e280 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49   whole thing.  I
1e290 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  f the.  ** subqu
1e2a0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1e2b0 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
1e2c0 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  JOIN, then do no
1e2d0 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a  t flatten..  */.
1e2e0 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
1e2f0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
1e300 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
1e310 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1e320 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e330 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  17: If the sub-q
1e340 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1e350 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
1e360 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
1e370 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
1e380 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
1e390 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
1e3a0 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
1e3b0 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
1e3c0 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
1e3d0 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
1e3e0 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
1e3f0 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
1e400 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
1e410 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1e420 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
1e430 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
1e440 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
1e450 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
1e460 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d  tion 20 */.    }
1e470 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
1e480 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
1e490 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1e4a0 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
1e4b0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
1e4c0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 0;.    }.    f
1e4d0 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
1e4e0 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
1e4f0 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
1e500 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1e510 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1e520 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1e530 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
1e540 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
1e550 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1e560 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1e570 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1e580 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
1e590 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
1e5a0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1e5b0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
1e5c0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
1e5d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
1e5e0 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
1e5f0 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
1e600 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1e610 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1e620 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
1e630 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
1e640 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
1e650 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
1e660 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31  .       || pSub1
1e670 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20  ->pSrc->nSrc<1. 
1e680 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1e690 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1e6a0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
1e6b0 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
1e6c0 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
1e6d0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e6e0 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66  on 18. */.    if
1e6f0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
1e700 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
1e710 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
1e720 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
1e730 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1e740 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
1e750 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
1e760 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
1e770 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1e780 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1e790 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
1e7a0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
1e7b0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1e7c0 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20  mitted. *****/. 
1e7d0 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
1e7e0 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65  Parse,p,("flatte
1e7f0 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72  n %s.%p from ter
1e800 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m %d\n",.       
1e810 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
1e820 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62  ->zSelName, pSub
1e830 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a  , iFrom));..  /*
1e840 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
1e850 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
1e860 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1e870 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
1e880 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
1e890 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
1e8a0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1e8b0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1e8c0 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
1e8d0 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
1e8e0 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
1e8f0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
1e900 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
1e910 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
1e920 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1e930 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
1e940 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
1e950 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
1e960 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
1e970 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
1e980 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
1e990 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1e9a0 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
1e9b0 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
1e9c0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1e9d0 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
1e9e0 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
1e9f0 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
1ea00 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
1ea10 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
1ea20 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
1ea30 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1ea40 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
1ea50 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
1ea60 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
1ea70 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
1ea80 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1ea90 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
1eaa0 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
1eab0 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
1eac0 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
1ead0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
1eae0 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
1eaf0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
1eb00 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
1eb10 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1eb20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
1eb30 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
1eb40 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
1eb50 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
1eb60 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
1eb70 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1eb80 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
1eb90 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
1eba0 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
1ebb0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
1ebc0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1ebd0 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
1ebe0 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1ebf0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1ec00 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
1ec10 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
1ec20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
1ec30 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
1ec40 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
1ec50 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
1ec60 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
1ec70 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
1ec80 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
1ec90 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1eca0 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
1ecb0 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
1ecc0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
1ecd0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
1ece0 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
1ecf0 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
1ed00 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
1ed10 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
1ed20 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
1ed30 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
1ed40 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1ed50 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
1ed60 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
1ed70 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
1ed80 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
1ed90 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
1eda0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
1edb0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
1edc0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1edd0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
1ede0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
1edf0 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20  Expr *pOffset = 
1ee00 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
1ee10 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
1ee20 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
1ee30 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
1ee40 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
1ee50 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
1ee60 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
1ee70 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  it = 0;.    p->p
1ee80 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
1ee90 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  pNew = sqlite3Se
1eea0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30  lectDup(db, p, 0
1eeb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1eec0 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77  lectSetName(pNew
1eed0 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65  , pSub->zSelName
1eee0 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  );.    p->pOffse
1eef0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
1ef00 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
1ef10 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
1ef20 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1ef30 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
1ef40 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
1ef50 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
1ef60 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1ef70 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
1ef80 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
1ef90 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
1efa0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1efb0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
1efc0 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
1efd0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
1efe0 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
1eff0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1f000 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45  pNew;.      SELE
1f010 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65  CTTRACE(2,pParse
1f020 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63  ,p,.         ("c
1f030 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1f040 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74   flattener creat
1f050 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72  es %s.%p as peer
1f060 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e  \n",.         pN
1f070 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e  ew->zSelName, pN
1f080 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ew));.    }.    
1f090 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1f0a0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1f0b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1f0c0 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1f0d0 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
1f0e0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1f0f0 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
1f100 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
1f110 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
1f120 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1f130 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
1f140 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
1f150 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
1f160 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f170 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1f180 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
1f190 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1f1a0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1f1b0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f1c0 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1f1d0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
1f1e0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1f1f0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1f200 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
1f210 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
1f220 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
1f230 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
1f240 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
1f250 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
1f260 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
1f270 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
1f280 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1f290 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
1f2a0 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
1f2b0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
1f2c0 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
1f2d0 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
1f2e0 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
1f2f0 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
1f300 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
1f310 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
1f320 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
1f330 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
1f340 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
1f350 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
1f360 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
1f370 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
1f380 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
1f390 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
1f3a0 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
1f3b0 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
1f3c0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
1f3d0 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
1f3e0 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
1f3f0 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31  abToDel->nRef==1
1f400 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
1f410 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1f420 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1f430 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
1f440 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
1f450 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
1f460 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
1f470 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
1f480 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
1f490 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
1f4a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
1f4b0 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  oDel->nRef--;.  
1f4c0 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d    }.    pSubitem
1f4d0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a  ->pTab = 0;.  }.
1f4e0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1f4f0 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ing loop runs on
1f500 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ce for each term
1f510 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   in a compound-s
1f520 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61  ubquery.  ** fla
1f530 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63  ttening (as desc
1f540 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49  ribed above).  I
1f550 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1f560 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a   different kind.
1f570 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69    ** of flatteni
1f580 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e  ng - a flattenin
1f590 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  g other than a c
1f5a0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1f5b0 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20   flattening -.  
1f5c0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f  ** then this loo
1f5d0 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
1f5e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
1f5f0 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20   loop moves all 
1f600 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
1f610 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
1f620 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
1f630 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
1f640 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1f650 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
1f660 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
1f670 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
1f680 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
1f690 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
1f6a0 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
1f6b0 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
1f6c0 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
1f6d0 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
1f6e0 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
1f6f0 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
1f700 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
1f710 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
1f720 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
1f730 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
1f740 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
1f750 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
1f760 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
1f770 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
1f780 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
1f790 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
1f7a0 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
1f7b0 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  n..  */.  for(pP
1f7c0 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
1f7d0 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
1f7e0 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
1f7f0 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
1f800 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a     int nSubSrc;.
1f810 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20      u8 jointype 
1f820 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63  = 0;.    pSubSrc
1f830 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20   = pSub->pSrc;  
1f840 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
1f850 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  e of subquery */
1f860 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70  .    nSubSrc = p
1f870 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f  SubSrc->nSrc;  /
1f880 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1f890 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52  s in subquery FR
1f8a0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
1f8b0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
1f8c0 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
1f8d0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1f8e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1f8f0 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
1f900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f910 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a  Parent==p );  /*
1f920 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f   First time thro
1f930 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
1f940 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d        jointype =
1f950 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74   pSubitem->joint
1f960 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ype;.    }else{.
1f970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1f980 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20  arent!=p );  /* 
1f990 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
1f9a0 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68  nt times through
1f9b0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1f9c0 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
1f9d0 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  t->pSrc = sqlite
1f9e0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
1f9f0 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
1fa00 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29     if( pSrc==0 )
1fa10 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1fa20 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1fa30 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed );.        br
1fa40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1fa50 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   }..    /* The s
1fa60 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73  ubquery uses a s
1fa70 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68  ingle slot of th
1fa80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1fa90 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a   the outer.    *
1faa0 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  * query.  If the
1fab0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f   subquery has mo
1fac0 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d  re than one elem
1fad0 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ent in its FROM 
1fae0 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74  clause,.    ** t
1faf0 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f  hen expand the o
1fb00 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61  uter query to ma
1fb10 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20  ke space for it 
1fb20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d  to hold all elem
1fb30 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
1fb40 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
1fb50 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
1fb60 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1fb70 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
1fb80 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54  OM tabA, (SELECT
1fb90 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75   * FROM sub1, su
1fba0 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a  b2), tabB;.    *
1fbb0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74  *.    ** The out
1fbc0 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73  er query has 3 s
1fbd0 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d  lots in its FROM
1fbe0 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c   clause.  One sl
1fbf0 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ot of the.    **
1fc00 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68   outer query (th
1fc10 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69  e middle slot) i
1fc20 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75  s used by the su
1fc30 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78  bquery.  The nex
1fc40 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f  t.    ** block o
1fc50 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61  f code will expa
1fc60 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65 72 79  nd the out query
1fc70 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68   to 4 slots.  Th
1fc80 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20  e middle.    ** 
1fc90 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64  slot is expanded
1fca0 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e   to two slots in
1fcb0 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
1fcc0 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20  pace for the.   
1fcd0 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
1fce0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1fcf0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
1fd00 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
1fd10 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
1fd20 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1fd30 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71  pSrc = pSrc = sq
1fd40 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1fd50 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53  rge(db, pSrc, nS
1fd60 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29  ubSrc-1,iFrom+1)
1fd70 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
1fd80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1fd90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1fda0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1fdb0 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
1fdc0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1fdd0 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  rms from the sub
1fde0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1fdf0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1fe00 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
1fe10 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
1fe20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1fe30 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1fe40 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b  e(db, pSrc->a[i+
1fe50 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a  iFrom].pUsing);.
1fe60 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
1fe70 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
1fe80 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
1fe90 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
1fea0 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
1feb0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
1fec0 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
1fed0 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70  a[iFrom].jointyp
1fee0 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
1fef0 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  .    /* Now begi
1ff00 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
1ff10 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
1ff20 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
1ff30 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  or .    ** refer
1ff40 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
1ff50 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
1ff60 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20  r query..    ** 
1ff70 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
1ff80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ff90 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
1ffa0 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
1ffb0 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
1ffc0 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
1ffd0 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20  E a>b;.    **   
1ffe0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
1fff0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
20000 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
20010 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
20020 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c     /.    **    \
20030 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20040 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
20050 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
20060 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20070 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  /.    **.    ** 
20080 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
20090 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
200a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
200b0 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
200c0 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22  e see.    ** "a"
200d0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
200e0 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
200f0 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
20100 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
20110 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  +10"..    */.   
20120 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74   pList = pParent
20130 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
20140 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
20150 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
20160 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
20170 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  i].zName==0 ){. 
20180 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
20190 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
201a0 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
201b0 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
201c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
201d0 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
201e0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
201f0 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
20200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
20210 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
20220 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69  b, pParent->pELi
20230 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
20240 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
20250 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
20260 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
20270 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47  (db, pParent->pG
20280 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c  roupBy, iParent,
20290 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
202a0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
202b0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
202c0 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
202d0 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
202e0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
202f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
20300 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
20310 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69  .      /* At thi
20320 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e  s point, any non
20330 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f  -zero iOrderByCo
20340 6c 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74  l values indicat
20350 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
20360 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c   ** ORDER BY col
20370 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  umn expression i
20380 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74  s identical to t
20390 68 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74  he iOrderByCol't
203a0 68 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  h.      ** expre
203b0 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62  ssion returned b
203c0 79 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  y SELECT stateme
203d0 6e 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74  nt pSub. Since t
203e0 68 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20  hese values.    
203f0 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65    ** do not nece
20400 73 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f  ssarily correspo
20410 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  nd to columns in
20420 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20430 74 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20  t pParent,.     
20440 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65   ** zero them be
20450 66 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67  fore transfering
20460 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
20470 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ause..      **. 
20480 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e       ** Not doin
20490 67 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65  g this may cause
204a0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73   an error if a s
204b0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74  ubsequent call t
204c0 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  o this.      ** 
204d0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
204e0 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63  s to flatten a c
204f0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
20500 79 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20  y into pParent. 
20510 20 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c       ** (the onl
20520 79 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  y way this can h
20530 61 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20  appen is if the 
20540 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
20550 72 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63  ry is.      ** c
20560 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66  urrently part of
20570 20 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65   pSub->pSrc). Se
20580 65 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65  e ticket [d11a6e
20590 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20  908f].  */.     
205a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
205b0 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
205c0 65 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28  erBy;.      for(
205d0 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
205e0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
205f0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
20600 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
20610 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
20620 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
20630 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
20640 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  y==0 );.      as
20650 73 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69  sert( pSub->pPri
20660 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  or==0 );.      p
20670 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
20680 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
20690 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
206a0 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 0;.    }else
206b0 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f   if( pParent->pO
206c0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
206d0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
206e0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  , pParent->pOrde
206f0 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  rBy, iParent, pS
20700 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
20710 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d   }.    if( pSub-
20720 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20  >pWhere ){.     
20730 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
20740 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
20750 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  b->pWhere, 0);. 
20760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20770 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
20780 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65  }.    if( subque
20790 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
207a0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
207b0 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
207c0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
207d0 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74  Having = pParent
207e0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  ->pWhere;.      
207f0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
20800 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  = pWhere;.      
20810 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20820 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
20830 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
20840 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
20850 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
20860 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
20870 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
20880 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
20890 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20  pHaving, .      
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
208c0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
208d0 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29  Sub->pHaving, 0)
208e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
208f0 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
20900 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
20910 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
20920 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
20930 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  stDup(db, pSub->
20940 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20  pGroupBy, 0);.  
20950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20960 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
20970 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
20980 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
20990 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
209a0 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
209b0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
209c0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
209d0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
209e0 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20  re, pWhere);.   
209f0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
20a00 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
20a10 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
20a20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
20a30 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
20a40 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
20a50 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
20a60 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c      pParent->sel
20a70 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73  Flags |= pSub->s
20a80 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
20a90 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  tinct;.  .    /*
20aa0 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  .    ** SELECT .
20ab0 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
20ac0 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
20ad0 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
20ae0 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20  FSET y;.    **. 
20af0 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d     ** One is tem
20b00 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
20b10 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
20b20 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
20b30 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20  .  But this.    
20b40 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
20b50 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
20b60 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
20b70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
20b80 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
20b90 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d     pParent->pLim
20ba0 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
20bb0 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  t;.      pSub->p
20bc0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Limit = 0;.    }
20bd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
20be0 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
20bf0 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
20c00 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
20c10 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
20c20 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
20c30 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
20c40 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45   pSub1);..#if SE
20c50 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
20c60 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
20c70 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
20c80 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
20c90 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
20ca0 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61  se,p,("After fla
20cb0 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  ttening:\n"));. 
20cc0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
20cd0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
20ce0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
20cf0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
20d00 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
20d10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
20d20 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
20d30 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
20d40 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  EW) */....#if !d
20d50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
20d60 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
20d70 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
20d80 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
20d90 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
20da0 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63  relevant WHERE c
20db0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74  lause terms of t
20dc0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
20dd0 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45  nto.** the WHERE
20de0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
20df0 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ery.  Example:.*
20e00 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
20e10 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
20e20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
20e30 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d  ROM t1) WHERE x=
20e40 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
20e50 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
20e60 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  to:.**.**    SEL
20e70 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
20e80 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
20e90 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S y FROM t1 WHER
20ea0 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30  E a=5 AND c-d=10
20eb0 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78  ).**     WHERE x
20ec0 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
20ed0 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74  ** The hope is t
20ee0 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64  hat the terms ad
20ef0 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72  ded to the inner
20f00 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65   query will make
20f10 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69   it more.** effi
20f20 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20  cient..**.** Do 
20f30 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73  not attempt this
20f40 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
20f50 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68  :.**.**   (1) Th
20f60 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
20f70 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
20f80 28 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 77  (In that case, w
20f90 65 27 64 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a  e'd really want.
20fa0 2a 2a 20 20 20 20 20 20 20 74 6f 20 63 6f 70 79  **       to copy
20fb0 20 74 68 65 20 6f 75 74 65 72 20 57 48 45 52 45   the outer WHERE
20fc0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 6e  -clause terms on
20fd0 74 6f 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  to the HAVING cl
20fe0 61 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20  ause of the.**  
20ff0 20 20 20 20 20 69 6e 6e 65 72 20 71 75 65 72 79       inner query
21000 2e 20 20 42 75 74 20 74 68 65 79 20 70 72 6f 62  .  But they prob
21010 61 62 6c 79 20 77 6f 6e 27 74 20 68 65 6c 70 20  ably won't help 
21020 74 68 65 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20  there so do not 
21030 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20  bother.).**.**  
21040 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (2) The inner q
21050 75 65 72 79 20 69 73 20 74 68 65 20 72 65 63 75  uery is the recu
21060 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20  rsive part of a 
21070 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
21080 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
21090 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (3) The inner q
210a0 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54  uery has a LIMIT
210b0 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74   clause (since t
210c0 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
210d0 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20  e WHERE.**      
210e0 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61   close would cha
210f0 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20  nge the meaning 
21100 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a  of the LIMIT)..*
21110 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69  *.**   (4) The i
21120 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68  nner query is th
21130 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
21140 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
21150 20 28 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20   (The caller.** 
21160 20 20 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74        enforces t
21170 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
21180 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
21190 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ne does not have
211a0 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20   enough.**      
211b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
211c0 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74  know.).**.** Ret
211d0 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e  urn 0 if no chan
211e0 67 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64  ges are made and
211f0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65   non-zero if one
21200 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63   or more WHERE c
21210 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61  lause.** terms a
21220 72 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e  re duplicated in
21230 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  to the subquery.
21240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
21250 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
21260 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
21270 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
21280 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
21290 63 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c 6f  ction (for mallo
212a0 63 28 29 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74  c()) */.  Select
212b0 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20   *pSubq,        
212c0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
212d0 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75  whose WHERE clau
212e0 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d  se is to be augm
212f0 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ented */.  Expr 
21300 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
21310 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
21320 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
21330 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
21340 20 69 43 75 72 73 6f 72 20 20 20 20 20 20 20 20   iCursor        
21350 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
21360 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75  ber of the subqu
21370 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ery */.){.  Expr
21380 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43   *pNew;.  int nC
21390 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  hng = 0;.  if( p
213a0 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72  Where==0 ) retur
213b0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62  n 0;.  if( (pSub
213c0 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  q->selFlags & (S
213d0 46 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52  F_Aggregate|SF_R
213e0 65 63 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b  ecursive))!=0 ){
213f0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
21400 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  /* restrictions 
21410 28 31 29 20 61 6e 64 20 28 32 29 20 2a 2f 0a 20  (1) and (2) */. 
21420 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e   }.  if( pSubq->
21430 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20  pLimit!=0 ){.   
21440 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
21450 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a  estriction (3) *
21460 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  /.  }.  while( p
21470 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  Where->op==TK_AN
21480 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b  D ){.    nChng +
21490 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  = pushDownWhereT
214a0 65 72 6d 73 28 64 62 2c 20 70 53 75 62 71 2c 20  erms(db, pSubq, 
214b0 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20  pWhere->pRight, 
214c0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57  iCursor);.    pW
214d0 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70  here = pWhere->p
214e0 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Left;.  }.  if( 
214f0 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
21500 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72  leConstant(pWher
21510 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20  e, iCursor) ){. 
21520 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20     nChng++;.    
21530 77 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a  while( pSubq ){.
21540 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
21550 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
21560 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
21570 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78    pNew = substEx
21580 70 72 28 64 62 2c 20 70 4e 65 77 2c 20 69 43 75  pr(db, pNew, iCu
21590 72 73 6f 72 2c 20 70 53 75 62 71 2d 3e 70 45 4c  rsor, pSubq->pEL
215a0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 53 75 62  ist);.      pSub
215b0 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  q->pWhere = sqli
215c0 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
215d0 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e  Subq->pWhere, pN
215e0 65 77 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71  ew);.      pSubq
215f0 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72   = pSubq->pPrior
21600 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21610 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65  turn nChng;.}.#e
21620 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
21630 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
21640 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
21650 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
21660 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  IEW) */../*.** B
21670 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
21680 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49  ents of the AggI
21690 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
216a0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
216b0 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
216c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
216d0 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f  checks if the fo
216e0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
216f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
21700 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
21710 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67  just a single ag
21720 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
21730 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67  ,.**    * the ag
21740 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
21750 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29   is either min()
21760 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a   or max(), and.*
21770 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d  *    * the argum
21780 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  ent to the aggre
21790 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
217a0 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e   a column value.
217b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  .**.** If all of
217c0 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74   the above are t
217d0 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f  rue, then WHERE_
217e0 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
217f0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
21800 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
21810 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
21820 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20  Also, *ppMinMax 
21830 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
21840 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20  to the .** list 
21850 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
21860 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65  sed to the aggre
21870 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75  gate before retu
21880 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  rning..**.** Or,
21890 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   if the conditio
218a0 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74  ns above are not
218b0 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20   met, *ppMinMax 
218c0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a  is set to 0 and.
218d0 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ** WHERE_ORDERBY
218e0 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72  _NORMAL is retur
218f0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ned..*/.static u
21900 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67  8 minMaxQuery(Ag
21910 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c  gInfo *pAggInfo,
21920 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69   ExprList **ppMi
21930 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65  nMax){.  int eRe
21940 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
21950 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20  Y_NORMAL;       
21960 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
21970 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d  ue */..  *ppMinM
21980 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41  ax = 0;.  if( pA
21990 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31  ggInfo->nFunc==1
219a0 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45   ){.    Expr *pE
219b0 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  xpr = pAggInfo->
219c0 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20  aFunc[0].pExpr; 
219d0 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e  /* Aggregate fun
219e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70  ction */.    Exp
219f0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
21a00 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20  pExpr->x.pList; 
21a10 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
21a20 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f  s to agg functio
21a30 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  n */..    assert
21a40 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
21a50 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
21a60 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
21a70 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
21a80 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
21a90 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  0].pExpr->op==TK
21aa0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
21ab0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
21ac0 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e  *zFunc = pExpr->
21ad0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
21ae0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
21af0 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29  mp(zFunc, "min")
21b00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
21b10 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
21b20 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20  RBY_MIN;.       
21b30 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
21b40 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ist;.      }else
21b50 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
21b60 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22  Cmp(zFunc, "max"
21b70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21b80 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
21b90 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20  ERBY_MAX;.      
21ba0 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
21bb0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
21bc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
21bd0 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20  t( *ppMinMax==0 
21be0 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e  || (*ppMinMax)->
21bf0 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65  nExpr==1 );.  re
21c00 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn eRet;.}../*
21c10 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
21c20 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
21c30 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
21c40 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72  ument is an aggr
21c50 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
21c60 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
21c70 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63  ent is the assoc
21c80 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d  iated aggregate-
21c90 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69  info object. Thi
21ca0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74  s .** function t
21cb0 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45  ests if the SELE
21cc0 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  CT is of the for
21cd0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  m:.**.**   SELEC
21ce0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
21cf0 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72  <tbl>.**.** wher
21d00 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74  e table is a dat
21d10 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74  abase table, not
21d20 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
21d30 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75   view. If the qu
21d40 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63  ery.** does matc
21d50 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20  h this pattern, 
21d60 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
21d70 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  o the Table obje
21d80 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a  ct representing.
21d90 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75  ** <tbl> is retu
21da0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
21db0 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a   0 is returned..
21dc0 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20  */.static Table 
21dd0 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53  *isSimpleCount(S
21de0 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66  elect *p, AggInf
21df0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
21e00 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45  Table *pTab;.  E
21e10 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61  xpr *pExpr;..  a
21e20 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75  ssert( !p->pGrou
21e30 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  pBy );..  if( p-
21e40 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45  >pWhere || p->pE
21e50 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a  List->nExpr!=1 .
21e60 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e     || p->pSrc->n
21e70 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72  Src!=1 || p->pSr
21e80 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a  c->a[0].pSelect.
21e90 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
21ea0 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
21eb0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
21ec0 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d  ab;.  pExpr = p-
21ed0 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
21ee0 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
21ef0 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53  Tab && !pTab->pS
21f00 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29  elect && pExpr )
21f10 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  ;..  if( IsVirtu
21f20 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
21f30 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
21f40 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
21f50 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
21f60 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41  ;.  if( NEVER(pA
21f70 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30  ggInfo->nFunc==0
21f80 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
21f90 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61  if( (pAggInfo->a
21fa0 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66  Func[0].pFunc->f
21fb0 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  uncFlags&SQLITE_
21fc0 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29  FUNC_COUNT)==0 )
21fd0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
21fe0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50   pExpr->flags&EP
21ff0 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  _Distinct ) retu
22000 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rn 0;..  return 
22010 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pTab;.}../*.** I
22020 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
22030 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73  t item passed as
22040 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73   an argument was
22050 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
22060 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59  an.** INDEXED BY
22070 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72   clause, then tr
22080 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  y to locate the 
22090 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e  specified index.
220a0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73   If there.** was
220b0 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61   such a clause a
220c0 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  nd the named ind
220d0 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ex cannot be fou
220e0 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  nd, return .** S
220f0 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20  QLITE_ERROR and 
22100 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  leave an error i
22110 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77  n pParse. Otherw
22120 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a  ise, populate .*
22130 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20  * pFrom->pIndex 
22140 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
22150 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
22160 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
22170 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  kup(Parse *pPars
22180 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
22190 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
221a0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
221b0 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  b && pFrom->zInd
221c0 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61  exedBy ){.    Ta
221d0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
221e0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61  m->pTab;.    cha
221f0 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  r *zIndexedBy = 
22200 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 65 64 42  pFrom->zIndexedB
22210 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  y;.    Index *pI
22220 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
22230 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a  =pTab->pIndex; .
22240 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20          pIdx && 
22250 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
22260 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64  Idx->zName, zInd
22270 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20  exedBy); .      
22280 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
22290 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
222a0 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
222b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
222c0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
222d0 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
222e0 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20  ndexedBy, 0);.  
222f0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
22300 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
22310 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22320 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
22330 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20    pFrom->pIndex 
22340 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
22350 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22360 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63  }./*.** Detect c
22370 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
22380 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
22390 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  se an ORDER BY c
223a0 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61  lause with .** a
223b0 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  n alternative co
223c0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
223d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
223e0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
223f0 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
22400 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
22410 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a   .. COLLATE ....
22420 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  **.** These are 
22430 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73  rewritten as a s
22440 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  ubquery:.**.**  
22450 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
22460 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
22470 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
22480 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a  T ... FROM t2).*
22490 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e  *     ORDER BY .
224a0 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
224b0 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
224c0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  ormation is nece
224d0 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68  ssary because th
224e0 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  e multiSelectOrd
224f0 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a  erBy() routine.*
22500 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e  * above that gen
22510 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
22520 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  for a compound S
22530 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52  ELECT with an OR
22540 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
22550 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c   uses a merge al
22560 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71  gorithm that req
22570 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63  uires the same c
22580 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
22590 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  e on the.** resu
225a0 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e  lt columns as on
225b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
225c0 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65  ause.  See ticke
225d0 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  t.** http://www.
225e0 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
225f0 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a  nfo/6709574d2a.*
22600 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
22610 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
22620 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45   needed for EXCE
22630 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61  PT, INTERSECT, a
22640 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65  nd UNION..** The
22650 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
22660 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77  tor works fine w
22670 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  ith multiSelectO
22680 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68  rderBy() even wh
22690 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  en.** there are 
226a0 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e  COLLATE terms in
226b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
226c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
226d0 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
226e0 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c  ctToSubquery(Wal
226f0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
22700 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
22710 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  i;.  Select *pNe
22720 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  w;.  Select *pX;
22730 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
22740 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
22750 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63  t_item *a;.  Src
22760 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20  List *pNewSrc;. 
22770 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
22780 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a    Token dummy;..
22790 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
227a0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
227b0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
227c0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
227d0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
227e0 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70  inue;.  for(pX=p
227f0 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d  ; pX && (pX->op=
22800 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f  =TK_ALL || pX->o
22810 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70  p==TK_SELECT); p
22820 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a  X=pX->pPrior){}.
22830 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65    if( pX==0 ) re
22840 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
22850 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64  e;.  a = p->pOrd
22860 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  erBy->a;.  for(i
22870 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  =p->pOrderBy->nE
22880 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  xpr-1; i>=0; i--
22890 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e  ){.    if( a[i].
228a0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
228b0 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61  P_Collate ) brea
228c0 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30  k;.  }.  if( i<0
228d0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
228e0 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66  ntinue;..  /* If
228f0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
22900 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
22910 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
22920 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
22930 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
22940 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
22950 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
22960 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  db;.  pNew = sql
22970 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
22980 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
22990 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
229a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
229b0 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74  _Abort;.  memset
229c0 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65  (&dummy, 0, size
229d0 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e  of(dummy));.  pN
229e0 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ewSrc = sqlite3S
229f0 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
22a00 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c  Term(pParse,0,0,
22a10 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c  0,&dummy,pNew,0,
22a20 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72  0);.  if( pNewSr
22a30 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  c==0 ) return WR
22a40 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77  C_Abort;.  *pNew
22a50 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63   = *p;.  p->pSrc
22a60 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d   = pNewSrc;.  p-
22a70 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
22a80 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
22a90 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
22aa0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c  e3Expr(db, TK_AL
22ab0 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  L, 0));.  p->op 
22ac0 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
22ad0 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
22ae0 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
22af0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
22b00 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
22b10 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
22b20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
22b30 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
22b40 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a    p->pWith = 0;.
22b50 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
22b60 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
22b70 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
22b80 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
22b90 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  rted)==0 );.  p-
22ba0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
22bb0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73  Converted;.  ass
22bc0 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f  ert( pNew->pPrio
22bd0 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  r!=0 );.  pNew->
22be0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
22bf0 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  pNew;.  pNew->pL
22c00 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
22c10 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
22c20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
22c30 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  inue;.}..#ifndef
22c40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
22c50 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
22c60 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79  pWith (which may
22c70 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73   be NULL) points
22c80 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   to a linked lis
22c90 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20  t of nested .** 
22ca0 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66  WITH contexts, f
22cb0 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74  rom inner to out
22cc0 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74  ermost. If the t
22cd0 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  able identified 
22ce0 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  by .** FROM clau
22cf0 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d  se element pItem
22d00 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d   is really a com
22d10 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73  mon-table-expres
22d20 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74  sion (CTE) .** t
22d30 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
22d40 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20  nter to the CTE 
22d50 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74  definition for t
22d60 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72  hat table. Other
22d70 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e  wise.** return N
22d80 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
22d90 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
22da0 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20  s returned, set 
22db0 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f  *ppContext to po
22dc0 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a  int to the With.
22dd0 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74  ** object that t
22de0 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20  he returned CTE 
22df0 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73  belongs to..*/.s
22e00 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65  tatic struct Cte
22e10 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20   *searchWith(.  
22e20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e40 2f 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72  /* Current outer
22e50 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
22e60 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
22e70 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
22e80 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ,     /* FROM cl
22e90 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20  ause element to 
22ea0 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74  resolve */.  Wit
22eb0 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20  h **ppContext   
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ed0 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65  OUT: WITH clause
22ee0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65   return value be
22ef0 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20  longs to */.){. 
22f00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
22f10 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d  me;.  if( pItem-
22f20 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26  >zDatabase==0 &&
22f30 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d   (zName = pItem-
22f40 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
22f50 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66    With *p;.    f
22f60 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70  or(p=pWith; p; p
22f70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20  =p->pOuter){.   
22f80 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
22f90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
22fa0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
22fb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
22fc0 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61  ICmp(zName, p->a
22fd0 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
22fe0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f  .          *ppCo
22ff0 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  ntext = p;.     
23000 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e       return &p->
23010 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
23020 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23030 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
23040 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  ./* The code gen
23050 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73  erator maintains
23060 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69   a stack of acti
23070 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a  ve WITH clauses.
23080 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65  ** with the inne
23090 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  r-most WITH clau
230a0 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20  se being at the 
230b0 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
230c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
230d0 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20  tine pushes the 
230e0 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73  WITH clause pass
230f0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
23100 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74   argument.** ont
23110 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  o the top of the
23120 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d   stack. If argum
23130 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75  ent bFree is tru
23140 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
23150 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c  WITH clause will
23160 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64   never be popped
23170 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
23180 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
23190 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72  .** should be fr
231a0 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
231b0 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
231c0 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c   In other cases,
231d0 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d   when.** bFree==
231e0 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  0, the With obje
231f0 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  ct will be freed
23200 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
23210 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
23220 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20  ment with which 
23230 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  it is associated
23240 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23250 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20  3WithPush(Parse 
23260 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70  *pParse, With *p
23270 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b  With, u8 bFree){
23280 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65  .  assert( bFree
23290 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  ==0 || pParse->p
232a0 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28  With==0 );.  if(
232b0 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57   pWith ){.    pW
232c0 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50  ith->pOuter = pP
232d0 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
232e0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
232f0 20 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72   pWith;.    pPar
23300 73 65 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20  se->bFreeWith = 
23310 62 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  bFree;.  }.}../*
23320 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23330 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
23340 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
23350 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
23360 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
23370 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
23380 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
23390 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
233a0 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
233b0 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
233c0 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
233d0 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
233e0 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
233f0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
23400 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
23410 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
23420 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
23430 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
23440 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
23450 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
23460 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
23470 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
23480 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
23490 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
234a0 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
234b0 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
234c0 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
234d0 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
234e0 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
234f0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
23500 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
23510 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
23520 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
23530 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
23540 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
23550 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
23560 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
23570 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
23580 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
23590 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
235a0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
235b0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
235c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
235d0 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
235e0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
235f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23600 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
23610 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
23620 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
23630 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23640 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
23650 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23670 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
23680 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
23690 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
236a0 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
236b0 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
236c0 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
236d0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
236e0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
236f0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
23700 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
23710 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
23720 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
23730 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
23740 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
23750 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
23760 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
23770 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
23780 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
23790 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
237a0 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
237b0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
237c0 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
237d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
237e0 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
237f0 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
23800 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
23810 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
23820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23830 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
23840 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
23850 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
23860 3e 7a 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  >zErr is non-NUL
23870 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
23880 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
23890 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
238a0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
238b0 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
238c0 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
238d0 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
238e0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
238f0 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72  y. If pCte->zErr
23900 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
23910 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63  his is not a rec
23920 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
23930 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
23940 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20   case, proceed. 
23950 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65   */.    if( pCte
23960 2d 3e 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->zErr ){.      
23970 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23980 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45  pParse, pCte->zE
23990 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  rr, pCte->zName)
239a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
239b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
239c0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
239d0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
239e0 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61  ;.    pFrom->pTa
239f0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
23a00 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
23a10 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
23a20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
23a30 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23a40 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d  Abort;.    pTab-
23a50 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
23a60 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
23a70 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
23a80 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
23a90 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
23aa0 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e   -1;.    pTab->n
23ab0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
23ac0 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
23ad0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
23ae0 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62  576) );.    pTab
23af0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
23b00 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f  _Ephemeral | TF_
23b10 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a  NoVisibleRowid;.
23b20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
23b30 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
23b40 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  ctDup(db, pCte->
23b50 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
23b60 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
23b70 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
23b80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
23b90 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
23ba0 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
23bb0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
23bc0 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
23bd0 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
23be0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
23bf0 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
23c00 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
23c10 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
23c20 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
23c30 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
23c40 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
23c50 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
23c60 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
23c70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
23c80 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
23c90 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
23ca0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
23cb0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
23cc0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
23cd0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
23ce0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
23cf0 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
23d00 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
23d10 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
23d20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
23d30 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
23d40 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
23d50 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
23d60 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
23d70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
23d80 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 52        pItem->isR
23d90 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
23da0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
23db0 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
23dc0 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSel->selFlags |
23dd0 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a  = SF_Recursive;.
23de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23df0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
23e00 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69  Only one recursi
23e10 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ve reference is 
23e20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20  permitted. */ . 
23e30 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65     if( pTab->nRe
23e40 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  f>2 ){.      sql
23e50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20  ite3ErrorMsg(.  
23e60 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
23e70 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65  "multiple refere
23e80 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76  nces to recursiv
23e90 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43  e table: %s", pC
23ea0 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  te->zName.      
23eb0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23ec0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
23ed0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
23ee0 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c  pTab->nRef==1 ||
23ef0 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67   ((pSel->selFlag
23f00 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  s&SF_Recursive) 
23f10 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32  && pTab->nRef==2
23f20 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
23f30 7a 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72  zErr = "circular
23f40 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b   reference: %s";
23f50 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20  .    pSavedWith 
23f60 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
23f70 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
23f80 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
23f90 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
23fa0 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52  t(pWalker, bMayR
23fb0 65 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d  ecursive ? pSel-
23fc0 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b  >pPrior : pSel);
23fd0 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d  ..    for(pLeft=
23fe0 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72  pSel; pLeft->pPr
23ff0 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74  ior; pLeft=pLeft
24000 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70  ->pPrior);.    p
24010 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  EList = pLeft->p
24020 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  EList;.    if( p
24030 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20  Cte->pCols ){.  
24040 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
24050 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  & pEList->nExpr!
24060 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45  =pCte->pCols->nE
24070 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
24080 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
24090 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
240a0 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66   has %d values f
240b0 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a  or %d columns",.
240c0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65              pCte
240d0 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d  ->zName, pEList-
240e0 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43  >nExpr, pCte->pC
240f0 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ols->nExpr.     
24100 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50     );.        pP
24110 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
24120 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20  avedWith;.      
24130 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24140 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
24150 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43       pEList = pC
24160 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d  te->pCols;.    }
24170 0a 0a 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75  ..    selectColu
24180 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
24190 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
241a0 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
241b0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->aCol);.    i
241c0 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
241d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
241e0 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
241f0 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
24200 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72         pCte->zEr
24210 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  r = "multiple re
24220 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
24230 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  es: %s";.      }
24240 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
24250 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65 63 75  te->zErr = "recu
24260 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
24270 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25  in a subquery: %
24280 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s";.      }.    
24290 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
242a0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
242b0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  l);.    }.    pC
242c0 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a 20 20  te->zErr = 0;.  
242d0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
242e0 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
242f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
24300 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
24310 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24320 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49  OMIT_CTE./*.** I
24330 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73  f the SELECT pas
24340 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
24350 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  d argument has a
24360 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54  n associated WIT
24370 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f  H .** clause, po
24380 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74  p it from the st
24390 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61  ack stored as pa
243a0 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20  rt of the Parse 
243b0 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
243c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
243d0 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65  sed as the xSele
243e0 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61  ctCallback2() ca
243f0 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c  llback by.** sql
24400 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
24410 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20  () when walking 
24420 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f  a SELECT tree to
24430 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a   resolve table.*
24440 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65  * names and othe
24450 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  r FROM clause el
24460 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74  ements. .*/.stat
24470 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f  ic void selectPo
24480 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57  pWith(Walker *pW
24490 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
244a0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
244b0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
244c0 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70 57  arse;.  With *pW
244d0 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d  ith = findRightm
244e0 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20  ost(p)->pWith;. 
244f0 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b   if( pWith!=0 ){
24500 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24510 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74  rse->pWith==pWit
24520 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  h );.    pParse-
24530 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e  >pWith = pWith->
24540 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65  pOuter;.  }.}.#e
24550 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65  lse.#define sele
24560 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64  ctPopWith 0.#end
24570 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
24580 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
24590 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
245a0 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
245b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
245c0 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
245d0 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
245e0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
245f0 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
24600 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
24610 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
24620 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
24630 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
24640 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
24650 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
24660 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
24670 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
24680 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
24690 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
246a0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
246b0 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
246c0 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
246d0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
246e0 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
246f0 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
24700 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
24710 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
24720 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
24730 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
24740 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
24750 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
24760 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
24770 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
24780 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
24790 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
247a0 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
247b0 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
247c0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
247d0 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
247e0 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
247f0 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74  g up the persist
24800 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
24810 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
24820 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
24830 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
24840 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
24850 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d  clause to accomm
24860 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
24870 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
24880 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
24890 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
248a0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
248b0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
248c0 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
248d0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
248e0 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
248f0 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
24900 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
24910 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
24920 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
24930 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
24940 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
24950 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
24960 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
24970 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
24980 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
24990 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
249a0 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
249b0 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
249c0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
249d0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
249e0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
249f0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
24a00 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
24a10 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
24a20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
24a30 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
24a40 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
24a50 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
24a60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
24a70 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
24a80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
24a90 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52  .  Expr *pE, *pR
24aa0 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20  ight, *pExpr;.  
24ab0 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70  u16 selFlags = p
24ac0 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70  ->selFlags;..  p
24ad0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
24ae0 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28  _Expanded;.  if(
24af0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
24b00 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
24b10 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
24b20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
24b30 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46  Src==0) || (selF
24b40 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
24b50 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
24b60 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
24b70 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
24b80 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
24b90 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
24ba0 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 78    if( pWalker->x
24bb0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 3d  SelectCallback2=
24bc0 3d 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 29  =selectPopWith )
24bd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74  {.    sqlite3Wit
24be0 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 66 69  hPush(pParse, fi
24bf0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
24c00 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a  pWith, 0);.  }..
24c10 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
24c20 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
24c30 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
24c40 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
24c50 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
24c60 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
24c70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
24c80 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
24c90 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
24ca0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
24cb0 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
24cc0 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
24cd0 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
24ce0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
24cf0 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
24d00 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
24d10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
24d20 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
24d30 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
24d40 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
24d50 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
24d60 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
24d70 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
24d80 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
24d90 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
24da0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
24db0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
24dc0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
24dd0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
24de0 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
24df0 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69  pFrom->isRecursi
24e00 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e  ve==0 || pFrom->
24e10 70 54 61 62 20 29 3b 0a 20 20 20 20 69 66 28 20  pTab );.    if( 
24e20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69  pFrom->isRecursi
24e30 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ve ) continue;. 
24e40 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
24e50 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
24e60 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
24e70 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
24e80 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
24e90 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
24ea0 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
24eb0 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
24ec0 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 23  ssert( i==0 );.#
24ed0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24ee0 49 54 5f 43 54 45 0a 20 20 20 20 20 20 73 65 6c  IT_CTE.      sel
24ef0 65 63 74 50 6f 70 57 69 74 68 28 70 57 61 6c 6b  ectPopWith(pWalk
24f00 65 72 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20  er, p);.#endif. 
24f10 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
24f20 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66  Prune;.    }.#if
24f30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24f40 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74  _CTE.    if( wit
24f50 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c  hExpand(pWalker,
24f60 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
24f70 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
24f80 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
24f90 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  ) {} else.#endif
24fa0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
24fb0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
24fc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24fd0 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
24fe0 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
24ff0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
25000 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
25010 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
25020 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
25030 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
25040 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
25050 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
25060 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
25070 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
25080 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
25090 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72  r, pSel) ) retur
250a0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
250b0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
250c0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
250d0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
250e0 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
250f0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
25100 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
25110 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62  bort;.      pTab
25120 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
25130 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
25140 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
25150 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70  b, "sqlite_sq_%p
25160 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
25170 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
25180 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
25190 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
251a0 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63  r; }.      selec
251b0 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
251c0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
251d0 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  l->pEList, &pTab
251e0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
251f0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
25200 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
25210 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
25220 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
25230 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
25240 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
25250 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  );.      pTab->t
25260 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
25270 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
25280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25290 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
252a0 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
252b0 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
252c0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
252d0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
252e0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
252f0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
25300 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
25310 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
25320 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
25330 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
25340 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
25350 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
25360 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66  ab->nRef==0xffff
25370 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25380 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
25390 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65  se, "too many re
253a0 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73  ferences to \"%s
253b0 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a  \": max 65535",.
253c0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
253d0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
253e0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30   pFrom->pTab = 0
253f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
25400 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25410 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
25420 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66  nRef++;.#if !def
25430 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
25440 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
25450 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
25460 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
25470 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
25480 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75  elect || IsVirtu
25490 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
254a0 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20      /* We reach 
254b0 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65  here if the name
254c0 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61  d table is a rea
254d0 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  lly a view */.  
254e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
254f0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
25500 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
25510 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
25520 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  bort;.        as
25530 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
25540 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
25550 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
25560 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
25570 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70  tDup(db, pTab->p
25580 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
25590 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
255a0 74 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e  tSetName(pFrom->
255b0 70 53 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a  pSelect, pTab->z
255c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73  Name);.        s
255d0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
255e0 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d  (pWalker, pFrom-
255f0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
25600 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
25610 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  .    /* Locate t
25620 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62  he index named b
25630 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  y the INDEXED BY
25640 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e   clause, if any.
25650 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
25660 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
25670 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  up(pParse, pFrom
25680 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
25690 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
256a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
256b0 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
256c0 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
256d0 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
256e0 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
256f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
25700 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50  ailed || sqliteP
25710 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
25720 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
25730 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
25740 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65   }..  /* For eve
25750 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
25760 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
25770 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
25780 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
25790 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
257a0 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
257b0 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
257c0 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
257d0 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
257e0 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
257f0 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
25800 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
25810 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
25820 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20  with the TK_ALL 
25830 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
25840 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
25850 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
25860 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65  n list..  ** The
25870 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
25880 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
25890 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78  te the TK_ALL ex
258a0 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
258b0 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f  pand.  ** each o
258c0 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
258d0 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
258e0 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
258f0 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
25900 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
25910 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
25920 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
25930 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
25940 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
25950 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
25960 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
25970 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20  r; k++){.    pE 
25980 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
25990 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
259a0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
259b0 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
259c0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
259d0 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d   || pE->pRight!=
259e0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
259f0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
25a00 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30  || (pE->pLeft!=0
25a10 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
25a20 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20  p==TK_ID) );.   
25a30 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
25a40 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
25a50 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  t->op==TK_ALL ) 
25a60 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
25a70 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
25a80 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
25a90 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
25aa0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
25ab0 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
25ac0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
25ad0 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
25ae0 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
25af0 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
25b00 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
25b10 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
25b20 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
25b30 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
25b40 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
25b50 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
25b60 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
25b70 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
25b80 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
25b90 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
25ba0 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
25bb0 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
25bc0 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
25bd0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
25be0 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c00 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
25c10 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
25c20 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
25c30 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
25c40 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
25c50 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d  .      pE = a[k]
25c60 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52  .pExpr;.      pR
25c70 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68  ight = pE->pRigh
25c80 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
25c90 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
25ca0 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  || pRight!=0 );.
25cb0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
25cc0 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d  !=TK_ALL && (pE-
25cd0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
25ce0 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
25cf0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
25d00 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
25d10 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
25d20 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
25d30 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
25d40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
25d50 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
25d60 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
25d70 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
25d80 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
25d90 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
25da0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
25db0 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
25dc0 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
25dd0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
25de0 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
25df0 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61  Span = a[k].zSpa
25e00 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  n;.          a[k
25e10 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
25e20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61         a[k].zSpa
25e30 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  n = 0;.        }
25e40 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
25e50 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  xpr = 0;.      }
25e60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
25e70 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
25e80 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
25e90 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
25ea0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
25eb0 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
25ec0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
25ed0 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
25ee0 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
25ef0 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
25f00 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
25f10 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20  *zTName = 0;    
25f20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
25f30 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
25f40 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
25f50 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
25f60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
25f70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  E->pLeft!=0 );. 
25f80 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25f90 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
25fa0 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f  y(pE->pLeft, EP_
25fb0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
25fc0 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
25fd0 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  pE->pLeft->u.zTo
25fe0 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ken;.        }. 
25ff0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
26000 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
26010 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
26020 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
26030 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
26040 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
26050 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
26060 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
26070 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
26080 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
26090 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
260a0 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
260b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
260c0 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20   *zSchemaName = 
260d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
260e0 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
260f0 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
26100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
26110 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
26120 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
26130 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
26140 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
26150 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
26160 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30       if( pSub==0
26170 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c   || (pSub->selFl
26180 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
26190 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rom)==0 ){.     
261a0 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b         pSub = 0;
261b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
261c0 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74   zTName && sqlit
261d0 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
261e0 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29  , zTabName)!=0 )
261f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26200 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
26210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26220 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
26230 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
26240 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
26250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
26260 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62  SchemaName = iDb
26270 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44  >=0 ? db->aDb[iD
26280 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a  b].zName : "*";.
26290 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
262a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
262b0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
262c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
262d0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
262e0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
262f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
26300 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ar *zColname;  /
26310 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63  * The computed c
26320 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
26330 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
26340 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61  zToFree;   /* Ma
26350 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68  lloced string th
26360 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  at needs to be f
26370 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  reed */.        
26380 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61      Token sColna
26390 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64  me;  /* Computed
263a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20   column name as 
263b0 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20  a token */..    
263c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
263d0 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20  zName );.       
263e0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
263f0 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20  && pSub.        
26400 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d       && sqlite3M
26410 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75  atchSpanName(pSu
26420 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
26430 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65  zSpan, 0, zTName
26440 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  , 0)==0.        
26450 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26460 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
26470 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
26480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
26490 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
264a0 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28  ed as 'hidden' (
264b0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70  currently only p
264c0 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
264d0 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75      ** for virtu
264e0 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e  al tables), do n
264f0 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e  ot include it in
26500 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
26510 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
26520 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20  ult-set list..  
26530 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
26540 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48           if( IsH
26550 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
26560 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20  b->aCol[j]) ){. 
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
26580 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54  ert(IsVirtual(pT
26590 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab));.          
265a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
265b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
265c0 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
265d0 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
265e0 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
265f0 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
26600 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
26610 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  From->jointype &
26620 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a   JT_NATURAL)!=0.
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26640 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  && tableAndColum
26650 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c  nIndex(pTabList,
26660 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29   i, zName, 0, 0)
26670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
26680 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26690 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
266a0 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
266b0 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
266c0 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
266d0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
266e0 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
266f0 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20   the join */.   
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
26710 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
26720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26730 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26740 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f  IdListIndex(pFro
26750 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  m->pUsing, zName
26760 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
26770 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
26780 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
26790 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
267a0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
267c0 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
267d0 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
267e0 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
267f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
26800 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
26810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26820 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26830 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
26840 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
26850 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
26860 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
26870 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
26880 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b      zToFree = 0;
26890 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
268a0 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54   longNames || pT
268b0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29  abList->nSrc>1 )
268c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
268d0 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20  Expr *pLeft;.   
268e0 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
268f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
26900 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61  b, TK_ID, zTabNa
26910 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
26920 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
26930 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
26940 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
26950 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
26960 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
26970 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
26980 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
26990 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
269a0 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
269b0 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
269c0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
269d0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
269e0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
269f0 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  eft, pExpr, 0);.
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
26a20 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
26a40 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
26a50 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
26a60 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
26a70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
26a80 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
26a90 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
26aa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26ab0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
26ad0 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
26ae0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26af0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
26b00 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
26b10 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
26b20 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
26b30 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a        sColname.z
26b40 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
26b50 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
26b60 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  e.n = sqlite3Str
26b70 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b  len30(zColname);
26b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26b90 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
26ba0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ame(pParse, pNew
26bb0 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b  , &sColname, 0);
26bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26bd0 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c   pNew && (p->sel
26be0 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
26bf0 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20  dFrom)!=0 ){.   
26c00 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
26c10 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
26c20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70  *pX = &pNew->a[p
26c30 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  New->nExpr-1];. 
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
26c50 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20   pSub ){.       
26c60 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
26c70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
26c80 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
26c90 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
26ca0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
26cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
26cc0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
26ce0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
26cf0 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
26d00 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
26d10 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20  , "%s.%s.%s",.  
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
26d50 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  Name, zTabName, 
26d60 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
26d70 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
26d80 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
26d90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
26da0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26db0 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61     pX->bSpanIsTa
26dc0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  b = 1;.         
26dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26de0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
26df0 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, zToFree);.   
26e00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26e10 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
26e20 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
26e30 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
26e40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
26e50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
26e60 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
26e70 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
26e80 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
26e90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26ea0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
26eb0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
26ec0 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
26ed0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
26ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26ef0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
26f00 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
26f10 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
26f20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
26f30 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  New;.  }.#if SQL
26f40 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
26f50 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26   if( p->pEList &
26f60 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  & p->pEList->nEx
26f70 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
26f80 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
26f90 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
26fa0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
26fb0 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
26fc0 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
26fd0 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t");.  }.#endif.
26fe0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
26ff0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
27000 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
27010 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
27020 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
27030 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27040 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
27050 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
27060 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
27070 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
27080 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
27090 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
270a0 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
270b0 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
270c0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
270d0 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
270e0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
270f0 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
27100 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
27110 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
27120 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
27130 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
27140 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
27150 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  rser tree..*/.st
27160 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c  atic int exprWal
27170 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
27180 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
27190 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
271a0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
271b0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
271c0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
271d0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
271e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
271f0 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
27200 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
27210 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
27220 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
27230 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
27240 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
27250 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
27260 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
27270 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
27280 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
27290 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
272a0 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
272b0 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
272c0 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
272d0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
272e0 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
272f0 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
27300 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
27310 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
27320 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
27330 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
27340 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
27350 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
27360 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
27370 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
27380 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
27390 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
273a0 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
273b0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
273c0 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
273d0 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
273e0 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
273f0 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
27400 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
27410 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
27420 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
27430 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
27440 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
27450 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
27460 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
27470 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
27480 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
27490 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
274a0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
274b0 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  e;.  if( pParse-
274c0 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a  >hasCompound ){.
274d0 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
274e0 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43  lback = convertC
274f0 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
27500 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c  ubquery;.    sql
27510 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
27520 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
27530 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
27540 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
27550 61 6e 64 65 72 3b 0a 20 20 69 66 28 20 28 70 53  ander;.  if( (pS
27560 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
27570 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 29  & SF_MultiValue)
27580 3d 3d 30 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  ==0 ){.    w.xSe
27590 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
275a0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20  selectPopWith;. 
275b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b   }.  sqlite3Walk
275c0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
275d0 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
275e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
275f0 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
27600 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
27610 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
27620 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
27630 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
27640 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
27650 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
27660 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
27670 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
27680 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
27690 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
276a0 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
276b0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
276c0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
276d0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
276e0 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
276f0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
27700 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
27710 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
27720 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
27730 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
27740 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
27750 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
27760 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
27770 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
27780 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
27790 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
277a0 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
277b0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
277c0 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
277d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
277e0 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
277f0 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
27800 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
27810 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
27820 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20  TypeInfo(Walker 
27830 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
27840 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
27850 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Parse;.  int i;.
27860 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
27870 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
27880 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
27890 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  m;..  assert( p-
278a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
278b0 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28  esolved );.  if(
278c0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
278d0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d  SF_HasTypeInfo)=
278e0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  =0 ){.    p->sel
278f0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54  Flags |= SF_HasT
27900 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61  ypeInfo;.    pPa
27910 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
27920 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c  Parse;.    pTabL
27930 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
27940 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
27950 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
27960 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
27970 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
27980 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
27990 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
279a0 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
279b0 53 28 70 54 61 62 21 3d 30 29 20 26 26 20 28 70  S(pTab!=0) && (p
279c0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
279d0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
279e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
279f0 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
27a00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
27a10 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
27a20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
27a30 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
27a40 63 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ct;.        if( 
27a50 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
27a60 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
27a70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
27a80 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
27a90 20 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64         selectAdd
27aa0 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
27ab0 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
27ac0 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  Tab, pSel);.    
27ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27ae0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
27af0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
27b00 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
27b10 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
27b20 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
27b30 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
27b40 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
27b50 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
27b60 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
27b70 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
27b80 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
27b90 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
27ba0 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
27bb0 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
27bc0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
27bd0 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
27be0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
27bf0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
27c00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27c10 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
27c20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
27c30 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
27c40 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63  (w));.  w.xSelec
27c50 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
27c60 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
27c70 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
27c80 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
27c90 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
27ca0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
27cb0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
27cc0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
27cd0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
27ce0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
27cf0 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20  ets up a SELECT 
27d00 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
27d10 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a  ocessing.  The.*
27d20 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  * following is a
27d30 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a  ccomplished:.**.
27d40 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43  **     *  VDBE C
27d50 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
27d60 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  e assigned to al
27d70 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  l FROM-clause te
27d80 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45  rms..**     *  E
27d90 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
27da0 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
27db0 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d  ed for all FROM-
27dc0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
27dd0 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20  s..**     *  ON 
27de0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
27df0 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e  s are shifted in
27e00 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65  to WHERE stateme
27e10 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69  nts.**     *  Wi
27e20 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20  ldcards "*" and 
27e30 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73  "TABLE.*" in res
27e40 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70  ult sets are exp
27e50 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  anded..**     * 
27e60 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
27e70 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d  expression are m
27e80 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73  atched to tables
27e90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
27ea0 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73  tine acts recurs
27eb0 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62  ively on all sub
27ec0 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74  queries within t
27ed0 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
27ee0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
27ef0 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Prep(.  Parse *p
27f00 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
27f10 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
27f20 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
27f30 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
27f40 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
27f50 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
27f60 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
27f70 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
27f80 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
27f90 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20  t for container 
27fa0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
27fb0 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  *db;.  if( NEVER
27fc0 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
27fd0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
27fe0 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  db;.  if( db->ma
27ff0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
28000 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
28010 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
28020 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
28030 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
28040 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
28050 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
28060 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
28070 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
28080 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
28090 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
280a0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
280b0 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
280c0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
280d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
280e0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
280f0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
28100 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
28110 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
28120 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
28130 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
28140 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
28150 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
28160 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
28170 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
28180 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
28190 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
281a0 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
281b0 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
281c0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
281d0 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
281e0 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
281f0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
28200 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
28210 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
28220 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
28230 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
28240 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
28250 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
28260 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
28270 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
28280 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
28290 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
282a0 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
282b0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
282c0 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
282d0 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
282e0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
282f0 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
28300 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
28310 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
28320 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
28330 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
28340 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
28350 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
28360 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
28370 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
28380 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
28390 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
283a0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
283b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
283c0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
283d0 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
283e0 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
283f0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
28400 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
28410 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
28420 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
28430 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
28440 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
28450 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
28460 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
28470 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
28480 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
28490 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
284a0 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
284b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
284c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
284d0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
284e0 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
284f0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
28500 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
28510 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
28520 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
28530 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
28540 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
28550 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
28560 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
28570 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
28580 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
28590 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
285a0 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
285b0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
285c0 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
285d0 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
285e0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
285f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
28600 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
28610 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
28620 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
28630 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
28640 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
28650 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
28660 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
28670 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
28680 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
28690 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
286a0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
286b0 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
286c0 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ist, 0, 0);.    
286d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
286e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
286f0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
28700 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
28710 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
28720 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
28730 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
28740 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
28750 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
28760 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
28770 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
28780 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
28790 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
287a0 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
287b0 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
287c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
287d0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
287e0 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
287f0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
28800 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
28810 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
28820 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
28830 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
28840 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
28850 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
28860 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
28870 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
28880 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
28890 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
288a0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
288b0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
288c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
288d0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
288e0 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
288f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
28900 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
28910 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
28920 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
28930 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
28940 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
28950 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
28960 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
28970 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
28980 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
28990 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
289a0 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
289b0 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
289c0 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
289d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
289e0 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
289f0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
28a00 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
28a10 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
28a20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
28a30 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
28a40 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20  nt regHit = 0;. 
28a50 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74   int addrHitTest
28a60 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41   = 0;.  struct A
28a70 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
28a80 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
28a90 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
28aa0 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
28ab0 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
28ac0 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
28ad0 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
28ae0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
28af0 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
28b00 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
28b10 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
28b20 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
28b30 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
28b40 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
28b50 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
28b60 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
28b70 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
28b80 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
28b90 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
28ba0 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
28bb0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
28bc0 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47  egAgg = sqlite3G
28bd0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
28be0 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20  se, nArg);.     
28bf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28c00 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
28c10 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20   pList, regAgg, 
28c20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
28c30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28c40 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20     nArg = 0;.   
28c50 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20     regAgg = 0;. 
28c60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
28c70 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
28c80 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
28c90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
28ca0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
28cb0 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d   testcase( nArg=
28cc0 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20  =0 );  /* Error 
28cd0 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20  condition */.   
28ce0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72     testcase( nAr
28cf0 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f  g>1 );   /* Also
28d00 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
28d10 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
28d20 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
28d30 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
28d40 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
28d50 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
28d60 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
28d70 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
28d80 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
28d90 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
28da0 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
28db0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
28dc0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
28dd0 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
28de0 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
28df0 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
28e00 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
28e10 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
28e20 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
28e30 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
28e40 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
28e50 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
28e60 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
28e70 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
28e80 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
28e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28ea0 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
28eb0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
28ec0 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
28ed0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
28ee0 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30     if( regHit==0
28ef0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41   && pAggInfo->nA
28f00 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67  ccumulator ) reg
28f10 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Hit = ++pParse->
28f20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
28f30 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
28f40 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67   OP_CollSeq, reg
28f50 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Hit, 0, 0, (char
28f60 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
28f70 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LSEQ);.    }.   
28f80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28f90 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p4(v, OP_AggStep
28fa0 30 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  0, 0, regAgg, pF
28fb0 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
28fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
28fd0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
28fe0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
28ff0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
29000 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
29010 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
29020 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
29030 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
29040 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
29050 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
29060 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
29070 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
29080 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
29090 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
290a0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
290b0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
290c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
290d0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
290e0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
290f0 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
29100 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
29110 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
29120 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
29130 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
29140 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
29150 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
29160 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
29170 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
29180 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
29190 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
291a0 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
291b0 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
291c0 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
291d0 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
291e0 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
291f0 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
29200 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
29210 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
29220 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
29230 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
29240 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
29250 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
29260 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
29270 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
29280 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
29290 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
292a0 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
292b0 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
292c0 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
292d0 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
292e0 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
292f0 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
29300 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
29310 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
29320 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
29330 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
29340 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  gHit); VdbeCover
29350 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
29360 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
29370 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
29380 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
29390 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
293a0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
293b0 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
293c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
293d0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
293e0 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
293f0 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
29400 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
29410 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
29420 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
29430 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69  e);.  if( addrHi
29440 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c  tTest ){.    sql
29450 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
29460 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29  (v, addrHitTest)
29470 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
29480 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45  dd a single OP_E
29490 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
294a0 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74  on to the VDBE t
294b0 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70  o explain a simp
294c0 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71  le.** count(*) q
294d0 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f  uery ("SELECT co
294e0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62  unt(*) FROM pTab
294f0 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ")..*/.#ifndef S
29500 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
29510 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  IN.static void e
29520 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
29530 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
29540 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
29550 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
29560 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
29570 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
29580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
29590 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
295a0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
295b0 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
295c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
295d0 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
295e0 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a   scan, or NULL *
295f0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
29600 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
29610 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20  .    int bCover 
29620 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48  = (pIdx!=0 && (H
29630 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
29640 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
29650 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20  dex(pIdx)));.   
29660 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71   char *zEqp = sq
29670 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
29680 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54  rse->db, "SCAN T
29690 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20  ABLE %s%s%s",.  
296a0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
296b0 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  e,.        bCove
296c0 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45  r ? " USING COVE
296d0 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22  RING INDEX " : "
296e0 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  ",.        bCove
296f0 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  r ? pIdx->zName 
29700 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  : "".    );.    
29710 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29720 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  4(.        pPars
29730 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70  e->pVdbe, OP_Exp
29740 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
29750 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
29760 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  Eqp, P4_DYNAMIC.
29770 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
29780 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
29790 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
297a0 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
297b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
297c0 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e for the SELECT
297d0 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
297e0 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65   in the p argume
297f0 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nt.  .**.** The 
29800 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75  results are retu
29810 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  rned according t
29820 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  o the SelectDest
29830 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53   structure..** S
29840 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73  ee comments in s
29850 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66  qliteInt.h for f
29860 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
29870 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
29880 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
29890 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
298a0 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
298b0 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
298c0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
298d0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
298e0 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
298f0 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
29900 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
29910 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
29920 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
29930 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
29940 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
29950 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
29960 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
29970 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hat..*/.int sqli
29980 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
29990 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
299a0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
299b0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
299c0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
299d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
299e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
299f0 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
29a00 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
29a10 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t      /* What t
29a20 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
29a30 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
29a40 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
29a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
29a60 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
29a70 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
29a80 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
29a90 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
29aa0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
29ab0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
29ac0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
29ad0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
29ae0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
29af0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b10 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
29b20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
29b30 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
29b40 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b  ist *pEList = 0;
29b50 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
29b60 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
29b70 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
29b80 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
29b90 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
29ba0 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
29bb0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
29bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29bd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
29be0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
29bf0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
29c00 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
29c10 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
29c20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
29c30 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
29c40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29c50 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
29c60 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
29c70 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
29c80 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
29c90 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
29ca0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
29cb0 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73  .  DistinctCtx s
29cc0 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66  Distinct; /* Inf
29cd0 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
29ce0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
29cf0 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43  yword */.  SortC
29d00 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20  tx sSort;       
29d10 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77    /* Info on how
29d20 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44   to code the ORD
29d30 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
29d40 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
29d50 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
29d60 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
29d70 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
29d80 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
29d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29da0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
29db0 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
29dc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
29dd0 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
29de0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
29df0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e  nection */..#ifn
29e00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29e10 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52  EXPLAIN.  int iR
29e20 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d  estoreSelectId =
29e30 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
29e40 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53  Id;.  pParse->iS
29e50 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
29e60 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b  ->iNextSelectId+
29e70 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20  +;.#endif..  db 
29e80 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
29e90 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
29ea0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
29eb0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
29ec0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
29ed0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
29ee0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
29ef0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
29f00 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
29f10 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
29f20 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
29f30 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23  of(sAggInfo));.#
29f40 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
29f50 4e 41 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d  NABLED.  pParse-
29f60 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b  >nSelectIndent++
29f70 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  ;.  SELECTTRACE(
29f80 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65  1,pParse,p, ("be
29f90 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c  gin processing:\
29fa0 6e 22 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  n"));.  if( sqli
29fb0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
29fc0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71   0x100 ){.    sq
29fd0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
29fe0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
29ff0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
2a000 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2a010 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2a020 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st!=SRT_DistFifo
2a030 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2a040 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2a050 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2a060 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  T_Fifo );.  asse
2a070 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2a080 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2a090 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st!=SRT_DistQueu
2a0a0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
2a0b0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2a0c0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2a0d0 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66  RT_Queue );.  if
2a0e0 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
2a0f0 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2a100 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65   assert(pDest->e
2a110 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73  Dest==SRT_Exists
2a120 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2a130 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a  ==SRT_Union || .
2a140 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2a150 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63  ->eDest==SRT_Exc
2a160 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ept || pDest->eD
2a170 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
2a180 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
2a190 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a1a0 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74  _Queue  || pDest
2a1b0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2a1c0 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20  tFifo ||.       
2a1d0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2a1e0 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ==SRT_DistQueue 
2a1f0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2a200 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20  =SRT_Fifo);.    
2a210 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
2a220 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
2a230 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
2a240 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
2a250 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
2a260 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
2a270 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
2a280 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2a290 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
2a2a0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
2a2b0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
2a2c0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
2a2d0 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
2a2e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
2a2f0 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
2a300 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65  , p, 0);.  memse
2a310 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a  t(&sSort, 0, siz
2a320 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73  eof(sSort));.  s
2a330 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2a340 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
2a350 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2a360 63 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  c;.  if( pParse-
2a370 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
2a380 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2a390 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2a3a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2a3b0 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
2a3c0 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65    isAgg = (p->se
2a3d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2a3e0 65 67 61 74 65 29 21 3d 30 3b 0a 23 69 66 20 53  egate)!=0;.#if S
2a3f0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2a400 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
2a410 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2a420 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  100 ){.    SELEC
2a430 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2a440 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e  rse,p, ("after n
2a450 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c  ame resolution:\
2a460 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
2a470 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2a480 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2a490 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20 49 66 20 77  ndif...  /* If w
2a4a0 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
2a4b0 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
2a4c0 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
2a4d0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
2a4e0 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
2a4f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2a500 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2a510 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
2a520 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
2a530 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
2a540 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  st, p->pEList->n
2a550 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74  Expr) ){.    got
2a560 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2a570 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54  }.#endif..  /* T
2a580 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ry to flatten su
2a590 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  bqueries in the 
2a5a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69  FROM clause up i
2a5b0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65  nto the main que
2a5c0 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  ry.  */.#if !def
2a5d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2a5e0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
2a5f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2a600 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
2a610 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
2a620 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
2a630 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2a640 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a650 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2a660 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2a670 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2a680 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2a690 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
2a6a0 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
2a6b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2a6c0 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75   isAggSub = (pSu
2a6d0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2a6e0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
2a6f0 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
2a700 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
2a710 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41  p, i, isAgg, isA
2a720 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  ggSub) ){.      
2a730 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79  /* This subquery
2a740 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
2a750 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
2a760 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  . */.      if( i
2a770 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20  sAggSub ){.     
2a780 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
2a790 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
2a7a0 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
2a7b0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
2a7c0 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   i = -1;.    }. 
2a7d0 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
2a7e0 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64  >pSrc;.    if( d
2a7f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a800 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2a810 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f  d;.    if( !Igno
2a820 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
2a830 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f  st) ){.      sSo
2a840 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
2a850 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
2a860 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2a870 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20  * Get a pointer 
2a880 74 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  the VDBE under c
2a890 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c 6c  onstruction, all
2a8a0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 56 44  ocating a new VD
2a8b0 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 64  BE if one.  ** d
2a8c0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
2a8d0 65 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20 73  exist */.  v = s
2a8e0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2a8f0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
2a900 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
2a910 65 6e 64 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  end;..#ifndef SQ
2a920 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
2a930 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48  ND_SELECT.  /* H
2a940 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53  andle compound S
2a950 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
2a960 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61 72   using the separ
2a970 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  ate multiSelect(
2a980 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65  ).  ** procedure
2a990 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
2a9a0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63  pPrior ){.    rc
2a9b0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70   = multiSelect(p
2a9c0 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
2a9d0 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74  ;.    explainSet
2a9e0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
2a9f0 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
2aa00 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 23 69  oreSelectId);.#i
2aa10 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2aa20 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54  ABLED.    SELECT
2aa30 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
2aa40 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d  ,("end compound-
2aa50 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
2aa60 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50 61 72  g\n"));.    pPar
2aa70 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
2aa80 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t--;.#endif.    
2aa90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
2aaa0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
2aab0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
2aac0 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
2aad0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2aae0 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
2aaf0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
2ab00 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
2ab10 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2ab20 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
2ab30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
2ab40 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2ab50 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ab60 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2ab70 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2ab80 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
2ab90 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
2aba0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
2abb0 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  ct;.    if( pSub
2abc0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2abd0 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65  .    /* Sometime
2abe0 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
2abf0 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62   subquery will b
2ac00 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65  e generated more
2ac10 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63   than.    ** onc
2ac20 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65  e, if the subque
2ac30 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ry is part of th
2ac40 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
2ac50 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20  n a LEFT JOIN,. 
2ac60 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c     ** for exampl
2ac70 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
2ac80 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72  , do not regener
2ac90 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2aca0 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20  manifest.    ** 
2acb0 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f  a view or the co
2acc0 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c  -routine to impl
2acd0 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54  ement a view.  T
2ace0 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
2acf0 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66  e.    ** is suff
2ad00 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74  icient, though t
2ad10 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
2ad20 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69   manifest the vi
2ad30 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20  ew does need.   
2ad40 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65   ** to be invoke
2ad50 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  d again. */.    
2ad60 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  if( pItem->addrF
2ad70 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20  illSub ){.      
2ad80 69 66 28 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f  if( pItem->viaCo
2ad90 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20  routine==0 ){.  
2ada0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2adb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2adc0 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  sub, pItem->regR
2add0 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64  eturn, pItem->ad
2ade0 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
2adf0 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
2ae00 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
2ae10 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
2ae20 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
2ae30 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
2ae40 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
2ae50 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
2ae60 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69  ferred to by thi
2ae70 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
2ae80 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
2ae90 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
2aea0 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
2aeb0 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
2aec0 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
2aed0 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
2aee0 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
2aef0 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
2af00 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
2af10 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
2af20 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
2af30 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
2af40 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
2af50 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
2af60 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
2af70 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
2af80 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
2af90 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
2afa0 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63  ;..    /* Make c
2afb0 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e  opies of constan
2afc0 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74  t WHERE-clause t
2afd0 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65  erms in the oute
2afe0 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20  r query down.   
2aff0 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73   ** inside the s
2b000 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63  ubquery.  This c
2b010 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71  an help the subq
2b020 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65  uery to run more
2b030 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20   efficiently..  
2b040 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49    */.    if( (pI
2b050 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
2b060 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20 20  JT_OUTER)==0.   
2b070 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65    && pushDownWhe
2b080 72 65 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62  reTerms(db, pSub
2b090 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  , p->pWhere, pIt
2b0a0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20  em->iCursor).   
2b0b0 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   ){.#if SELECTTR
2b0c0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2b0d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2b0e0 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2b0f0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45   ){.        SELE
2b100 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
2b110 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57  arse,p,("After W
2b120 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68  HERE-clause push
2b130 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  -down:\n"));.   
2b140 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
2b150 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2b160 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
2b170 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
2b180 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2b190 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2b1a0 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2f   subquery.    */
2b1b0 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
2b1c0 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
2b1d0 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
2b1e0 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 0a 20 20 20  & SF_All)==0.   
2b1f0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
2b200 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
2b210 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e  ITE_SubqCoroutin
2b220 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
2b230 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63  /* Implement a c
2b240 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  o-routine that w
2b250 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e  ill return a sin
2b260 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
2b270 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
2b280 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63  et on each invoc
2b290 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ation..      */.
2b2a0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2b2b0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
2b2c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b  urrentAddr(v)+1;
2b2d0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2b2e0 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
2b2f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2b300 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b310 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
2b320 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
2b330 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72  gReturn, 0, addr
2b340 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Top);.      Vdbe
2b350 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
2b360 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2b370 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49  Name));.      pI
2b380 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2b390 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20   = addrTop;.    
2b3a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2b3b0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2b3c0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  RT_Coroutine, pI
2b3d0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2b3e0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
2b3f0 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2b400 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
2b410 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2b420 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ctId);.      sql
2b430 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
2b440 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
2b450 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
2b460 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
2b470 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
2b480 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  Sub->nSelectRow)
2b490 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76  ;.      pItem->v
2b4a0 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
2b4b0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2b4c0 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69  gResult = dest.i
2b4d0 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sdst;.      sqli
2b4e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2b4f0 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65   OP_EndCoroutine
2b500 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2b510 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rn);.      sqlit
2b520 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2b530 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20  , addrTop-1);.  
2b540 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
2b550 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
2b560 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
2b570 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2b580 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2b590 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61  that will fill a
2b5a0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
2b5b0 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  e with.      ** 
2b5c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2b5d0 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70  his subquery.  p
2b5e0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2b5f0 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20  b will point.   
2b600 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64     ** to the add
2b610 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ress of the gene
2b620 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  rated subroutine
2b630 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  .  pItem->regRet
2b640 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  urn.      ** is 
2b650 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  a register alloc
2b660 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
2b670 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
2b680 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20  rn address.     
2b690 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
2b6a0 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74  pAddr;.      int
2b6b0 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20   onceAddr = 0;. 
2b6c0 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72       int retAddr
2b6d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2b6e0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2b6f0 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ub==0 );.      p
2b700 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
2b710 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2b720 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20  ;.      topAddr 
2b730 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2b740 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2b750 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67  r, 0, pItem->reg
2b760 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70  Return);.      p
2b770 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2b780 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20  b = topAddr+1;. 
2b790 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2b7a0 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
2b7b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2b7c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
2b7d0 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
2b7e0 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
2b7f0 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
2b800 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
2b810 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
2b820 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
2b830 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2b840 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
2b850 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
2b860 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
2b870 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
2b880 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
2b890 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2b8a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2b8b0 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
2b8c0 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
2b8d0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2b8e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b8f0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
2b900 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
2b910 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
2b920 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2b930 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2b940 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2b950 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
2b960 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
2b970 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2b980 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
2b990 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
2b9a0 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
2b9b0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
2b9c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b9d0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2b9e0 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
2b9f0 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
2ba00 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c  nRowLogEst = sql
2ba10 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d  ite3LogEst(pSub-
2ba20 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
2ba30 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72      if( onceAddr
2ba40 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
2ba50 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64  mpHere(v, onceAd
2ba60 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64  dr);.      retAd
2ba70 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2ba80 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2ba90 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  urn, pItem->regR
2baa0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
2bab0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
2bac0 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
2bad0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2bae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2baf0 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64  hangeP1(v, topAd
2bb00 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20  dr, retAddr);.  
2bb10 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
2bb20 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
2bb30 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rse);.    }.    
2bb40 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2bb50 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2bb60 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72  ct_end;.    pPar
2bb70 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73  se->nHeight -= s
2bb80 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2bb90 48 65 69 67 68 74 28 70 29 3b 0a 20 20 7d 0a 23  Height(p);.  }.#
2bba0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56 61 72 69  endif..  /* Vari
2bbb0 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ous elements of 
2bbc0 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65  the SELECT copie
2bbd0 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72  d into local var
2bbe0 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20  iables for.  ** 
2bbf0 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20  convenience */. 
2bc00 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
2bc10 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  ist;.  pWhere = 
2bc20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
2bc30 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
2bc40 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
2bc50 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
2bc60 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2bc70 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
2bc80 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
2bc90 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
2bca0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
2bcb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2bcc0 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
2bcd0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2bce0 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
2bcf0 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  After all FROM-c
2bd00 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c  lause analysis:\
2bd10 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
2bd20 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2bd30 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2bd40 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
2bd50 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49  e query is DISTI
2bd60 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  NCT with an ORDE
2bd70 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20  R BY but is not 
2bd80 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e  an aggregate, an
2bd90 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73  d .  ** if the s
2bda0 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68  elect-list is th
2bdb0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52  e same as the OR
2bdc0 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65  DER BY list, the
2bdd0 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  n this query.  *
2bde0 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
2bdf0 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59  en as a GROUP BY
2be00 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
2be10 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  , this:.  **.  *
2be20 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  *     SELECT DIS
2be30 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  TINCT xyz FROM .
2be40 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  .. ORDER BY xyz.
2be50 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61    **.  ** is tra
2be60 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a  nsformed to:.  *
2be70 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
2be80 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47  T xyz FROM ... G
2be90 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45  ROUP BY xyz ORDE
2bea0 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
2beb0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
2bec0 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
2bed0 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
2bee0 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
2bef0 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
2bf00 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
2bf10 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
2bf20 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
2bf30 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
2bf40 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
2bf50 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
2bf60 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
2bf70 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
2bf80 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
2bf90 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
2bfa0 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
2bfb0 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
2bfc0 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
2bfd0 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
2bfe0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
2bff0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
2c000 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
2c010 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
2c020 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2c030 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f  Compare(sSort.pO
2c040 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20  rderBy, pEList, 
2c050 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  -1)==0.  ){.    
2c060 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
2c070 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20  SF_Distinct;.   
2c080 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
2c090 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
2c0a0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
2c0b0 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20   pEList, 0);.   
2c0c0 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20   /* Notice that 
2c0d0 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f  even thought SF_
2c0e0 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65  Distinct has bee
2c0f0 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70  n cleared from p
2c100 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20  ->selFlags,.    
2c110 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74  ** the sDistinct
2c120 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c  .isTnct is still
2c130 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73   set.  Hence, is
2c140 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20  Tnct represents 
2c150 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69  the.    ** origi
2c160 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74  nal setting of t
2c170 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66  he SF_Distinct f
2c180 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72  lag, not the cur
2c190 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rent setting */.
2c1a0 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73      assert( sDis
2c1b0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a  tinct.isTnct );.
2c1c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2c1d0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
2c1e0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
2c1f0 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
2c200 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
2c210 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
2c220 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
2c230 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
2c240 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
2c250 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
2c260 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
2c270 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
2c280 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
2c290 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
2c2a0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2c2b0 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
2c2c0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
2c2d0 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
2c2e0 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
2c2f0 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
2c300 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
2c310 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2c320 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
2c330 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
2c340 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
2c350 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
2c360 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
2c370 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
2c380 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
2c390 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2c3a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2c3b0 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
2c3c0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2c3d0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53  rList(pParse, sS
2c3e0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
2c3f0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
2c400 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
2c410 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
2c420 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
2c430 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
2c440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c450 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2c460 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
2c470 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
2c480 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
2c490 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
2c4a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
2c4b0 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
2c4c0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2c4d0 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
2c4e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
2c4f0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2c500 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
2c510 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
2c520 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
2c530 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2c540 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
2c550 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
2c560 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2c570 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
2c580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c590 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
2c5a0 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
2c5b0 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
2c5c0 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
2c5d0 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
2c5e0 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
2c5f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2c600 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53  abel(v);.  p->nS
2c610 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45  electRow = LARGE
2c620 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70  ST_INT64;.  comp
2c630 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
2c640 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
2c650 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
2c660 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e  mit==0 && sSort.
2c670 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
2c680 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2c690 64 62 65 47 65 74 4f 70 28 76 2c 20 73 53 6f 72  dbeGetOp(v, sSor
2c6a0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
2c6b0 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f  ->opcode = OP_So
2c6c0 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53  rterOpen;.    sS
2c6d0 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d  ort.sortFlags |=
2c6e0 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
2c6f0 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ter;.  }..  /* O
2c700 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  pen an ephemeral
2c710 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
2c720 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
2c730 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
2c740 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2c750 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2c760 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
2c770 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
2c780 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
2c790 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
2c7a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2c7b0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2c7c0 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7e0 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
2c7f0 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
2c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c810 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65         (char*)ke
2c820 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2c830 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
2c840 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20  ist,0,0),.      
2c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c860 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
2c870 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
2c880 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
2c890 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
2c8a0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
2c8b0 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
2c8c0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
2c8d0 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RED;.  }else{.  
2c8e0 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
2c8f0 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
2c900 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d  STINCT_NOOP;.  }
2c910 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  ..  if( !isAgg &
2c920 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
2c930 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65  .    /* No aggre
2c940 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
2c950 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  nd no GROUP BY c
2c960 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36  lause */.    u16
2c970 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73   wctrlFlags = (s
2c980 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2c990 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  ? WHERE_WANT_DIS
2c9a0 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20  TINCT : 0);..   
2c9b0 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
2c9c0 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a  tabase scan. */.
2c9d0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
2c9e0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
2c9f0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2ca00 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70   pWhere, sSort.p
2ca10 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca30 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73          p->pELis
2ca40 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30  t, wctrlFlags, 0
2ca50 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
2ca60 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
2ca70 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
2ca80 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2ca90 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2caa0 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  o) < p->nSelectR
2cab0 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ow ){.      p->n
2cac0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
2cad0 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
2cae0 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a  wCount(pWInfo);.
2caf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44      }.    if( sD
2cb00 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
2cb10 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
2cb20 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
2cb30 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69   ){.      sDisti
2cb40 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
2cb50 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
2cb60 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a  stinct(pWInfo);.
2cb70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53      }.    if( sS
2cb80 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
2cb90 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
2cba0 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  at = sqlite3Wher
2cbb0 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2cbc0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53  o);.      if( sS
2cbd0 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72  ort.nOBSat==sSor
2cbe0 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
2cbf0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f  r ){.        sSo
2cc00 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
2cc10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2cc20 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
2cc30 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
2cc40 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
2cc50 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
2cc60 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
2cc70 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
2cc80 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
2cc90 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
2cca0 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
2ccb0 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
2ccc0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
2ccd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72   */.    if( sSor
2cce0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
2ccf0 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64  =0 && sSort.pOrd
2cd00 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
2cd10 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2cd20 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
2cd30 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
2cd40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2cd50 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
2cd60 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a   inner loop. */.
2cd70 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
2cd80 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
2cd90 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72  EList, -1, &sSor
2cda0 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
2cdb0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
2cdc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cdd0 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
2cde0 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
2cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce00 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
2ce10 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
2ce20 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
2ce30 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
2ce40 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
2ce50 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2ce60 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
2ce70 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
2ce80 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
2ce90 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
2cea0 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
2ceb0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
2cec0 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
2ced0 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
2cee0 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
2cef0 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
2cf00 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
2cf10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
2cf20 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
2cf30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2cf40 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2cf50 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
2cf60 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
2cf70 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
2cf80 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
2cf90 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
2cfa0 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
2cfb0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
2cfc0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
2cfd0 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
2cfe0 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
2cff0 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
2d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d010 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
2d020 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
2d030 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
2d040 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d060 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
2d070 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
2d080 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
2d090 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
2d0a0 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
2d0b0 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
2d0c0 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
2d0d0 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
2d0e0 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
2d0f0 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
2d100 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
2d110 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
2d120 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
2d130 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
2d140 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
2d150 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
2d160 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
2d170 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
2d180 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
2d190 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
2d1a0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
2d1b0 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
2d1c0 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
2d1d0 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
2d1e0 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
2d1f0 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
2d200 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
2d210 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
2d220 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
2d230 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
2d240 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
2d250 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
2d260 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
2d270 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
2d280 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
2d290 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2d2c0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
2d2d0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2d2e0 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
2d2f0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
2d300 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
2d310 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
2d320 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
2d330 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
2d340 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
2d350 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
2d360 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
2d370 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
2d380 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
2d390 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
2d3a0 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
2d3b0 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
2d3c0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2d3d0 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
2d3e0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
2d3f0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
2d400 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20 70  electRow>100 ) p
2d410 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31  ->nSelectRow = 1
2d420 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  00;.    }else{. 
2d430 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
2d440 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ow = 1;.    }.. 
2d450 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
2d460 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42  s both a GROUP B
2d470 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42  Y and an ORDER B
2d480 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
2d490 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65  y are.    ** ide
2d4a0 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20  ntical, then it 
2d4b0 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
2d4c0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f  to disable the O
2d4d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a  RDER BY clause .
2d4e0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72      ** on the gr
2d4f0 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47  ounds that the G
2d500 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75  ROUP BY will cau
2d510 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63  se elements to c
2d520 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20  ome out .    ** 
2d530 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
2d540 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61  rder. It also ma
2d550 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55  y not - the GROU
2d560 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61  P BY might use a
2d570 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2d580 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73   index that caus
2d590 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72  es rows to be gr
2d5a0 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61  ouped together a
2d5b0 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a  s required.    *
2d5c0 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  * but not actual
2d5d0 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65  ly sorted. Eithe
2d5e0 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68  r way, record th
2d5f0 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a  e fact that the.
2d600 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
2d610 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61  and GROUP BY cla
2d620 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d  uses are the sam
2d630 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  e by setting the
2d640 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20   orderByGrp.    
2d650 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
2d660 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2d670 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2d680 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e  pGroupBy, sSort.
2d690 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30  pOrderBy, -1)==0
2d6a0 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42   ){.      orderB
2d6b0 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  yGrp = 1;.    }.
2d6c0 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
2d6d0 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
2d6e0 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
2d6f0 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
2d700 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
2d710 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
2d720 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
2d730 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
2d740 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
2d750 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
2d760 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
2d770 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
2d780 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
2d790 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
2d7a0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
2d7b0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
2d7c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2d7d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
2d7e0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
2d7f0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
2d800 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
2d810 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
2d820 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
2d830 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
2d840 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
2d850 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67    sAggInfo.mnReg
2d860 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2d870 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  1;.    sAggInfo.
2d880 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
2d890 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
2d8a0 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  upBy->nExpr : 0;
2d8b0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
2d8c0 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2d8d0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  y;.    sqlite3Ex
2d8e0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2d8f0 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a  (&sNC, pEList);.
2d900 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2d910 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2d920 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  NC, sSort.pOrder
2d930 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
2d940 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
2d950 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2d960 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
2d970 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
2d980 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
2d990 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
2d9a0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
2d9b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
2d9c0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
2d9d0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
2d9e0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2d9f0 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
2da00 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
2da10 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2da20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c     sNC.ncFlags |
2da30 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a  = NC_InAggFunc;.
2da40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2da50 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2da60 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
2da70 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
2da80 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  .pList);.      s
2da90 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  NC.ncFlags &= ~N
2daa0 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
2dab0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
2dac0 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mxReg = pParse->
2dad0 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62  nMem;.    if( db
2dae0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2daf0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2db00 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
2db10 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
2db20 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
2db30 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
2db40 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
2db50 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
2db60 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
2db70 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
2db80 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
2db90 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
2dba0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2dbb0 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
2dbc0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
2dbd0 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
2dbe0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
2dbf0 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20   int j1;        
2dc00 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
2dc10 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
2dc20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2dc30 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
2dc40 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
2dc50 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
2dc60 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
2dc70 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
2dc80 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
2dc90 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
2dca0 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
2dcb0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
2dcc0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
2dcd0 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
2dce0 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
2dcf0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
2dd00 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
2dd10 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
2dd20 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
2dd30 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2dd40 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
2dd50 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
2dd60 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
2dd70 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
2dd80 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
2dd90 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
2dda0 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
2ddb0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
2ddc0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
2ddd0 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
2dde0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
2ddf0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
2de00 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
2de10 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
2de20 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
2de30 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
2de40 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
2de50 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
2de60 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
2de70 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
2de80 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
2de90 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
2dea0 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
2deb0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
2dec0 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
2ded0 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
2dee0 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
2def0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
2df00 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
2df10 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
2df20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
2df30 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
2df40 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2df50 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
2df60 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2df70 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
2df80 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66  upBy, 0, sAggInf
2df90 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  o.nColumn);.    
2dfa0 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
2dfb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2dfc0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
2dfd0 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  rOpen, .        
2dfe0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2dff0 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e  ngIdx, sAggInfo.
2e000 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
2e010 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63  .          0, (c
2e020 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2e030 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20  4_KEYINFO);..   
2e040 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
2e050 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2e060 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
2e070 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
2e080 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
2e090 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
2e0a0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2e0b0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
2e0c0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2e0d0 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
2e0e0 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
2e0f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2e100 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
2e110 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2e120 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
2e130 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
2e140 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2e150 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
2e160 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2e170 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
2e180 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
2e190 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
2e1a0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
2e1b0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2e1c0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
2e1d0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
2e1e0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2e1f0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2e200 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
2e210 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e220 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
2e230 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
2e240 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2e250 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
2e260 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2e270 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e280 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2e290 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
2e2a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2e2b0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
2e2c0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
2e2d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e2e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
2e2f0 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69  ull, 0, iAMem, i
2e300 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e  AMem+pGroupBy->n
2e310 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20  Expr-1);..      
2e320 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
2e330 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
2e340 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
2e350 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
2e360 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
2e370 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
2e380 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
2e390 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
2e3a0 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
2e3b0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
2e3c0 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
2e3d0 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
2e3e0 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
2e3f0 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
2e400 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
2e410 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
2e420 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
2e430 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2e440 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2e450 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
2e460 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
2e470 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
2e480 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2e490 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2e4a0 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
2e4b0 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  By, 0,.         
2e4c0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c   WHERE_GROUPBY |
2e4d0 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57   (orderByGrp ? W
2e4e0 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
2e4f0 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29   : 0), 0.      )
2e500 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
2e510 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
2e520 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
2e530 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
2e540 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
2e550 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ==pGroupBy->nExp
2e560 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
2e570 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
2e580 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
2e590 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
2e5a0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
2e5b0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
2e5c0 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
2e5d0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2e5e0 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
2e5f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
2e600 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
2e610 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
2e620 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
2e630 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
2e640 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
2e650 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
2e660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e670 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
2e680 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
2e690 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
2e6a0 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
2e6b0 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
2e6c0 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
2e6d0 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
2e6e0 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
2e6f0 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
2e700 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
2e710 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
2e720 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
2e730 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
2e740 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
2e750 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
2e760 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
2e770 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
2e780 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
2e790 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
2e7a0 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
2e7b0 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70  By;..        exp
2e7c0 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
2e7d0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
2e7e0 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73     (sDistinct.is
2e7f0 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  Tnct && (p->selF
2e800 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74  lags&SF_Distinct
2e810 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
2e820 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53              "DIS
2e830 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20  TINCT" : "GROUP 
2e840 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
2e850 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
2e860 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
2e870 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
2e880 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
2e890 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
2e8a0 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2e8b0 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
2e8c0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2e8d0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2e8e0 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
2e8f0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
2e900 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
2e910 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
2e920 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
2e930 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
2e940 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e950 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
2e960 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2e970 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
2e980 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e990 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2e9a0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
2e9b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
2e9c0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2e9d0 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
2e9e0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  e, 0);.        j
2e9f0 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
2ea00 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2ea10 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2ea20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2ea30 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2ea40 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
2ea50 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
2ea60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2ea70 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2ea80 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
2ea90 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
2eaa0 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
2eab0 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20        int r2;.. 
2eac0 20 20 20 20 20 20 20 20 20 20 20 72 32 20 3d 20             r2 = 
2ead0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
2eae0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
2eaf0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb10 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
2eb20 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
2eb30 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29  ->iTable, r1, 0)
2eb40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2eb50 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20  ( r1!=r2 ){.    
2eb60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2eb70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2eb80 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29  P_SCopy, r2, r1)
2eb90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2eba0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
2ebb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ebc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2ebd0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
2ebe0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2ebf0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
2ec00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2ec10 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
2ec20 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
2ec30 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
2ec40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ec50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2ec60 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49  terInsert, sAggI
2ec70 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2ec80 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
2ec90 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2eca0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
2ecb0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
2ecc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
2ecd0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
2ece0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
2ecf0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
2ed00 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2ed10 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
2ed20 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2ed30 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61  dxPTab = sortPTa
2ed40 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
2ed50 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74  ++;.        sort
2ed60 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Out = sqlite3Get
2ed70 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
2ed80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ed90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2eda0 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72  _OpenPseudo, sor
2edb0 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20  tPTab, sortOut, 
2edc0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2edd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2ede0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
2edf0 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
2ee00 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29  ingIdx, addrEnd)
2ee10 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2ee20 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50  mment((v, "GROUP
2ee30 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62   BY sort")); Vdb
2ee40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2ee50 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
2ee60 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
2ee70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ee80 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2ee90 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
2eea0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
2eeb0 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70  he index or temp
2eec0 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64  orary table used
2eed0 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59   by the GROUP BY
2eee0 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77   sort.      ** w
2eef0 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65  ill naturally de
2ef00 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68  liver rows in th
2ef10 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64  e order required
2ef20 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59   by the ORDER BY
2ef30 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
2ef40 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68  , cancel the eph
2ef50 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65  emeral table ope
2ef60 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e  n coded earlier.
2ef70 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2ef80 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
2ef90 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65  timization - the
2efa0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
2efb0 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65  should result re
2efc0 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20  gardless..      
2efd0 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54  ** Use the SQLIT
2efe0 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66  E_GroupByOrder f
2eff0 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f  lag with SQLITE_
2f000 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
2f010 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ER to .      ** 
2f020 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
2f030 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
2f040 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  sting purposes. 
2f050 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72   */.      if( or
2f060 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69  derByGrp && Opti
2f070 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2f080 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  db, SQLITE_Group
2f090 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20  ByOrder) .      
2f0a0 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74   && (groupBySort
2f0b0 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65   || sqlite3Where
2f0c0 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29  IsSorted(pWInfo)
2f0d0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2f0e0 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2f0f0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  y = 0;.        s
2f100 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2f110 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
2f120 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
2f130 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2f140 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  * Evaluate the c
2f150 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
2f160 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20  terms and store 
2f170 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e  in b0, b1, b2...
2f180 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73  .      ** (b0 is
2f190 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2f1a0 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20   iBMem+0, b1 is 
2f1b0 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20  iBMem+1, and so 
2f1c0 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20  forth).      ** 
2f1d0 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65  Then compare the
2f1e0 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
2f1f0 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20  Y terms against 
2f200 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
2f210 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ms.      ** from
2f220 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
2f230 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  w currently stor
2f240 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32  ed in a0, a1, a2
2f250 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
2f260 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70     addrTopOfLoop
2f270 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2f280 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2f290 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2f2a0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2f2b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  );.      if( gro
2f2c0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2f2d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f2e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
2f2f0 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f  erData, sAggInfo
2f300 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  .sortingIdx,.   
2f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f320 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20         sortOut, 
2f330 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20  sortPTab);.     
2f340 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
2f350 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
2f360 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
2f370 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2f380 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
2f390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f3a0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
2f3b0 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d  sortPTab, j, iBM
2f3c0 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
2f3d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2f3e0 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
2f3f0 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
2f400 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2f410 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
2f420 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
2f430 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
2f440 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2f450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f460 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
2f470 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
2f480 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
2f490 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2f4b0 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
2f4c0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
2f4d0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2f4e0 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
2f4f0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f500 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2f510 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f520 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c  P_Jump, j1+1, 0,
2f530 20 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65   j1+1); VdbeCove
2f540 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20  rage(v);..      
2f550 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2f560 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
2f570 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
2f580 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
2f590 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68  ** Changes in th
2f5a0 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
2f5b0 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
2f5c0 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
2f5d0 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
2f5e0 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
2f5f0 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
2f600 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
2f610 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2f620 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
2f630 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
2f640 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
2f650 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
2f660 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
2f670 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
2f680 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
2f690 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
2f6a0 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
2f6b0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2f6c0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
2f6d0 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
2f6e0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
2f6f0 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
2f700 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
2f710 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2f720 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
2f730 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70   iBMem, iAMem, p
2f740 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b  GroupBy->nExpr);
2f750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f760 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2f770 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
2f780 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
2f790 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
2f7a0 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
2f7b0 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
2f7c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f7d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
2f7e0 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
2f7f0 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  ddrEnd); VdbeCov
2f800 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2f810 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2f820 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61  "check abort fla
2f830 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2f840 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f850 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
2f860 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
2f870 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2f880 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63  nt((v, "reset ac
2f890 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
2f8a0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
2f8b0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2f8c0 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20  umulators based 
2f8d0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  on the content o
2f8e0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  f.      ** the c
2f8f0 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20  urrent row.     
2f900 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2f910 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2f920 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61   j1);.      upda
2f930 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
2f940 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2f950 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f960 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2f970 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
2f980 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2f990 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
2f9a0 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
2f9b0 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
2f9c0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2f9d0 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
2f9e0 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
2f9f0 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2fa00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2fa10 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2fa20 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rNext, sAggInfo.
2fa30 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
2fa40 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
2fa50 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2fa60 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
2fa70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fa80 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2fa90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2faa0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
2fab0 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e  op(v, addrSortin
2fac0 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  gIdx);.      }..
2fad0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2fae0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
2faf0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
2fb00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fb10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2fb20 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
2fb30 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
2fb40 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
2fb50 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
2fb60 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
2fb70 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f  .      /* Jump o
2fb80 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69  ver the subrouti
2fb90 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nes.      */.   
2fba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2fbb0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
2fbc0 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20   0, addrEnd);.. 
2fbd0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2fbe0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
2fbf0 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
2fc00 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
2fc10 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
2fc20 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
2fc30 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
2fc40 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
2fc50 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
2fc60 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
2fc70 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
2fc80 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
2fc90 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2fca0 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
2fcb0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
2fcc0 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
2fcd0 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
2fce0 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
2fcf0 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
2fd00 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
2fd10 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
2fd20 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
2fd30 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
2fd40 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
2fd50 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
2fd60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2fd70 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
2fd80 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2fd90 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2fda0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fdb0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2fdc0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
2fdd0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2fde0 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
2fdf0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2fe00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fe10 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2fe20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
2fe30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fe40 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2fe50 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
2fe60 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
2fe70 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
2fe80 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2fe90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2fea0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2feb0 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
2fec0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
2fed0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
2fee0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2fef0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2ff00 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
2ff10 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
2ff20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
2ff30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ff40 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2ff50 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
2ff60 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
2ff70 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
2ff80 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2ff90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2ffa0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2ffb0 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
2ffc0 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
2ffd0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
2ffe0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
2fff0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
30000 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53  >pEList, -1, &sS
30010 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ort,.           
30020 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73             &sDis
30030 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
30040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30050 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
30060 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
30070 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
30080 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30090 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
300a0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
300b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
300c0 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
300d0 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
300e0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
300f0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
30100 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
30110 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
30120 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
30130 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
30140 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
30150 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
30160 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
30170 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
30180 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
30190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
301a0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
301b0 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
301c0 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
301d0 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
301e0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
301f0 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
30200 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
30210 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  e {.      ExprLi
30220 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69  st *pDel = 0;.#i
30230 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30240 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
30250 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
30260 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20        if( (pTab 
30270 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  = isSimpleCount(
30280 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d  p, &sAggInfo))!=
30290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
302a0 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  If isSimpleCount
302b0 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  () returns a poi
302c0 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20  nter to a Table 
302d0 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a  structure, then.
302e0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
302f0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
30300 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20  of the form:.   
30310 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
30320 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
30330 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
30340 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30350 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20     ** where the 
30360 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
30370 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65  returned represe
30380 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e  nts table <tbl>.
30390 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
303a0 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74      ** This stat
303b0 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d  ement is so comm
303c0 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70  on that it is op
303d0 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c  timized speciall
303e0 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  y. The.        *
303f0 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72  * OP_Count instr
30400 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
30410 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65  ed either on the
30420 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68   intkey table th
30430 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
30440 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20  ntains the data 
30450 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20  for table <tbl> 
30460 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73  or on one of its
30470 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20   indexes. It.   
30480 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65       ** is bette
30490 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  r to execute the
304a0 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c   op on an index,
304b0 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20   as indexes are 
304c0 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a  almost.        *
304d0 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20  * always spread 
304e0 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65  across less page
304f0 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72  s than their cor
30500 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
30510 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
30520 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
30530 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
30540 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
30550 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
30560 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63  hema);.        c
30570 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20  onst int iCsr = 
30580 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
30590 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
305a0 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a   scan b-tree */.
305b0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
305c0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
305d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
305e0 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
305f0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79  e */.        Key
30600 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
30610 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
30620 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72    /* Keyinfo for
30630 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a   scanned index *
30640 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
30650 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
30660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30670 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75  * Best index fou
30680 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  nd so far */.   
30690 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d       int iRoot =
306a0 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20   pTab->tnum;    
306b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
306c0 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65  t page of scanne
306d0 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20  d b-tree */..   
306e0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
306f0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
30700 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
30710 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
30720 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
30730 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
30740 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
30750 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
30760 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74   for the index t
30770 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65  hat has the lowe
30780 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20  st scan cost..  
30790 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
307a0 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29   ** (2011-04-15)
307b0 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c   Do not do a ful
307c0 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f  l scan of an uno
307d0 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20  rdered index..  
307e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
307f0 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29   ** (2013-10-03)
30800 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68   Do not count th
30810 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70  e entries in a p
30820 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20  artial index..  
30830 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
30840 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
30850 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
30860 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
30870 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
30880 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
30890 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
308a0 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
308b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
308c0 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
308d0 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20  d(pTab) ) pBest 
308e0 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
308f0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
30900 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
30910 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
30920 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
30930 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
30940 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f    if( pIdx->bUno
30950 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
30960 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a       && pIdx->sz
30970 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
30980 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20  abRow.          
30990 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49   && pIdx->pPartI
309a0 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20  dxWhere==0.     
309b0 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74        && (!pBest
309c0 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   || pIdx->szIdxR
309d0 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52  ow<pBest->szIdxR
309e0 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ow).          ){
309f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65  .            pBe
30a00 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
30a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
30a20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65  .        if( pBe
30a30 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
30a40 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74  iRoot = pBest->t
30a50 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  num;.          p
30a60 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
30a70 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
30a80 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a  pParse, pBest);.
30a90 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
30aa0 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61     /* Open a rea
30ab0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65  d-only cursor, e
30ac0 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f  xecute the OP_Co
30ad0 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63  unt, close the c
30ae0 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ursor. */.      
30af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30b00 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
30b10 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f  nRead, iCsr, iRo
30b20 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20  ot, iDb, 1);.   
30b30 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
30b40 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
30b50 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
30b60 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
30b70 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
30b80 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
30b90 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
30ba0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30bb0 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20  OP_Count, iCsr, 
30bc0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
30bd0 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
30be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30bf0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
30c00 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65  iCsr);.        e
30c10 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
30c20 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  t(pParse, pTab, 
30c30 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  pBest);.      }e
30c40 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
30c50 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
30c60 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  OUNT */.      {.
30c70 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
30c80 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
30c90 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
30ca0 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
30cb0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30cc0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
30cd0 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  in(x) FROM .... 
30ce0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
30cf0 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e  CT max(x) FROM .
30d00 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ...        **.  
30d10 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69        ** If it i
30d20 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20  s, then ask the 
30d30 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
30d40 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f  to attempt to so
30d50 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  rt results.     
30d60 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72     ** as if ther
30d70 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20  e was an "ORDER 
30d80 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20  ON x" or "ORDER 
30d90 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73  ON x DESC" claus
30da0 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  e. .        ** I
30db0 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c  f where.c is abl
30dc0 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73  e to produce res
30dd0 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74  ults sorted in t
30de0 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  his order, then.
30df0 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76          ** add v
30e00 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61  dbe code to brea
30e10 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f  k out of the pro
30e20 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74  cessing loop aft
30e30 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  er the .        
30e40 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69  ** first iterati
30e50 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69  on (since the fi
30e60 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
30e70 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20   the loop is .  
30e80 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
30e90 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  eed to operate o
30ea0 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74  n the row with t
30eb0 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61  he minimum or ma
30ec0 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a  ximum .        *
30ed0 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68  * value of x, th
30ee0 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69  e only row requi
30ef0 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  red)..        **
30f00 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70  .        ** A sp
30f10 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20  ecial flag must 
30f20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  be passed to sql
30f30 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
30f40 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   to slightly.   
30f50 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62       ** modify b
30f60 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f  ehavior as follo
30f70 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ws:.        **. 
30f80 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66         **   + If
30f90 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
30fa0 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
30fb0 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
30fc0 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  oded by.        
30fd0 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
30fe0 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
30ff0 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
31000 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
31010 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  lue.        **  
31020 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
31030 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
31040 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65    + The optimize
31050 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  r code in where.
31060 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  c (the thing tha
31070 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a  t decides which.
31080 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
31090 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
310a0 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
310b0 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
310c0 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
310d0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
310e0 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
310f0 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
31100 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
31110 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
31120 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
31130 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
31140 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
31150 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
31160 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31170 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
31180 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  x = 0;.        u
31190 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f  8 flag = WHERE_O
311a0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
311b0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
311c0 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
311d0 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
311e0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
311f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
31200 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
31210 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
31220 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26   = minMaxQuery(&
31230 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d  sAggInfo, &pMinM
31240 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ax);.        }. 
31250 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
31260 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d  lag==0 || (pMinM
31270 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78  ax!=0 && pMinMax
31280 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a  ->nExpr==1) );..
31290 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
312a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   ){.          pM
312b0 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
312c0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
312d0 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20  MinMax, 0);.    
312e0 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
312f0 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20  nMax;.          
31300 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21  if( pMinMax && !
31310 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
31320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31330 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f  pMinMax->a[0].so
31340 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d  rtOrder = flag!=
31350 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
31360 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20  N ?1:0;.        
31370 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
31380 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b  ].pExpr->op = TK
31390 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
313a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
313b0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69   .        /* Thi
313c0 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
313d0 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
313e0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
313f0 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
31400 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
31410 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  is much simpler 
31420 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f  since there is o
31430 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
31440 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f  .        ** of o
31450 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a  utput..        *
31460 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41  /.        resetA
31470 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
31480 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
31490 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20         pWInfo = 
314a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
314b0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
314c0 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e  st, pWhere, pMin
314d0 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20  Max,0,flag,0);. 
314e0 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66         if( pWInf
314f0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
31500 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
31510 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
31520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
31530 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
31540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31550 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
31560 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
31570 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73  nfo);.        as
31580 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30  sert( pMinMax==0
31590 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   || pMinMax->nEx
315a0 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  pr==1 );.       
315b0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
315c0 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
315d0 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o)>0 ){.        
315e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
315f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
31600 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  0, sqlite3WhereB
31610 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
31620 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  ));.          Vd
31630 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
31640 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20  s() by index",. 
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
31660 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45  flag==WHERE_ORDE
31670 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d  RBY_MIN?"min":"m
31680 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ax")));.        
31690 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
316a0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
316b0 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  );.        final
316c0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
316d0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
316e0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  o);.      }..   
316f0 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
31700 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  y = 0;.      sql
31710 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
31720 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
31730 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45   addrEnd, SQLITE
31740 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
31750 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
31760 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
31770 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c  ->pEList, -1, 0,
31780 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
31790 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
317a0 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
317b0 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nd);.      sqlit
317c0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
317d0 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
317e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
317f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
31800 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a   addrEnd);.    .
31810 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67    } /* endif agg
31820 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
31830 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74  .  if( sDistinct
31840 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  .eTnctType==WHER
31850 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
31860 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c  ERED ){.    expl
31870 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
31880 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29  rse, "DISTINCT")
31890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
318a0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
318b0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
318c0 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
318d0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
318e0 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
318f0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
31900 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
31910 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72  .  if( sSort.pOr
31920 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70  derBy ){.    exp
31930 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
31940 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
31950 20 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74             sSort
31960 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47  .nOBSat>0 ? "RIG
31970 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52  HT PART OF ORDER
31980 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29   BY":"ORDER BY")
31990 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  ;.    generateSo
319a0 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
319b0 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74  , &sSort, pEList
319c0 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
319d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
319e0 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
319f0 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
31a00 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
31a10 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
31a20 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
31a30 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
31a40 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
31a50 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61   error in the Pa
31a60 72 73 65 20 73 74 72 75 63 74 75 72 65 2c 0a 20  rse structure,. 
31a70 20 2a 2a 20 73 65 74 20 74 68 65 20 72 65 74 75   ** set the retu
31a80 72 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74  rn code to 1. Ot
31a90 68 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20  herwise 0. */.  
31aa0 72 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45  rc = (pParse->nE
31ab0 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  rr>0);..  /* Con
31ac0 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
31ad0 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
31ae0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
31af0 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
31b00 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
31b10 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
31b20 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
31b30 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  nd:.  explainSet
31b40 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
31b50 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
31b60 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20  oreSelectId);.. 
31b70 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
31b80 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73  umn names if res
31b90 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ults of the SELE
31ba0 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74  CT are to be out
31bb0 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  put..  */.  if( 
31bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31bd0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31be0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
31bf0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
31c00 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
31c10 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
31c20 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62    }..  sqlite3Db
31c30 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
31c40 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
31c50 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
31c60 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69  gInfo.aFunc);.#i
31c70 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
31c80 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52  ABLED.  SELECTTR
31c90 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
31ca0 22 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c  "end processing\
31cb0 6e 22 29 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  n"));.  pParse->
31cc0 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
31cd0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
31ce0 20 72 63 3b 0a 7d 0a                              rc;.}.