/ Hex Artifact Content
Login

Artifact 33230303f5f32430ee971a6fcc6a370e4a93ae1a:


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 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  t->fg.jointype &
34c0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
34d0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
34e0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
34f0: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
3500: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
3510: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
3520: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
3530: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
3540: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
3550: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3560: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3570: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
3580: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
3590: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
35a0: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
35b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
35c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
35d0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
35e0: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
35f0: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
3600: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
3610: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
3620: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
3630: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3640: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
3650: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
3660: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
3670: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
3680: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
3690: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
36a0: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
36b0: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
36c0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
36d0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
36e0: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
36f0: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
3700: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
3710: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
3720: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
3730: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
3740: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
3750: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
3760: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
3770: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
3780: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3790: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
37a0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
37b0: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
37d0: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
37e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3800: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
3810: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
3820: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
3830: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
3840: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3850: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
3860: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
3870: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3880: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3890: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
38a0: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
38b0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
38c0: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
38d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
38e0: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
38f0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
3900: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
3910: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
3920: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
3930: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
3940: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3950: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
3960: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
3970: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
3980: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3990: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
39a0: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
39b0: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
39c0: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
39d0: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
39e0: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
39f0: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
3a00: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
3a10: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
3a20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
3a30: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
3a40: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
3a50: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
3a60: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
3a70: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
3a80: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3a90: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3aa0: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3ab0: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3ac0: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3ad0: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3ae0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3af0: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
3b00: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
3b10: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
3b20: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
3b30: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
3b40: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
3b50: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3b60: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3b70: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3b80: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3b90: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3ba0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3bb0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3bc0: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3bd0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3be0: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3bf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3c00: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
3c10: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
3c20: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
3c30: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
3c40: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3c50: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3c60: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3c70: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3c80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3c90: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3ca0: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3cb0: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3cc0: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3cd0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3ce0: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3cf0: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
3d00: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
3d10: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
3d20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
3d30: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
3d40: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
3d50: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3d60: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3d70: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3d80: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3d90: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3da0: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3db0: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3dc0: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3dd0: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3de0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3df0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3e00: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
3e10: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
3e20: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
3e30: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
3e40: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
3e50: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3e60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3e80: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3e90: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3ea0: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3eb0: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3ee0: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3ef0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3f00: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
3f10: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3f20: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
3f30: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
3f40: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
3f50: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3f60: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3f70: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
3f80: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
3f90: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
3fa0: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
3fb0: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
3fc0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
3fd0: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
3fe0: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
3ff0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
4000: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
4010: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
4020: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
4030: 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a  he end */.);../*
4040: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
4050: 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  e that will push
4060: 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 72   the record in r
4070: 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74 61  egisters regData
4080: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67 44  .** through regD
4090: 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f  ata+nData-1 onto
40a0: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
40b0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
40c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
40d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
40e0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
40f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74  ontext */.  Sort
4100: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
4110: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
4120: 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45  n about the ORDE
4130: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
4140: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
4150: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
4160: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
4170: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
4180: 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  egData,         
4190: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
41a0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
41b0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
41c0: 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44 61  .  int regOrigDa
41d0: 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72  ta,       /* Fir
41e0: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
41f0: 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65 20  ing data before 
4200: 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  packing */.  int
4210: 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20   nData,         
4220: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4230: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
4240: 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20   data array */. 
4250: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
4260: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4270: 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72  f reg prior to r
4280: 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65  egData available
4290: 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20   for use */.){. 
42a0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
42b0: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20    /* Stmt under 
42e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
42f0: 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70    int bSeq = ((p
4300: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
4310: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
4320: 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74  rter)==0);.  int
4330: 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e   nExpr = pSort->
4340: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4360: 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59   No. of ORDER BY
4370: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
4380: 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20  nBase = nExpr + 
4390: 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20  bSeq + nData;   
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
43b0: 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72  Fields in 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 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4400: 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72   Regs for sorter
4410: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
4420: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70   regRecord = ++p
4430: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4450: 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65   Assembled sorte
4460: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4470: 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74  t nOBSat = pSort
4480: 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  ->nOBSat;       
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
44a0: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
44b0: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e   to skip */.  in
44c0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64   /* Opcode to ad
44f0: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
4500: 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20  to sorter */..  
4510: 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20  assert( bSeq==0 
4520: 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20  || bSeq==1 );.  
4530: 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 31  assert( nData==1
4540: 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65 67   || regData==reg
4550: 4f 72 69 67 44 61 74 61 20 29 3b 0a 20 20 69 66  OrigData );.  if
4560: 28 20 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a  ( nPrefixReg ){.
4570: 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65      assert( nPre
4580: 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53  fixReg==nExpr+bS
4590: 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73  eq );.    regBas
45a0: 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45  e = regData - nE
45b0: 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65  xpr - bSeq;.  }e
45c0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65  lse{.    regBase
45d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
45e0: 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  + 1;.    pParse-
45f0: 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a  >nMem += nBase;.
4600: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
4610: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
4620: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4630: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20  derBy, regBase, 
4640: 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20  regOrigData,.   
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
4670: 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43  EL_DUP|SQLITE_EC
4680: 45 4c 5f 52 45 46 29 3b 0a 20 20 69 66 28 20 62  EL_REF);.  if( b
4690: 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Seq ){.    sqlit
46a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
46b0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f  OP_Sequence, pSo
46c0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  rt->iECursor, re
46d0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
46e0: 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  }.  if( nPrefixR
46f0: 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  eg==0 ){.    sql
4700: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
4710: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
4720: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
4730: 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20  bSeq, nData);.  
4740: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  }..  sqlite3Vdbe
4750: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
4760: 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
4770: 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e  +nOBSat, nBase-n
4780: 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f 72 64  OBSat, regRecord
4790: 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e  );.  if( nOBSat>
47a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  0 ){.    int reg
47b0: 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68  PrevKey;   /* Th
47c0: 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63  e first nOBSat c
47d0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72  olumns of the pr
47e0: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
47f0: 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b    int addrFirst;
4800: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4810: 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f  f the OP_IfNot o
4820: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74  pcode */.    int
4830: 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f   addrJmp;      /
4840: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
4850: 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20   OP_Jump opcode 
4860: 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  */.    VdbeOp *p
4870: 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f  Op;      /* Opco
4880: 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68  de that opens th
4890: 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20  e sorter */.    
48a0: 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20  int nKey;       
48b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
48c0: 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d  orting key colum
48d0: 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50  ns, including OP
48e0: 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20  _Sequence */.   
48f0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20   KeyInfo *pKI;  
4900: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b     /* Original K
4910: 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f  eyInfo on the so
4920: 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  rter table */.. 
4930: 20 20 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20     regPrevKey = 
4940: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
4950: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
4960: 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61   += pSort->nOBSa
4970: 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45  t;.    nKey = nE
4980: 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42  xpr - pSort->nOB
4990: 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20  Sat + bSeq;.    
49a0: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
49b0: 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73 71    addrFirst = sq
49c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
49d0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
49e0: 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20  Base+nExpr); .  
49f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
4a00: 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
4a10: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4a20: 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c  OP_SequenceTest,
4a30: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4a40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62  );.    }.    Vdb
4a50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4a70: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
4a80: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72  e, regPrevKey, r
4a90: 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e  egBase, pSort->n
4aa0: 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20  OBSat);.    pOp 
4ab0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
4ac0: 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64  Op(v, pSort->add
4ad0: 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
4ae0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
4af0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
4b00: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d  return;.    pOp-
4b10: 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61  >p2 = nKey + nDa
4b20: 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f  ta;.    pKI = pO
4b30: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
4b40: 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e      memset(pKI->
4b50: 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70  aSortOrder, 0, p
4b60: 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a 20  KI->nField); /* 
4b70: 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62 65  Makes OP_Jump be
4b80: 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a  low testable */.
4b90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4ba0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
4bb0: 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45  char*)pKI, P4_KE
4bc0: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73 74  YINFO);.    test
4bd0: 63 61 73 65 28 20 70 4b 49 2d 3e 6e 58 46 69 65  case( pKI->nXFie
4be0: 6c 64 3e 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d  ld>2 );.    pOp-
4bf0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  >p4.pKeyInfo = k
4c00: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
4c10: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
4c20: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53  ->pOrderBy, nOBS
4c30: 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  at,.            
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
4c60: 4b 49 2d 3e 6e 58 46 69 65 6c 64 2d 31 29 3b 0a  KI->nXField-1);.
4c70: 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71      addrJmp = sq
4c80: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
4c90: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
4ca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4cb0: 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a  , OP_Jump, addrJ
4cc0: 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70  mp+1, 0, addrJmp
4cd0: 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
4ce0: 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  e(v);.    pSort-
4cf0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71  >labelBkOut = sq
4d00: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
4d10: 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  el(v);.    pSort
4d20: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
4d30: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
4d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d50: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
4d60: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4d70: 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  n, pSort->labelB
4d80: 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  kOut);.    sqlit
4d90: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4da0: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
4db0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
4dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4dd0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
4de0: 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c  rFirst);.    sql
4df0: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
4e00: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
4e10: 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53  , regPrevKey, pS
4e20: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4e40: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70  pHere(v, addrJmp
4e50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
4e60: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
4e70: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
4e80: 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f  er ){.    op = O
4e90: 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a  P_SorterInsert;.
4ea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
4eb0: 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a  = OP_IdxInsert;.
4ec0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
4ed0: 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70  eAddOp2(v, op, p
4ee0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20  Sort->iECursor, 
4ef0: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
4f00: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  ( pSelect->iLimi
4f10: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  t ){.    int add
4f20: 72 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  r;.    int iLimi
4f30: 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  t;.    if( pSele
4f40: 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20  ct->iOffset ){. 
4f50: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
4f60: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31  elect->iOffset+1
4f70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4f80: 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c     iLimit = pSel
4f90: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ect->iLimit;.   
4fa0: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71   }.    addr = sq
4fb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4fc0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c  v, OP_IfNotZero,
4fd0: 20 69 4c 69 6d 69 74 2c 20 30 2c 20 2d 31 29 3b   iLimit, 0, -1);
4fe0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4ff0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5000: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
5010: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5020: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
5030: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5040: 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d  P_Delete, pSort-
5050: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5060: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5070: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
5080: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
5090: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
50a0: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
50b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
50c0: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
50d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
50e0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
50f0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
5100: 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20  t iOffset,      
5110: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5120: 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20 63  ing the offset c
5130: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5140: 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a  iContinue     /*
5150: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
5160: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
5170: 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ecord */.){.  if
5180: 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ( iOffset>0 ){. 
5190: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
51a0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
51b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
51c0: 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c 20  IfNeg, iOffset, 
51d0: 30 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65  0, -1); VdbeCove
51e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
51f0: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
5200: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
5210: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
5220: 22 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63  "skip OFFSET rec
5230: 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c  ords"));.    sql
5240: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
5250: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d  (v, addr);.  }.}
5260: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
5270: 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b   that will check
5280: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5290: 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74  e N registers st
52a0: 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a  arting at iMem.*
52b0: 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63  * form a distinc
52c0: 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69  t entry.  iTab i
52d0: 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  s a sorting inde
52e0: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65  x that holds pre
52f0: 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20  viously.** seen 
5300: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
5310: 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41  the N values.  A
5320: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61   new entry is ma
5330: 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66  de in iTab.** if
5340: 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76   the current N v
5350: 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a  alues are new..*
5360: 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61  *.** A jump to a
5370: 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64  ddrRepeat is mad
5380: 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61  e and the N+1 va
5390: 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20  lues are popped 
53a0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63  from the.** stac
53b0: 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65  k if the top N e
53c0: 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20  lements are not 
53d0: 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61  distinct..*/.sta
53e0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73  tic void codeDis
53f0: 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a  tinct(.  Parse *
5400: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
5410: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5420: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5430: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
5440: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
5450: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73  sorting index us
5460: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64  ed to test for d
5470: 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20  istinctness */. 
5480: 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c   int addrRepeat,
5490: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68      /* Jump to h
54a0: 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69  ere if not disti
54b0: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  nct */.  int N, 
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
54d0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
54e0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20  s */.  int iMem 
54f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
5500: 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b  st element */.){
5510: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
5520: 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61  t r1;..  v = pPa
5530: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31  rse->pVdbe;.  r1
5540: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5550: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5570: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
5580: 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65  , iTab, addrRepe
5590: 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64  at, iMem, N); Vd
55a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
55b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
55c0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
55d0: 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31  ord, iMem, N, r1
55e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
55f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
5600: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31  Insert, iTab, r1
5610: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
5620: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5630: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64  e, r1);.}..#ifnd
5640: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5650: 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
5660: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
5670: 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53  message when a S
5680: 45 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69  ELECT is used wi
5690: 74 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73  thin a subexpres
56a0: 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65  sion.** (example
56b0: 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54  :  "a IN (SELECT
56c0: 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29   * FROM table)")
56d0: 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65   but it has more
56e0: 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a   than 1 result.*
56f0: 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f  * column.  We do
5700: 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f   this in a subro
5710: 75 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68  utine because th
5720: 65 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20  e error used to 
5730: 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74  occur.** in mult
5740: 69 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54  iple places.  (T
5750: 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63  he error only oc
5760: 63 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63  curs in one plac
5770: 65 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a  e now, but we.**
5780: 20 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72   retain the subr
5790: 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69  outine to minimi
57a0: 7a 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69  ze code disrupti
57b0: 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  on.).*/.static i
57c0: 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  nt checkForMulti
57d0: 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
57e0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
57f0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
5800: 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20  se context. */. 
5810: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
5820: 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  st,   /* Destina
5830: 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72  tion of SELECT r
5840: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
5850: 6e 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  nExpr           
5860: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
5870: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74  sult columns ret
5880: 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
5890: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73  */.){.  int eDes
58a0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
58b0: 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20  ;.  if( nExpr>1 
58c0: 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  && (eDest==SRT_M
58d0: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
58e0: 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  _Set) ){.    sql
58f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5900: 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
5910: 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
5920: 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
5930: 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
5940: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
5950: 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72  ression");.    r
5960: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65  eturn 1;.  }else
5970: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5980: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
5990: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
59a0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
59b0: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
59c0: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
59d0: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
59e0: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
59f0: 63 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65  cTab is negative
5a00: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
5a10: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
5a20: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
5a30: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
5a40: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5a50: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
5a60: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
5a70: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
5a80: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
5a90: 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20  cTab and pEList 
5aa0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a  is used only .**
5ab0: 20 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63   to get number c
5ac0: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64  olumns and the d
5ad0: 61 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68  atatype for each
5ae0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
5af0: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
5b00: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
5b10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5b20: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
5b30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
5b40: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
5b50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
5b60: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
5b70: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
5b80: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
5b90: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
5ba0: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
5bb0: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
5bc0: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
5bd0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
5be0: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
5bf0: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
5c00: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
5c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
5c20: 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e  ot NULL, info on
5c30: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
5c40: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69  ORDER BY */.  Di
5c50: 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74  stinctCtx *pDist
5c60: 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20  inct, /* If not 
5c70: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
5c80: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53  w to process DIS
5c90: 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63  TINCT */.  Selec
5ca0: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
5cb0: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
5cc0: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
5cd0: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  lts */.  int iCo
5ce0: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
5cf0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5d00: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
5d10: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
5d20: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
5d30: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
5d40: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
5d50: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5d60: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
5d70: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
5d80: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5d90: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
5da0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5db0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
5dc0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
5dd0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75  */.  int regResu
5de0: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
5df0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
5e00: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ory holding resu
5e10: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  lt set */.  int 
5e20: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
5e30: 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74  Dest;   /* How t
5e40: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73  o dispose of res
5e50: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
5e60: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
5e70: 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61  Parm; /* First a
5e80: 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f  rgument to dispo
5e90: 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
5ea0: 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  int nResultCol; 
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5ec0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
5ed0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
5ee0: 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b   nPrefixReg = 0;
5ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5f00: 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
5f10: 73 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67  sters before reg
5f20: 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73  Result */..  ass
5f30: 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65  ert( v );.  asse
5f40: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
5f50: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
5f60: 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69   pDistinct ? pDi
5f70: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
5f80: 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e : WHERE_DISTIN
5f90: 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70  CT_NOOP;.  if( p
5fa0: 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70  Sort && pSort->p
5fb0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f  OrderBy==0 ) pSo
5fc0: 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  rt = 0;.  if( pS
5fd0: 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69  ort==0 && !hasDi
5fe0: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73  stinct ){.    as
5ff0: 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21  sert( iContinue!
6000: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  =0 );.    codeOf
6010: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
6020: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
6030: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
6040: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
6050: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65  umns..  */.  nRe
6060: 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74  sultCol = pEList
6070: 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20  ->nExpr;..  if( 
6080: 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
6090: 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  ){.    if( pSort
60a0: 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69   ){.      nPrefi
60b0: 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  xReg = pSort->pO
60c0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
60d0: 20 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74       if( !(pSort
60e0: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
60f0: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
6100: 29 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b  ) ) nPrefixReg++
6110: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6120: 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52  nMem += nPrefixR
6130: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  eg;.    }.    pD
6140: 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61  est->iSdst = pPa
6150: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
6160: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6170: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
6180: 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e  else if( pDest->
6190: 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c  iSdst+nResultCol
61a0: 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   > pParse->nMem 
61b0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
61c0: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  s an error condi
61d0: 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65  tion that can re
61e0: 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  sult, for exampl
61f0: 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  e, when a SELECT
6200: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72  .    ** on the r
6210: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
6220: 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74  f an INSERT cont
6230: 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74  ains more result
6240: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20   columns than.  
6250: 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63    ** there are c
6260: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
6270: 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e  ble on the left.
6280: 20 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c    The error will
6290: 20 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a   be caught.    *
62a0: 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  * and reported l
62b0: 61 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65  ater.  But we ne
62c0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
62d0: 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73  enough memory is
62e0: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a   allocated.    *
62f0: 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72  * to avoid other
6300: 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73   spurious errors
6310: 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65   in the meantime
6320: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d  . */.    pParse-
6330: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
6340: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74  Col;.  }.  pDest
6350: 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c  ->nSdst = nResul
6360: 74 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c  tCol;.  regResul
6370: 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  t = pDest->iSdst
6380: 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d  ;.  if( srcTab>=
6390: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
63a0: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
63b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
63c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
63d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
63e0: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
63f0: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
6400: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
6410: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
6420: 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
6430: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
6440: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20  SRT_Exists ){.  
6450: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
6460: 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58  ination is an EX
6470: 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73  ISTS(...) expres
6480: 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c  sion, the actual
6490: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72  .    ** values r
64a0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
64b0: 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65  ELECT are not re
64c0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
64d0: 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b     u8 ecelFlags;
64e0: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
64f0: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
6500: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
6510: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6520: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63  tine ){.      ec
6530: 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  elFlags = SQLITE
6540: 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d  _ECEL_DUP;.    }
6550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c  else{.      ecel
6560: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Flags = 0;.    }
6570: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6580: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
6590: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67  rse, pEList, reg
65a0: 52 65 73 75 6c 74 2c 20 30 2c 20 65 63 65 6c 46  Result, 0, ecelF
65b0: 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
65c0: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
65d0: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
65e0: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
65f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
6600: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
6610: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
6620: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
6630: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
6640: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
6650: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
6660: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
6670: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44  {.    switch( pD
6680: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
6690: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
66a0: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
66b0: 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
66c0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20     VdbeOp *pOp; 
66d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
66e0: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
66f0: 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
6700: 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nstr. */.       
6710: 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20   int iJump;     
6720: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
6730: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
6740: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50          int regP
6750: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
6760: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20  /* Previous row 
6770: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  content */..    
6780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
6790: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72  space for the pr
67a0: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
67b0: 20 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20        regPrev = 
67c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
67d0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
67e0: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
67f0: 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ol;..        /* 
6800: 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  Change the OP_Op
6810: 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65  enEphemeral code
6820: 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20  d earlier to an 
6830: 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20  OP_Null.        
6840: 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f  ** sets the MEM_
6850: 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74  Cleared bit on t
6860: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
6870: 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  r of the.       
6880: 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c   ** previous val
6890: 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  ue.  This will c
68a0: 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62  ause the OP_Ne b
68b0: 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20  elow to always. 
68c0: 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f         ** fail o
68d0: 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  n the first iter
68e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
68f0: 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  p even if the fi
6900: 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  rst.        ** r
6910: 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e  ow is all NULLs.
6920: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6940: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70  hangeToNoop(v, p
6950: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
6960: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ct);.        pOp
6970: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
6980: 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  tOp(v, pDistinct
6990: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
69a0: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
69b0: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
69c0: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b      pOp->p1 = 1;
69d0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
69e0: 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20   = regPrev;..   
69f0: 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c       iJump = sql
6a00: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
6a10: 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74  ddr(v) + nResult
6a20: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Col;.        for
6a30: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
6a40: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6a50: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6a60: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
6a70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
6a80: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
6a90: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
6aa0: 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d  f( i<nResultCol-
6ab0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
6ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6ad0: 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67  p3(v, OP_Ne, reg
6ae0: 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c  Result+i, iJump,
6af0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
6b00: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
6b10: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
6b20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6b40: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
6b50: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
6b60: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
6b70: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
6b80: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6b90: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d  v);.           }
6ba0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6bb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
6bc0: 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  , -1, (const cha
6bd0: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
6be0: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
6bf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6c00: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
6c10: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20  NULLEQ);.       
6c20: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
6c30: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t( sqlite3VdbeCu
6c40: 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a  rrentAddr(v)==iJ
6c50: 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ump || pParse->d
6c60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6c70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6c80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6c90: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75  OP_Copy, regResu
6ca0: 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65  lt, regPrev, nRe
6cb0: 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  sultCol-1);.    
6cc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6cd0: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
6ce0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
6cf0: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
6d00: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6d10: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
6d20: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
6d30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6d40: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
6d50: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6d60: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
6d70: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
6d80: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
6d90: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
6da0: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
6db0: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
6dc0: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
6dd0: 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43  ntinue, nResultC
6de0: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
6df0: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
6e00: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  lt);.        bre
6e10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6e20: 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d  }.    if( pSort=
6e30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
6e40: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
6e50: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
6e60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
6e70: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
6e80: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
6e90: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
6ea0: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
6eb0: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
6ec0: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
6ed0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
6ee0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
6ef0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
6f00: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
6f10: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
6f20: 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
6f30: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
6f40: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6f50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6f60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6f70: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
6f80: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
6f90: 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  l, r1);.      sq
6fa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6fb0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
6fc0: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
6fd0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
6fe0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6ff0: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
7000: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7010: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
7020: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
7030: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
7040: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
7050: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
7060: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
7070: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
7080: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
7090: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
70a0: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
70b0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
70c0: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
70d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
70e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
70f0: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
7100: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7110: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
7120: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
7130: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
7140: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
7150: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
7160: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
7170: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
7180: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
7190: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
71a0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
71b0: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
71c0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
71d0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
71e0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
71f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7200: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7210: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7220: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7230: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7240: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7250: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
7260: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
7270: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7280: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
7290: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
72a0: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
72b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
72c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
72d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
72e0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
72f0: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7300: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7310: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7320: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7330: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7340: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7350: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
7360: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
7370: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
7380: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
7390: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
73a0: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
73b0: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
73c0: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
73d0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
73e0: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
73f0: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7400: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7410: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7420: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7430: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7440: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7450: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7460: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7470: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7480: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7490: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
74a0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
74b0: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
74c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
74d0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
74e0: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
74f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7500: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7520: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
7530: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
7540: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61  , r1);.        a
7550: 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20  ssert( pSort==0 
7560: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
7570: 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  f.      if( pSor
7580: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
7590: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
75a0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31  se, pSort, p, r1
75b0: 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67 52  +nPrefixReg,regR
75c0: 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52  esult,1,nPrefixR
75d0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
75e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
75f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7600: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7620: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7630: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
7640: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7650: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7660: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
7670: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
7680: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7690: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
76a0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
76b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
76c0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
76d0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
76e0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
76f0: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
7700: 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52  se, r1, nPrefixR
7710: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65  eg+1);.      bre
7720: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
7730: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7740: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
7750: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
7760: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
7770: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
7780: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
7790: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
77a0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
77b0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
77c0: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
77d0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
77e0: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
77f0: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
7800: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
7810: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
7820: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
7830: 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20  esultCol==1 );. 
7840: 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
7850: 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  dst =.          
7860: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
7870: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
7880: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
7890: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  r, pDest->affSds
78a0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t);.      if( pS
78b0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ort ){.        /
78c0: 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63  * At first glanc
78d0: 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e  e you would thin
78e0: 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d  k we could optim
78f0: 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ize out the.    
7900: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
7910: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e  in this case sin
7920: 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  ce the order of 
7930: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73  entries in the s
7940: 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  et.        ** do
7950: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  es not matter.  
7960: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
7970: 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  be a LIMIT claus
7980: 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20  e, in which.    
7990: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20      ** case the 
79a0: 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65  order does matte
79b0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73  r */.        pus
79c0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
79d0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
79e0: 67 52 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75  gResult, regResu
79f0: 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  lt, 1, nPrefixRe
7a00: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
7a10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
7a20: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7a30: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7a40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7a50: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
7a60: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
7a70: 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d  lt,1,r1, &pDest-
7a80: 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20  >affSdst, 1);.  
7a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7aa0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
7ab0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
7ac0: 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20  Result, 1);.    
7ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7ae0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
7af0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
7b00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7b10: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7b20: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
7b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7b40: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7b50: 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
7b60: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
7b70: 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
7b80: 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
7b90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
7ba0: 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
7bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7bc0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7bd0: 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b  eger, 1, iParm);
7be0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
7bf0: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
7c00: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
7c10: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
7c20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7c30: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
7c40: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
7c50: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
7c60: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
7c70: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
7c80: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
7c90: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
7ca0: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
7cb0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
7cc0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
7cd0: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
7ce0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
7cf0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
7d00: 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a  ResultCol==1 );.
7d10: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
7d20: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
7d30: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7d40: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7d50: 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74  esult, regResult
7d60: 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29  , 1, nPrefixReg)
7d70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7d80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
7d90: 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20  egResult==iParm 
7da0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
7db0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
7dc0: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
7dd0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
7de0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
7df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7e00: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
7e10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
7e20: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73  UERY */..    cas
7e30: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
7e40: 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64         /* Send d
7e50: 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74  ata to a co-rout
7e60: 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ine */.    case 
7e70: 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20  SRT_Output: {   
7e80: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
7e90: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7ea0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7eb0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
7ec0: 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ne );.      test
7ed0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7ee0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
7ef0: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
7f00: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
7f10: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
7f20: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
7f30: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7f40: 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20  sultCol,.       
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7f70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
7f80: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
7f90: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
7fa0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
7fb0: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
7fc0: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
7fd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7ff0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
8000: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
8010: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
8020: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8030: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
8040: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
8050: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
8060: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
8070: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
8080: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8090: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
80a0: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
80b0: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
80c0: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
80d0: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
80e0: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
80f0: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
8100: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
8110: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
8120: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
8130: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
8140: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
8150: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
8160: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
8170: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
8180: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
8190: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
81a0: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
81b0: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
81c0: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
81d0: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
81e0: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
81f0: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
8200: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
8210: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
8220: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
8230: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
8240: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
8250: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
8260: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
8270: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
8280: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
8290: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
82a0: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
82b0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
82c0: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
82d0: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
82e0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
82f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8300: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
8310: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
8320: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
8330: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
8340: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
8350: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
8360: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
8370: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
8380: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
8390: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
83a0: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
83b0: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
83c0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
83d0: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
83e0: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
83f0: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
8400: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
8410: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
8420: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
8430: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
8440: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
8450: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
8460: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
8470: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
84a0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
84b0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
84c0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
84d0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
84e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
84f0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
8500: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8510: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
8520: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
8530: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
8540: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8550: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
8560: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
8570: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
8580: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8590: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
85a0: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
85b0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
85c0: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
85d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
85e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
85f0: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
8620: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
8630: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8650: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
8660: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8670: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8680: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
8690: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
86a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
86b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
86c0: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
86d0: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
86e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
86f0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
8700: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
8710: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
8720: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
8730: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
8740: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8750: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
8760: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
8770: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
8780: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
8790: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
87a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
87b0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
87c0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
87d0: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
87e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
87f0: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
8800: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
8810: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
8820: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
8830: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
8840: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
8850: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
8860: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
8870: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
8880: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
8890: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
88a0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
88b0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
88c0: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
88d0: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
88e0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
88f0: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
8900: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8910: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
8920: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
8930: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8940: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
8950: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
8960: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
8970: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
8980: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
8990: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
89a0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
89b0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
89c0: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
89d0: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
89e0: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
89f0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
8a00: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
8a10: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
8a20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8a30: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
8a40: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
8a50: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
8a60: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
8a70: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
8a80: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
8a90: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
8aa0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
8ab0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
8ac0: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
8ad0: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
8ae0: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
8af0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
8b00: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49  , int X){.  KeyI
8b10: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
8b20: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20  DbMallocZero(0, 
8b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8b40: 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e      sizeof(KeyIn
8b50: 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a  fo) + (N+X)*(siz
8b60: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
8b70: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
8b80: 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
8b90: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c  = (u8*)&p->aColl
8ba0: 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46  [N+X];.    p->nF
8bb0: 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20  ield = (u16)N;. 
8bc0: 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20     p->nXField = 
8bd0: 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65  (u16)X;.    p->e
8be0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
8bf0: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
8c00: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
8c10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
8c20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
8c30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
8c50: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
8c60: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
8c70: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
8c80: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
8c90: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
8ca0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
8cb0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
8cc0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
8cd0: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
8ce0: 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d  bFree(0, p);.  }
8cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
8d00: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20   new pointer to 
8d10: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
8d20: 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
8d30: 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b  ite3KeyInfoRef(K
8d40: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
8d50: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
8d60: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
8d70: 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20      p->nRef++;. 
8d80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
8d90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8da0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
8db0: 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79  rn TRUE if a Key
8dc0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20  Info object can 
8dd0: 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20  be change.  The 
8de0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
8df0: 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68  * can only be ch
8e00: 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73  anged if this is
8e10: 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72   just a single r
8e20: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
8e30: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
8e40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
8e50: 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f  ed only inside o
8e60: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
8e70: 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
8e80: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
8e90: 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20  iteable(KeyInfo 
8ea0: 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e  *p){ return p->n
8eb0: 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66  Ref==1; }.#endif
8ec0: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
8ed0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
8ee0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
8ef0: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
8f00: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8f10: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
8f20: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
8f30: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
8f40: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
8f50: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
8f60: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
8f70: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
8f80: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
8f90: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
8fa0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
8fb0: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
8fc0: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
8fd0: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
8fe0: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
8ff0: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
9000: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
9010: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
9020: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
9030: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
9040: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
9050: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
9060: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
9070: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
9080: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
9090: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
90a0: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
90b0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
90c0: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
90d0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
90e0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
90f0: 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  oc.  The calling
9100: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
9110: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
9120: 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73  seeing that this
9130: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
9140: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
9150: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
9160: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
9170: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
9180: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9190: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
91a0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
91b0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
91c0: 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e  * Form the KeyIn
91d0: 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74  fo object from t
91e0: 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a  his ExprList */.
91f0: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
9200: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
9210: 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e  with this column
9220: 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69   of pList */.  i
9230: 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20  nt nExtra       
9240: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
9250: 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d  many extra colum
9260: 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f  ns to the end */
9270: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  .){.  int nExpr;
9280: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
9290: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
92a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
92b0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
92c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
92d0: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
92e0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
92f0: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
9300: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
9310: 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c 20  , nExpr-iStart, 
9320: 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66 28  nExtra+1);.  if(
9330: 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73   pInfo ){.    as
9340: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
9350: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
9360: 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f  pInfo) );.    fo
9370: 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65  r(i=iStart, pIte
9380: 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72  m=pList->a+iStar
9390: 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  t; i<nExpr; i++,
93a0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
93b0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
93c0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
93d0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
93e0: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
93f0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
9400: 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
9410: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
9420: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
9430: 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20  aColl[i-iStart] 
9440: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
9450: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
9460: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
9470: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
9480: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9490: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pInfo;.}../*.*
94a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
94b0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
94c0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
94d0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
94e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
94f0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
9500: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
9510: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
9520: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
9530: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
9540: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
9550: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9560: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
9570: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
9580: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9590: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
95a0: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
95b0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
95c0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
95d0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
95e0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
95f0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
9600: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
9610: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
9620: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
9630: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
9640: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
9650: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
9660: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
9670: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
9680: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
9690: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
96a0: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
96b0: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
96c0: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
96d0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
96e0: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
96f0: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
9700: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
9710: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
9720: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
9730: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
9740: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
9750: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
9760: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
9770: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
9780: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
9790: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
97a0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
97b0: 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
97c0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
97d0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
97e0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
97f0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
9800: 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
9810: 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d  se->db, "USE TEM
9820: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22  P B-TREE FOR %s"
9830: 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73  , zUsage);.    s
9840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9850: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
9860: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
9870: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
9880: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
9890: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
98a0: 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20  expression b to 
98b0: 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f  lvalue a. A seco
98c0: 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69  nd, no-op, versi
98d0: 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  on of this macro
98e0: 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20  .** is provided 
98f0: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54  when SQLITE_OMIT
9900: 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69  _EXPLAIN is defi
9910: 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ned. This allows
9920: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20   the code.** in 
9930: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
9940: 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73  to assign values
9950: 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65   to structure me
9960: 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74  mber variables t
9970: 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73  hat.** only exis
9980: 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  t if SQLITE_OMIT
9990: 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20  _EXPLAIN is not 
99a0: 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20  defined without 
99b0: 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a  polluting the.**
99c0: 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64   code with #ifnd
99d0: 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a  ef directives..*
99e0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
99f0: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20  inSetInteger(a, 
9a00: 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a  b) a = b..#else.
9a10: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
9a20: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
9a30: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
9a40: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
9a50: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54   define explainT
9a60: 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20  empTable(y,z).# 
9a70: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
9a80: 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65  tInteger(y,z).#e
9a90: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
9aa0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
9ab0: 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69  XPLAIN) && !defi
9ac0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9ad0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29  COMPOUND_SELECT)
9ae0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
9af0: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
9b00: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
9b10: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
9b20: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
9b30: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
9b40: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
9b50: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
9b60: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
9b70: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
9b80: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
9b90: 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
9ba0: 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a  e two forms:.**.
9bb0: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
9bc0: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
9bd0: 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22   and iSub2 (op)"
9be0: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
9bf0: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
9c00: 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e  1 and iSub2 USIN
9c10: 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f  G TEMP B-TREE (o
9c20: 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  p)".**.** where 
9c30: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
9c40: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73  are the integers
9c50: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63   passed as the c
9c60: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
9c70: 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
9c80: 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74  ers, and op is t
9c90: 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e  he text represen
9ca0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  tation of the pa
9cb0: 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
9cc0: 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65  e same name. The
9cd0: 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20   parameter "op" 
9ce0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54  must be one of T
9cf0: 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
9d00: 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53  PT,.** TK_INTERS
9d10: 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54  ECT or TK_ALL. T
9d20: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73  he first form is
9d30: 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e   used if argumen
9d40: 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a  t bUseTmp is .**
9d50: 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73   false, or the s
9d60: 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74  econd form if it
9d70: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
9d80: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
9d90: 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72  Composite(.  Par
9da0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9dc0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
9dd0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
9e00: 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
9e10: 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   etc. */.  int i
9e20: 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20  Sub1,           
9e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
9e40: 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20  bquery id 1 */. 
9e50: 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20   int iSub2,     
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
9e80: 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54  2 */.  int bUseT
9e90: 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mp              
9ea0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
9eb0: 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77  f a temp table w
9ec0: 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20  as used */.){.  
9ed0: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55  assert( op==TK_U
9ee0: 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45  NION || op==TK_E
9ef0: 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
9f00: 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d  INTERSECT || op=
9f10: 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28  =TK_ALL );.  if(
9f20: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
9f30: 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==2 ){.    Vdbe 
9f40: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
9f50: 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  be;.    char *zM
9f60: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
9f70: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61  ntf(.        pPa
9f80: 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55  rse->db, "COMPOU
9f90: 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64  ND SUBQUERIES %d
9fa0: 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c   AND %d %s(%s)",
9fb0: 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20   iSub1, iSub2,. 
9fc0: 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22         bUseTmp?"
9fd0: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
9fe0: 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70  E ":"", selectOp
9ff0: 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a  Name(op).    );.
a000: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a010: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
a020: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
a030: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
a040: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
a050: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20  .  }.}.#else./* 
a060: 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f  No-op versions o
a070: 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58  f the explainXXX
a080: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  () functions and
a090: 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65   macros. */.# de
a0a0: 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70  fine explainComp
a0b0: 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29  osite(v,w,x,y,z)
a0c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
a0d0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
a0e0: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
a0f0: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
a100: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
a110: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
a120: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
a130: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
a140: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
a150: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
a160: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
a170: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
a180: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
a190: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
a1a0: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
a1b0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
a1c0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
a1d0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
a1e0: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
a1f0: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
a200: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
a210: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a220: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
a230: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
a240: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
a250: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
a260: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
a270: 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  on the ORDER BY 
a280: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
a290: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a  nColumn,      /*
a2a0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
a2b0: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
a2c0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
a2d0: 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73  t /* Write the s
a2e0: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
a2f0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  re */.){.  Vdbe 
a300: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a310: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
a320: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
a330: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a340: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  t */.  int addrB
a350: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
a360: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
a370: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
a380: 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f   to exit loop */
a390: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69  .  int addrConti
a3a0: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
a3b0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
a3c0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72  /* Jump here for
a3d0: 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
a3e0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74   int addr;.  int
a3f0: 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20   addrOnce = 0;. 
a400: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70   int iTab;.  Exp
a410: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
a420: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
a430: 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  y;.  int eDest =
a440: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
a450: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
a460: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69  st->iSDParm;.  i
a470: 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74  nt regRow;.  int
a480: 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74   regRowid;.  int
a490: 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f   nKey;.  int iSo
a4a0: 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  rtTab;          
a4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
a4c0: 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61  er cursor to rea
a4d0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
a4e0: 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20  nSortData;      
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a500: 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74  railing values t
a510: 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74  o read from sort
a520: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  er */.  int i;. 
a530: 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20   int bSeq;      
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74   /* True if sort
a560: 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64  er record includ
a570: 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23  es seq. no. */.#
a580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
a590: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
a5a0: 45 4e 54 53 0a 20 20 73 74 72 75 63 74 20 45 78  ENTS.  struct Ex
a5b0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75  prList_item *aOu
a5c0: 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  tEx = p->pEList-
a5d0: 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  >a;.#endif..  if
a5e0: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
a5f0: 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
a600: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a610: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
a620: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
a630: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
a640: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
a650: 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b  oto(v, addrBreak
a660: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a670: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
a680: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
a690: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62  Out);.  }.  iTab
a6a0: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
a6b0: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
a6c0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
a6d0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
a6e0: 69 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  ine ){.    regRo
a6f0: 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67  wid = 0;.    reg
a700: 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  Row = pDest->iSd
a710: 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74  st;.    nSortDat
a720: 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  a = nColumn;.  }
a730: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
a740: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
a750: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a760: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c      regRow = sql
a770: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a780: 50 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72  Parse);.    nSor
a790: 74 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  tData = 1;.  }. 
a7a0: 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79   nKey = pOrderBy
a7b0: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
a7c0: 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70  >nOBSat;.  if( p
a7d0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
a7e0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
a7f0: 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rter ){.    int 
a800: 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70  regSortOut = ++p
a810: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
a820: 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72   iSortTab = pPar
a830: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
a840: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
a850: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61  BkOut ){.      a
a860: 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65  ddrOnce = sqlite
a870: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
a880: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
a890: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
a8a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a8b0: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
a8c0: 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53  , iSortTab, regS
a8d0: 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e  ortOut, nKey+1+n
a8e0: 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69  SortData);.    i
a8f0: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
a900: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
a910: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
a920: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
a930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a940: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
a950: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
a960: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
a970: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
a980: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
a990: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
a9a0: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
a9b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a9c0: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
a9d0: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
a9e0: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
a9f0: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
aa00: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
aa10: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
aa20: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
aa30: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
aa40: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
aa50: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
aa60: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
aa70: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
aa80: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
aa90: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
aaa0: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
aab0: 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69  ; i<nSortData; i
aac0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
aad0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aae0: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
aaf0: 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20  b, nKey+bSeq+i, 
ab00: 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56  regRow+i);.    V
ab10: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ab20: 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  %s", aOutEx[i].z
ab30: 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d  Name ? aOutEx[i]
ab40: 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b  .zName : aOutEx[
ab50: 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a  i].zSpan));.  }.
ab60: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
ab70: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
ab80: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
ab90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
aba0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
abb0: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
abc0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
abd0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
abe0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
abf0: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
ac00: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
ac10: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
ac20: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
ac30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ac40: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
ac50: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
ac60: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
ac70: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
ac80: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
ac90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
aca0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
acb0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
acc0: 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  Row, 1, regRowid
acd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ace0: 20 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74            &pDest
acf0: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
ad00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ad10: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
ad20: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
ad30: 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ow, 1);.      sq
ad40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ad50: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
ad60: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
ad70: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ad80: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
ad90: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
ada0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
adb0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
adc0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
add0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
ade0: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
adf0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
ae00: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
ae10: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
ae20: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
ae30: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
ae40: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
ae50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
ae60: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
ae70: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
ae80: 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20  routine ); .    
ae90: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
aea0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
aeb0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
aec0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
aed0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69  utine );.      i
aee0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
aef0: 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
af00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
af10: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
af20: 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  w, pDest->iSdst,
af30: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
af40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
af50: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
af60: 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d  e(pParse, pDest-
af70: 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  >iSdst, nColumn)
af80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
af90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
afa0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
afb0: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
afc0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
afd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
afe0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52  }.  }.  if( regR
aff0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  owid ){.    sqli
b000: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b010: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
b020: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
b030: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
b040: 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  rse, regRowid);.
b050: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74    }.  /* The bot
b060: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
b070: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
b080: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
b090: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
b0a0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
b0b0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
b0c0: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
b0d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b0e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
b0f0: 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  erNext, iTab, ad
b100: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
b110: 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(v);.  }else{. 
b120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b130: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
b140: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
b150: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b160: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
b170: 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69  regReturn ) sqli
b180: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b190: 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72   OP_Return, pSor
b1a0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  t->regReturn);. 
b1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
b1c0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
b1d0: 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Break);.}../*.**
b1e0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
b1f0: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
b200: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
b210: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
b220: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
b230: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
b240: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
b250: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
b260: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
b270: 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f  *.** Also try to
b280: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69   estimate the si
b290: 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ze of the return
b2a0: 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74  ed value and ret
b2b0: 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  urn that.** resu
b2c0: 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68  lt in *pEstWidth
b2d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
b2e0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
b2f0: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
b300: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
b310: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
b320: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
b330: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b340: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
b350: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
b360: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
b370: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
b380: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
b390: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
b3a0: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
b3b0: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
b3c0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
b3d0: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
b3e0: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
b3f0: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
b400: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
b410: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
b420: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
b430: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b440: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
b450: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
b460: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
b470: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
b480: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
b490: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
b4a0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
b4b0: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
b4c0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
b4d0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
b4e0: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
b4f0: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
b500: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
b510: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
b520: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
b530: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
b540: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
b550: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b560: 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33  ine has either 3
b570: 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73   or 6 parameters
b580: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
b590: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
b5a0: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
b5b0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b5c0: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  A compile-time o
b5d0: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
b5e0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
b5f0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b600: 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20  TADATA.# define 
b610: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
b620: 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79  ,D,E,F) columnTy
b630: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
b640: 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ,F).#else /* if 
b650: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b660: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b670: 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66  TADATA) */.# def
b680: 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41  ine columnType(A
b690: 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75  ,B,C,D,E,F) colu
b6a0: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46  mnTypeImpl(A,B,F
b6b0: 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
b6c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
b6d0: 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61  mnTypeImpl(.  Na
b6e0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
b6f0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
b700: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b710: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b720: 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68 61  DATA.  const cha
b730: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
b740: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
b750: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
b760: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
b770: 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a 70  ,.#endif.  u8 *p
b780: 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68  EstWidth.){.  ch
b790: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
b7a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
b7b0: 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b  u8 estWidth = 1;
b7c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b7d0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b7e0: 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e  ADATA.  char con
b7f0: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
b800: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b810: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
b820: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
b830: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Col = 0;.#endif.
b840: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
b850: 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70  pr==0) || pNC->p
b860: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
b870: 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28  urn 0;.  switch(
b880: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
b890: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
b8a0: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
b8b0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
b8c0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
b8d0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
b8e0: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
b8f0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
b900: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
b910: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
b920: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
b930: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
b940: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
b950: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
b960: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
b970: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
b980: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
b990: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b9a0: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
b9b0: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
b9c0: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
b9d0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
b9e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b9f0: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
ba00: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
ba10: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
ba20: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
ba30: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
ba40: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
ba50: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
ba60: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
ba70: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
ba80: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
ba90: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
baa0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
bab0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
bac0: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
bad0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
bae0: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
baf0: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
bb00: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
bb10: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
bb20: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
bb30: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
bb40: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
bb50: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
bb60: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
bb70: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
bb80: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
bb90: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
bba0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
bbb0: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
bbc0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
bbd0: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
bbe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
bbf0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
bc00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
bc10: 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63  * At one time, c
bc20: 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c  ode such as "SEL
bc30: 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69  ECT new.x" withi
bc40: 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c  n a trigger woul
bc50: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75  d.        ** cau
bc60: 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  se this conditio
bc70: 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65  n to run.  Since
bc80: 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72   then, we have r
bc90: 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a  estructured how.
bca0: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67          ** trigg
bcb0: 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  er code is gener
bcc0: 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73  ated and so this
bcd0: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
bce0: 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20   longer .       
bcf0: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f   ** possible. Ho
bd00: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74  wever, it can st
bd10: 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20  ill be true for 
bd20: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
bd30: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
bd40: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20  ollowing:.      
bd50: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
bd60: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
bd70: 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a  1(col INTEGER);.
bd80: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
bd90: 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63  ECT (SELECT t1.c
bda0: 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31  ol) FROM FROM t1
bdb0: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ;.        **.   
bdc0: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c       ** when col
bdd0: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
bde0: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
bdf0: 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69  ssion "t1.col" i
be00: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  n the .        *
be10: 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e  * sub-select. In
be20: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
be30: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
be40: 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20  to NULL, even.  
be50: 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20        ** though 
be60: 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79  it should really
be70: 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20   be "INTEGER".. 
be80: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
be90: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
bea0: 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74   a problem, as t
beb0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f  he column type o
bec0: 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65  f "t1.col" is ne
bed0: 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  ver.        ** u
bee0: 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e  sed. When column
bef0: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
bf00: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
bf10: 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  on .        ** "
bf20: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22  (SELECT t1.col)"
bf30: 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  , the correct ty
bf40: 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28  pe is returned (
bf50: 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43  see the TK_SELEC
bf60: 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61  T.        ** bra
bf70: 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  nch below.  */. 
bf80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bf90: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
bfa0: 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78  ert( pTab && pEx
bfb0: 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29  pr->pTab==pTab )
bfc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
bfd0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
bfe0: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
bff0: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
c000: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
c010: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
c020: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
c030: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c040: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
c050: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
c060: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
c070: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
c080: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
c090: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
c0a0: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
c0b0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
c0c0: 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28  ol>=0 && ALWAYS(
c0d0: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
c0e0: 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
c0f0: 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20       /* If iCol 
c100: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
c110: 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  o, then the expr
c120: 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20  ession requests 
c130: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
c140: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75   rowid of the su
c150: 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
c160: 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  . This expressio
c170: 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20  n is legal (see 
c180: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
c190: 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e  st case misc2.2.
c1a0: 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65  2) - it always e
c1b0: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
c1c0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..          **. 
c1d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
c1e0: 41 4c 57 41 59 53 28 29 20 69 73 20 62 65 63 61  ALWAYS() is beca
c1f0: 75 73 65 20 69 43 6f 6c 3e 3d 70 53 2d 3e 70 45  use iCol>=pS->pE
c200: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 77 69 6c 6c  List->nExpr will
c210: 20 68 61 76 65 20 62 65 65 6e 0a 20 20 20 20 20   have been.     
c220: 20 20 20 20 20 2a 2a 20 63 61 75 67 68 74 20 61       ** caught a
c230: 6c 72 65 61 64 79 20 62 79 20 6e 61 6d 65 20 72  lready by name r
c240: 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20 20 20  esolution..     
c250: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c260: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
c270: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
c280: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
c290: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
c2a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
c2b0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
c2c0: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
c2d0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
c2e0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
c2f0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
c300: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
c310: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
c320: 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44  (&sNC, p,&zOrigD
c330: 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72  b,&zOrigTab,&zOr
c340: 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68  igCol, &estWidth
c350: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
c360: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
c370: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
c380: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
c390: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
c3a0: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
c3b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c3c0: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
c3d0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
c3e0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
c3f0: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
c400: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
c410: 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  l) );.#ifdef SQL
c420: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
c430: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
c440: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
c450: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
c460: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
c470: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
c480: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
c490: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c4a0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
c4b0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
c4c0: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ype;.          z
c4d0: 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  OrigCol = pTab->
c4e0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
c4f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
c500: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
c510: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
c520: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c530: 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62   zOrigTab = pTab
c540: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
c550: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
c560: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
c570: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
c580: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
c590: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
c5a0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
c5b0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20          zOrigDb 
c5c0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
c5d0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
c5e0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c  e;.        }.#el
c5f0: 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  se.        if( i
c600: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
c610: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
c620: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  GER";.        }e
c630: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
c640: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
c650: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
c660: 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64 74           estWidt
c670: 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  h = pTab->aCol[i
c680: 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20  Col].szEst;.    
c690: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
c6a0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
c6b0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
c6c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
c6d0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
c6e0: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
c6f0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c700: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
c710: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
c720: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
c730: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
c740: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
c750: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
c760: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c770: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
c780: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
c790: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
c7a0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
c7b0: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
c7c0: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pS = pExpr->x.p
c7d0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
c7e0: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
c7f0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
c800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
c810: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
c820: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
c830: 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
c840: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
c850: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
c860: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
c870: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
c880: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
c890: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
c8a0: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
c8b0: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
c8c0: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65  b, &zOrigCol, &e
c8d0: 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20  stWidth); .     
c8e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
c8f0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
c900: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c910: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
c920: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
c930: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c940: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
c950: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
c960: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
c970: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
c980: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
c990: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
c9a0: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
c9b0: 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69 64  if.  if( pEstWid
c9c0: 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68 20  th ) *pEstWidth 
c9d0: 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72 65  = estWidth;.  re
c9e0: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
c9f0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
ca00: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
ca10: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
ca20: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
ca30: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
ca40: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
ca50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ca60: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
ca70: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
ca80: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
ca90: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
caa0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
cab0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
cac0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
cad0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
cae0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
caf0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
cb00: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
cb10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cb20: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
cb30: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
cb40: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
cb50: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
cb60: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
cb70: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
cb80: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
cb90: 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rse;.  for(i=0; 
cba0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
cbb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
cbc0: 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *p = pEList->a[i
cbd0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e  ].pExpr;.    con
cbe0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
cbf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cc00: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
cc10: 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63  DATA.    const c
cc20: 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  har *zOrigDb = 0
cc30: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
cc40: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
cc50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cc60: 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20  zOrigCol = 0;.  
cc70: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
cc80: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
cc90: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
cca0: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29  b, &zOrigCol, 0)
ccb0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
ccc0: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
ccd0: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
cce0: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
ccf0: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
cd00: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
cd10: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
cd20: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
cd30: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
cd40: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
cd50: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
cd60: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
cd70: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
cd80: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
cd90: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
cda0: 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  gDb, SQLITE_TRAN
cdb0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
cdc0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
cdd0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
cde0: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
cdf0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
ce00: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
ce10: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
ce20: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
ce30: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51  MN, zOrigCol, SQ
ce40: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
ce50: 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65  .#else.    zType
ce60: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
ce70: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20  NC, p, 0, 0, 0, 
ce80: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
ce90: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
cea0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ceb0: 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79  ME_DECLTYPE, zTy
cec0: 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  pe, SQLITE_TRANS
ced0: 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  IENT);.  }.#endi
cee0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
cef0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
cf00: 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  PE) */.}../*.** 
cf10: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
cf20: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
cf30: 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20   VDBE the names 
cf40: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
cf50: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
cf60: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
cf70: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  on is used to pr
cf80: 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43  ovide the.** azC
cf90: 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74  ol[] values in t
cfa0: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
cfb0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
cfc0: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
cfd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cfe0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
cff0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
d000: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
d010: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
d020: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
d030: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
d040: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
d050: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
d060: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
d070: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
d080: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
d090: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d0a0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
d0b0: 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68  nt fullNames, sh
d0c0: 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64  ortNames;..#ifnd
d0d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
d0e0: 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74  XPLAIN.  /* If t
d0f0: 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
d100: 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65  N, skip this ste
d110: 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  p */.  if( pPars
d120: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
d130: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
d140: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72  ndif..  if( pPar
d150: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
d160: 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c  || NEVER(v==0) |
d170: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
d180: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
d190: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
d1a0: 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61  et = 1;.  fullNa
d1b0: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
d1c0: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
d1d0: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68  lNames)!=0;.  sh
d1e0: 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ortNames = (db->
d1f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
d200: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
d210: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
d220: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c  etNumCols(v, pEL
d230: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66  ist->nExpr);.  f
d240: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
d250: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d260: 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
d270: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
d280: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
d290: 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f  NEVER(p==0) ) co
d2a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
d2b0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
d2c0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
d2d0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
d2e0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
d2f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d300: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d310: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
d320: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ame, SQLITE_TRAN
d330: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
d340: 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b  e if( (p->op==TK
d350: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70  _COLUMN || p->op
d360: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  ==TK_AGG_COLUMN)
d370: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
d380: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
d390: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
d3a0: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
d3b0: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
d3c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
d3d0: 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69   ALWAYS(j<pTabLi
d3e0: 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b  st->nSrc); j++){
d3f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
d400: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
d410: 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29  sor==p->iTable )
d420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
d440: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
d450: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
d460: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
d470: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
d480: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
d490: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
d4a0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
d4b0: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
d4c0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
d4d0: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
d4e0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
d4f0: 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
d500: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d510: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
d520: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
d530: 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
d540: 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d     if( !shortNam
d550: 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73  es && !fullNames
d560: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d570: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d580: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d590: 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20  NAME, .         
d5a0: 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44     sqlite3DbStrD
d5b0: 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61  up(db, pEList->a
d5c0: 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49  [i].zSpan), SQLI
d5d0: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
d5e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c     }else if( ful
d5f0: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
d600: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
d610: 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  0;.        zName
d620: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
d630: 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70  f(db, "%s.%s", p
d640: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
d650: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d660: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d670: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
d680: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
d690: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
d6a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d6b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d6c0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d6d0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c  LNAME_NAME, zCol
d6e0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d6f0: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NT);.      }.   
d700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
d710: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
d720: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
d730: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30  ;.      z = z==0
d740: 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   ? sqlite3MPrint
d750: 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  f(db, "column%d"
d760: 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33  , i+1) : sqlite3
d770: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b  DbStrDup(db, z);
d780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d790: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d7a0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d7b0: 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   z, SQLITE_DYNAM
d7c0: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  IC);.    }.  }. 
d7d0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
d7e0: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
d7f0: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
d800: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
d810: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
d820: 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c  t (which is real
d830: 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  ly the list of e
d840: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
d850: 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75  at form the resu
d860: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
d870: 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f  CT statement) co
d880: 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74  mpute appropriat
d890: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  e.** column name
d8a0: 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68  s for a table th
d8b0: 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  at would hold th
d8c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
d8d0: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c  t..**.** All col
d8e0: 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62  umn names will b
d8f0: 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20  e unique..**.** 
d900: 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Only the column 
d910: 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74  names are comput
d920: 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70  ed.  Column.zTyp
d930: 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c  e, Column.zColl,
d940: 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69  .** and other fi
d950: 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61  elds of Column a
d960: 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
d970: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
d980: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
d990: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
d9a0: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
d9b0: 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c  rs,.** store NUL
d9c0: 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20  L in *paCol and 
d9d0: 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20  0 in *pnCol and 
d9e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d9f0: 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  MEM..*/.int sqli
da00: 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
da10: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
da20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
da30: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
da40: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
da50: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
da60: 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
da70: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
da80: 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
da90: 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
daa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
dab0: 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
dac0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
dad0: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
dae0: 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
daf0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
db00: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
db10: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
db20: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
db30: 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
db40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
db50: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db70: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
db80: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dba0: 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
dbb0: 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
dbc0: 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
dbd0: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
dbe0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
dbf0: 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
dc00: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
dc10: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
dc20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
dc30: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
dc40: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
dc50: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20  t */.  Expr *p; 
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
dc80: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65   for a single re
dc90: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
dca0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcc0: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
dcd0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcf0: 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
dd00: 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66  zName[] */..  if
dd10: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
dd20: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
dd30: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
dd40: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
dd50: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
dd60: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
dd70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
dd80: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==0 );.  }else
dd90: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
dda0: 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
ddb0: 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  }.  *pnCol = nCo
ddc0: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
ddd0: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
dde0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
ddf0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
de00: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
de10: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
de20: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
de30: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71     */.    p = sq
de40: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
de50: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
de60: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
de70: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
de80: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
de90: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
dea0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
deb0: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
dec0: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
ded0: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
dee0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
def0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
df00: 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
df10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
df20: 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20   Expr *pColExpr 
df30: 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70  = p;  /* The exp
df40: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
df50: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
df60: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
df70: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
df80: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73       /* Table as
df90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
dfa0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
dfb0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
dfc0: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
dfd0: 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
dfe0: 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
dff0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
e000: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
e010: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
e020: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  }.      if( pCol
e030: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
e040: 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43  UMN && ALWAYS(pC
e050: 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29  olExpr->pTab!=0)
e060: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
e070: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
e080: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
e090: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
e0a0: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
e0b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
e0c0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c       pTab = pCol
e0d0: 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
e0e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e0f0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
e100: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  Key;.        zNa
e110: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
e120: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20  ntf(db, "%s",.  
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
e140: 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61  Col>=0 ? pTab->a
e150: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20  Col[iCol].zName 
e160: 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20  : "rowid");.    
e170: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
e180: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
e190: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
e1a0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
e1b0: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
e1c0: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
e1d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
e1e0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
e1f0: 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d   "%s", pColExpr-
e200: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
e210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e220: 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67   /* Use the orig
e230: 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65  inal text of the
e240: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
e250: 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a  on as its name *
e260: 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  /.        zName 
e270: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e280: 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73  (db, "%s", pELis
e290: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
e2a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e2b0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e2c0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
e2d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e2e0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
e2f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
e300: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e310: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
e320: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
e330: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
e340: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
e350: 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
e360: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
e370: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
e380: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
e390: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
e3a0: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
e3b0: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
e3c0: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
e3d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
e3e0: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
e3f0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
e400: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
e410: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
e420: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
e430: 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20   for(k=nName-1; 
e440: 6b 3e 31 20 26 26 20 73 71 6c 69 74 65 33 49 73  k>1 && sqlite3Is
e450: 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b  digit(zName[k]);
e460: 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   k--){}.        
e470: 69 66 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d  if( k>=0 && zNam
e480: 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[k]==':' ) nNam
e490: 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a  e = k;.        z
e4a0: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
e4b0: 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d  .        zNewNam
e4c0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
e4d0: 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20  tf(db, "%s:%d", 
e4e0: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
e4f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
e500: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
e510: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e520: 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20   zNewName;.     
e530: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
e540: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
e550: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
e560: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
e570: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
e580: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
e590: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
e5a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
e5b0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
e5c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
e5d0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
e5e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
e5f0: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
e600: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
e610: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
e620: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e630: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
e640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e660: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
e670: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
e680: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
e690: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
e6a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
e6b0: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
e6c0: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
e6d0: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
e6e0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
e6f0: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
e700: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
e710: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
e720: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
e730: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
e740: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
e750: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
e760: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
e770: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
e780: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
e790: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
e7a0: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
e7b0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
e7c0: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
e7d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e7e0: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
e7f0: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
e800: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e810: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
e820: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
e830: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
e840: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
e850: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
e860: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
e870: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
e880: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
e890: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
e8a0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
e8b0: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
e8c0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
e8d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e8e0: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
e8f0: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
e900: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
e910: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
e920: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
e930: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e940: 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a  tem *a;.  u64 sz
e950: 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  All = 0;..  asse
e960: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
e970: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
e980: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
e990: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
e9a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
e9b0: 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
e9c0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
e9d0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
e9e0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
e9f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ea00: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
ea10: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
ea20: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
ea30: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
ea40: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
ea50: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
ea60: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
ea70: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
ea80: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
ea90: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
eaa0: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
eab0: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 54 79     if( pCol->zTy
eac0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  pe==0 ){.      p
ead0: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
eae0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
eaf0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
eb00: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
eb10: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 30 2c 30  Type(&sNC, p,0,0
eb20: 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74  ,0, &pCol->szEst
eb30: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ));.    }.    sz
eb40: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
eb50: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
eb60: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
eb70: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
eb80: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
eb90: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
eba0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
ebb0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
ebc0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
ebd0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
ebe0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
ebf0: 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d  ( pColl && pCol-
ec00: 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >zColl==0 ){.   
ec10: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
ec20: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ec30: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
ec40: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
ec50: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
ec60: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73   sqlite3LogEst(s
ec70: 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  zAll*4);.}../*.*
ec80: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
ec90: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
eca0: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
ecb0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
ecc0: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
ecd0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
ece0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
ecf0: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
ed00: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
ed10: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
ed20: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
ed30: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
ed40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ed50: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
ed60: 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
ed70: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
ed80: 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
ed90: 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
eda0: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
edb0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
edc0: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
edd0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
ede0: 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
edf0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
ee00: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
ee10: 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
ee20: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
ee30: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
ee40: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
ee50: 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
ee60: 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
ee70: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
ee80: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
ee90: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
eea0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
eeb0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
eec0: 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
eed0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
eee0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
eef0: 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
ef00: 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
ef10: 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
ef20: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
ef30: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
ef40: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  ;.  pTab->nRef =
ef50: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
ef60: 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
ef70: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
ef80: 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
ef90: 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
efa0: 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  576) );.  sqlite
efb0: 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
efc0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
efd0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
efe0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
eff0: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63  ->aCol);.  selec
f000: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
f010: 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
f020: 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74  e, pTab, pSelect
f030: 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
f040: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d   = -1;.  if( db-
f050: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
f060: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
f070: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
f080: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
f090: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
f0a0: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ab;.}../*.** Get
f0b0: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
f0c0: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
f0d0: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
f0e0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
f0f0: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
f100: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
f110: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
f120: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
f130: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
f140: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
f150: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
f160: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
f170: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
f180: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
f190: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
f1a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
f1b0: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  te(pParse);.    
f1c0: 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56  if( v ) sqlite3V
f1d0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
f1e0: 49 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Init);.    if( p
f1f0: 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
f200: 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69  ==0.     && Opti
f210: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
f220: 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
f230: 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
f240: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
f250: 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
f260: 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ctor = 1;.    }.
f270: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
f280: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
f290: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
f2a0: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
f2b0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
f2c0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
f2d0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
f2e0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
f2f0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
f300: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
f310: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
f320: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
f330: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
f340: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
f350: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
f360: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
f370: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
f380: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
f390: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
f3a0: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
f3b0: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
f3c0: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
f3d0: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
f3e0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
f3f0: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
f400: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
f410: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
f420: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
f430: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
f440: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
f450: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
f460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
f470: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
f480: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
f490: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
f4a0: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
f4b0: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
f4c0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
f4d0: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
f4e0: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
f4f0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
f500: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
f510: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
f520: 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
f530: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
f540: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
f550: 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
f560: 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
f570: 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
f580: 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
f590: 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
f5a0: 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
f5b0: 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
f5c0: 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
f5d0: 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
f5e0: 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
f5f0: 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
f600: 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
f610: 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20  ly if pLimit!=0 
f620: 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f  or pOffset!=0 do
f630: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
f640: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
f650: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
f660: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
f670: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
f680: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
f690: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
f6a0: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
f6b0: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
f6c0: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
f6d0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
f6e0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
f6f0: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
f700: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
f710: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
f720: 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b  *p, int iBreak){
f730: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a  .  Vdbe *v = 0;.
f740: 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
f750: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
f760: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b  .  int addr1, n;
f770: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
f780: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
f790: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
f7a0: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
f7b0: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
f7c0: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
f7d0: 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77  troversy about w
f7e0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
f7f0: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
f800: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
f810: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
f820: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
f830: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
f840: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
f850: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
f860: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
f870: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  se);.  assert( p
f880: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  ->pOffset==0 || 
f890: 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  p->pLimit!=0 );.
f8a0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
f8b0: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
f8c0: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
f8d0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f8e0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
f8f0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
f900: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
f910: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
f920: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
f930: 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20  pLimit, &n) ){. 
f940: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f950: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
f960: 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29  eger, n, iLimit)
f970: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
f980: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
f990: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
f9a0: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
f9b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f9c0: 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b  Goto(v, iBreak);
f9d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f9e0: 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c   n>=0 && p->nSel
f9f0: 65 63 74 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b  ectRow>(u64)n ){
fa00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
fa10: 65 63 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20  ectRow = n;.    
fa20: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
fa30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fa40: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
fa50: 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b  pLimit, iLimit);
fa60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fa70: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
fa80: 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74  ustBeInt, iLimit
fa90: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
faa0: 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
fab0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
fac0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
fad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fae0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
faf0: 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
fb00: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
fb10: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  v);.    }.    if
fb20: 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
fb30: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
fb40: 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70   = iOffset = ++p
fb50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
fb60: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b     pParse->nMem+
fb70: 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  +;   /* Allocate
fb80: 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74   an extra regist
fb90: 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66  er for limit+off
fba0: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  set */.      sql
fbb0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
fbc0: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  rse, p->pOffset,
fbd0: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
fbe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fbf0: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
fc00: 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64  nt, iOffset); Vd
fc10: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
fc20: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
fc30: 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75  ((v, "OFFSET cou
fc40: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 61  nter"));.      a
fc50: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
fc60: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
fc70: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 20  fPos, iOffset); 
fc80: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
fc90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fca0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fcb0: 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73  nteger, 0, iOffs
fcc0: 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
fcd0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
fce0: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
fcf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fd00: 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69  3(v, OP_Add, iLi
fd10: 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f  mit, iOffset, iO
fd20: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
fd30: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
fd40: 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29  "LIMIT+OFFSET"))
fd50: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
fd60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fd70: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
fd80: 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
fd90: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
fda0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fdb0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
fdc0: 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  -1, iOffset+1);.
fdd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fde0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
fdf0: 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  r1);.    }.  }.}
fe00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fe10: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
fe20: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
fe30: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
fe40: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
fe50: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
fe60: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
fe70: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
fe80: 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
fe90: 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
fea0: 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
feb0: 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
fec0: 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
fed0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
fee0: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
fef0: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
ff00: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
ff10: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
ff20: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
ff30: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
ff40: 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
ff50: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
ff60: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
ff70: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
ff80: 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
ff90: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
ffa0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
ffb0: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
ffc0: 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
ffd0: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
ffe0: 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
fff0: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
10000 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
10010 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
10020 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
10030 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  }.  assert( iCol
10040 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c  >=0 );.  /* iCol
10050 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68   must be less th
10060 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  an p->pEList->nE
10070 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20  xpr.  Otherwise 
10080 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20  an error would. 
10090 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68   ** have been th
100a0 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65  rown during name
100b0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20   resolution and 
100c0 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76  we would not hav
100d0 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68  e gotten.  ** th
100e0 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20  is far */.  if( 
100f0 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59  pRet==0 && ALWAY
10100 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  S(iCol<p->pEList
10110 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
10120 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
10130 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
10140 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
10150 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
10160 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
10170 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
10180 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
10190 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
101a0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
101b0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
101c0 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44  T.** with an ORD
101d0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68  ER BY clause. Th
101e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
101f0 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e  cates and return
10200 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73  s a KeyInfo.** s
10210 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c  tructure suitabl
10220 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69  e for implementi
10230 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  ng the ORDER BY.
10240 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
10250 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
10260 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
10270 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
10280 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  oc. The calling.
10290 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
102a0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
102b0 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69  nsuring that thi
102c0 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
102d0 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
102e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  ed..*/.static Ke
102f0 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65  yInfo *multiSele
10300 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
10310 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10320 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e  Select *p, int n
10330 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69  Extra){.  ExprLi
10340 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
10350 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
10360 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t nOrderBy = p->
10370 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
10380 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
10390 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b   pParse->db;.  K
103a0 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73  eyInfo *pRet = s
103b0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
103c0 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b  oc(db, nOrderBy+
103d0 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66  nExtra, 1);.  if
103e0 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( pRet ){.    in
103f0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
10400 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
10410 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
10420 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
10430 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42  pItem = &pOrderB
10440 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45  y->a[i];.      E
10450 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74  xpr *pTerm = pIt
10460 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
10470 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
10480 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ..      if( pTer
10490 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  m->flags & EP_Co
104a0 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
104b0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
104c0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
104d0 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  se, pTerm);.    
104e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
104f0 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
10500 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
10510 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e  se, p, pItem->u.
10520 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29  x.iOrderByCol-1)
10530 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
10540 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
10550 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
10560 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
10570 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20  ->a[i].pExpr =. 
10580 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10590 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
105a0 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65  ring(pParse, pTe
105b0 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  rm, pColl->zName
105c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
105d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
105e0 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
105f0 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20  le(pRet) );.    
10600 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d    pRet->aColl[i]
10610 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
10620 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pRet->aSortOrder
10630 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
10640 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
10650 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
10660 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
10670 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10680 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _CTE./*.** This 
10690 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
106a0 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63  s VDBE code to c
106b0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65  ompute the conte
106c0 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43  nt of a WITH REC
106d0 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20  URSIVE.** query 
106e0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
106f0 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d  **   <recursive-
10700 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75  table> AS (<setu
10710 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b  p-query> UNION [
10720 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d  ALL] <recursive-
10730 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20  query>).**      
10740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10750 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f     \___________/
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
10770 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
10780 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10790 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
107a0 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
107b0 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a             p.**.
107c0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65  **.** There is e
107d0 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72  xactly one refer
107e0 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75  ence to the recu
107f0 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74  rsive-table in t
10800 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  he FROM clause.*
10810 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71  * of recursive-q
10820 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74  uery, marked wit
10830 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61  h the SrcList->a
10840 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  [].fg.isRecursiv
10850 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  e flag..**.** Th
10860 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75  e setup-query ru
10870 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72  ns once to gener
10880 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73  ate an initial s
10890 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  et of rows that 
108a0 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65  go.** into a Que
108b0 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20  ue table.  Rows 
108c0 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
108d0 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62  om the Queue tab
108e0 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65  le one by.** one
108f0 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72  .  Each row extr
10900 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
10910 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44   is output to pD
10920 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73  est.  Then the s
10930 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74  ingle.** extract
10940 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74  ed row (now in t
10950 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c  he iCurrent tabl
10960 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  e) becomes the c
10970 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  ontent of the.**
10980 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
10990 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65   for a recursive
109a0 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65  -query run.  The
109b0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72   output of the r
109c0 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a  ecursive-query.*
109d0 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20  * is added back 
109e0 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
109f0 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74  able.  Then anot
10a00 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61  her row is extra
10a10 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a  cted from Queue.
10a20 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ** and the itera
10a30 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75  tion continues u
10a40 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74  ntil the Queue t
10a50 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
10a60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70  *.** If the comp
10a70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61  ound query opera
10a80 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65  tor is UNION the
10a90 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72  n no duplicate r
10aa0 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20  ows are ever.** 
10ab0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
10ac0 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
10ad0 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61  The iDistinct ta
10ae0 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79  ble keeps a copy
10af0 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20   of all rows.** 
10b00 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62  that have ever b
10b10 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
10b20 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73  o Queue and caus
10b30 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f  es duplicates to
10b40 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64   be.** discarded
10b50 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  .  If the operat
10b60 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c  or is UNION ALL,
10b70 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73   then duplicates
10b80 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
10b90 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72   .** If the quer
10ba0 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42  y has an ORDER B
10bb0 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20  Y, then entries 
10bc0 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62  in the Queue tab
10bd0 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a  le are kept in.*
10be0 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  * ORDER BY order
10bf0 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65   and the first e
10c00 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65  ntry is extracte
10c10 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65  d for each cycle
10c20 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e  .  Without.** an
10c30 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51   ORDER BY, the Q
10c40 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75  ueue table is ju
10c50 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a  st a FIFO..**.**
10c60 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   If a LIMIT clau
10c70 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20  se is provided, 
10c80 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69  then the iterati
10c90 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c  on stops after L
10ca0 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76  IMIT rows.** hav
10cb0 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f  e been output to
10cc0 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54   pDest.  A LIMIT
10cd0 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74   of zero means t
10ce0 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73  o output no rows
10cf0 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69   and a.** negati
10d00 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74  ve LIMIT means t
10d10 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77  o output all row
10d20 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
10d30 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63  also an OFFSET c
10d40 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20  lause.** with a 
10d50 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20  positive value, 
10d60 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f  then the first O
10d70 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72  FFSET outputs ar
10d80 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68  e discarded rath
10d90 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67  er.** than being
10da0 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20   sent to pDest. 
10db0 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74   The LIMIT count
10dc0 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
10dd0 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53  until after OFFS
10de0 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20  ET.** rows have 
10df0 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  been skipped..*/
10e00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
10e10 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
10e20 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65  veQuery(.  Parse
10e30 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10e40 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10e50 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10e60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
10e70 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20  * The recursive 
10e80 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64  SELECT to be cod
10e90 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
10ea0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
10eb0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
10ec0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
10ed0 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
10ee0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
10ef0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
10f00 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72   clause of the r
10f10 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
10f20 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  /.  int nCol = p
10f30 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
10f40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
10f50 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
10f60 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f  cursive table */
10f70 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10f80 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
10f90 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
10fa0 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
10fb0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
10fc0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75  .  Select *pSetu
10fd0 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20  p = p->pPrior;  
10fe0 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75   /* The setup qu
10ff0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ery */.  int add
11000 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
11010 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
11020 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
11030 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  nt addrCont, add
11040 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20  rBreak;      /* 
11050 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45  CONTINUE and BRE
11060 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  AK addresses */.
11070 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
11080 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11090 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74  /* The Current t
110a0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
110b0 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  gCurrent;       
110c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
110d0 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72  ter holding Curr
110e0 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
110f0 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20  nt iQueue;      
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11110 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  The Queue table 
11120 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e  */.  int iDistin
11130 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ct = 0;         
11140 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
11150 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69  unique results i
11160 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74  f UNION */.  int
11170 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66   eDest = SRT_Fif
11180 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  o;         /* Ho
11190 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75  w to write to Qu
111a0 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  eue */.  SelectD
111b0 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20  est destQueue;  
111c0 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
111d0 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20  Dest targetting 
111e0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
111f0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11220 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
11250 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  code */.  ExprLi
11260 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
11270 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
11280 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
11290 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
112a0 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20  , *pOffset;     
112b0 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54    /* Saved LIMIT
112c0 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20   and OFFSET */. 
112d0 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72   int regLimit, r
112e0 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  egOffset;      /
112f0 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64  * Registers used
11300 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   by LIMIT and OF
11310 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  FSET */..  /* Ob
11320 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  tain authorizati
11330 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72  on to do a recur
11340 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
11350 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
11360 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
11370 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30  ITE_RECURSIVE, 0
11380 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
11390 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
113a0 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
113b0 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66  FSET clauses, if
113c0 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20   they exist */. 
113d0 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
113e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
113f0 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
11400 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
11410 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65  arse, p, addrBre
11420 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20  ak);.  pLimit = 
11430 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66  p->pLimit;.  pOf
11440 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
11450 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20  t;.  regLimit = 
11460 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67  p->iLimit;.  reg
11470 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
11480 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  set;.  p->pLimit
11490 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20   = p->pOffset = 
114a0 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  0;.  p->iLimit =
114b0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
114c0 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
114d0 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a  >pOrderBy;..  /*
114e0 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73   Locate the curs
114f0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
11500 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
11510 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57  /.  for(i=0; ALW
11520 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63  AYS(i<pSrc->nSrc
11530 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
11540 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69   pSrc->a[i].fg.i
11550 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
11560 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70      iCurrent = p
11570 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
11580 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;.      break;.
11590 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
115a0 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
115b0 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65   numbers for Que
115c0 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  ue and Distinct.
115d0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    The cursor num
115e0 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ber for.  ** the
115f0 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20   Distinct table 
11600 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
11610 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
11620 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a   Queue in order.
11630 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54    ** for the SRT
11640 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52  _DistFifo and SR
11650 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73 74  T_DistQueue dest
11660 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b  inations to work
11670 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20  . */.  iQueue = 
11680 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
11690 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
116a0 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65  UNION ){.    eDe
116b0 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
116c0 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20  SRT_DistQueue : 
116d0 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20  SRT_DistFifo;.  
116e0 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50    iDistinct = pP
116f0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
11700 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74  }else{.    eDest
11710 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
11720 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69  T_Queue : SRT_Fi
11730 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  fo;.  }.  sqlite
11740 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
11750 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65 73  &destQueue, eDes
11760 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f  t, iQueue);..  /
11770 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
11780 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20  rs for Current, 
11790 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69  Queue, and Disti
117a0 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72  nct. */.  regCur
117b0 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  rent = ++pParse-
117c0 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
117d0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
117e0 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75  _OpenPseudo, iCu
117f0 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e  rrent, regCurren
11800 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20  t, nCol);.  if( 
11810 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11820 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
11830 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  o = multiSelectO
11840 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
11850 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20  arse, p, 1);.   
11860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11870 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
11880 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
11890 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
118a0 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
118b0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
118c0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
118d0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65  KEYINFO);.    de
118e0 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79  stQueue.pOrderBy
118f0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d   = pOrderBy;.  }
11900 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11910 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11920 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
11930 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a   iQueue, nCol);.
11940 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e    }.  VdbeCommen
11950 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61 62  t((v, "Queue tab
11960 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69  le"));.  if( iDi
11970 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d  stinct ){.    p-
11980 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
11990 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
119a0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
119b0 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69  phemeral, iDisti
119c0 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  nct, 0);.    p->
119d0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
119e0 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
119f0 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74  }..  /* Detach t
11a00 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11a10 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70  se from the comp
11a20 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
11a30 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
11a40 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  ;..  /* Store th
11a50 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
11a60 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20   setup-query in 
11a70 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74  Queue. */.  pSet
11a80 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  up->pNext = 0;. 
11a90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
11aa0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74  ect(pParse, pSet
11ab0 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b  up, &destQueue);
11ac0 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
11ad0 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29   = p;.  if( rc )
11ae0 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63   goto end_of_rec
11af0 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20  ursive_query;.. 
11b00 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78   /* Find the nex
11b10 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65  t row in the Que
11b20 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  ue and output th
11b30 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72  at row */.  addr
11b40 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
11b50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
11b60 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64  wind, iQueue, ad
11b70 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
11b80 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
11b90 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65   Transfer the ne
11ba0 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20  xt row in Queue 
11bb0 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20  over to Current 
11bc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11bd0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
11be0 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b  lRow, iCurrent);
11bf0 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c   /* To reset col
11c00 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69  umn cache */.  i
11c10 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
11c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11c30 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
11c40 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  n, iQueue, pOrde
11c50 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
11c60 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c  gCurrent);.  }el
11c70 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
11c80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11c90 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c  RowData, iQueue,
11ca0 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
11cb0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
11cc0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
11cd0 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  te, iQueue);..  
11ce0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69  /* Output the si
11cf0 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
11d00 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e  ent */.  addrCon
11d10 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
11d20 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
11d30 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67  odeOffset(v, reg
11d40 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
11d50 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
11d60 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
11d70 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72  p->pEList, iCurr
11d80 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c  ent,.      0, 0,
11d90 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74   pDest, addrCont
11da0 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
11db0 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a  if( regLimit ){.
11dc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11dd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
11de0 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d  JumpZero, regLim
11df0 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  it, addrBreak);.
11e00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
11e10 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
11e20 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11e30 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b  el(v, addrCont);
11e40 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74  ..  /* Execute t
11e50 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c  he recursive SEL
11e60 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73  ECT taking the s
11e70 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
11e80 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65  rent as.  ** the
11e90 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72   value for the r
11ea0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20  ecursive-table. 
11eb0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
11ec0 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a  s in the Queue..
11ed0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
11ee0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
11ef0 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c  egate ){.    sql
11f00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11f10 72 73 65 2c 20 22 72 65 63 75 72 73 69 76 65 20  rse, "recursive 
11f20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
11f30 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  s not supported"
11f40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11f50 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
11f60 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
11f70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
11f80 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73  tQueue);.    ass
11f90 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
11fa0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  0 );.    p->pPri
11fb0 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d  or = pSetup;.  }
11fc0 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
11fd0 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
11fe0 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
11ff0 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
12000 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
12010 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
12020 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
12030 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
12040 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  ..end_of_recursi
12050 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69  ve_query:.  sqli
12060 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
12070 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  e(pParse->db, p-
12080 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d  >pOrderBy);.  p-
12090 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
120a0 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  erBy;.  p->pLimi
120b0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d  t = pLimit;.  p-
120c0 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
120d0 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  et;.  return;.}.
120e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
120f0 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a  _OMIT_CTE */../*
12100 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
12110 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces */.static in
12120 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
12130 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
12140 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
12150 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12160 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12180 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
12190 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
121a0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
121b0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
121c0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
121d0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
121e0 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61   */.);../*.** Ha
121f0 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c  ndle the special
12200 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f   case of a compo
12210 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
12220 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
12230 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75  a.** VALUES clau
12240 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67  se.  By handling
12250 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69   this as a speci
12260 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69  al case, we avoi
12270 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73  d deep.** recurs
12280 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f  ion, and thus do
12290 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66   not need to enf
122a0 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f  orce the SQLITE_
122b0 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
122c0 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41  ELECT.** on a VA
122d0 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  LUES clause..**.
122e0 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 53  ** Because the S
122f0 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69  elect object ori
12300 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56  ginates from a V
12310 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a  ALUES clause:.**
12320 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f     (1) It has no
12330 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54   LIMIT or OFFSET
12340 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65  .**   (2) All te
12350 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c  rms are UNION AL
12360 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65  L.**   (3) There
12370 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
12380 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63  clause.*/.static
12390 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
123a0 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20  Values(.  Parse 
123b0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
123c0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
123d0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
123e0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
123f0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
12400 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
12410 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
12420 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
12430 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
12440 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
12450 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ts */.){.  Selec
12460 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74  t *pPrior;.  int
12470 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74   nRow = 1;.  int
12480 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   rc = 0;.  asser
12490 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
124a0 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
124b0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
124c0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
124d0 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
124e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
124f0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
12500 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
12510 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
12520 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
12530 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20  >pLimit==0 );.  
12540 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
12550 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  fset==0 );.    a
12560 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
12570 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  =0 || p->pEList-
12580 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74  >nExpr==p->pNext
12590 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
125a0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50  );.    if( p->pP
125b0 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  rior==0 ) break;
125c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
125d0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70  pPrior->pNext==p
125e0 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   );.    p = p->p
125f0 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b  Prior;.    nRow+
12600 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a  +;.  }while(1);.
12610 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
12620 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
12630 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72  rior;.    p->pPr
12640 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ior = 0;.    rc 
12650 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
12660 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
12670 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
12680 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69   = pPrior;.    i
12690 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
126a0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
126b0 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d   = nRow;.    p =
126c0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
126d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
126e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
126f0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
12700 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
12710 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
12720 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
12730 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
12740 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
12750 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
12760 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
12770 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
12780 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
12790 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
127a0 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
127b0 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
127c0 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
127d0 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
127e0 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
127f0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
12800 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
12810 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
12820 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
12830 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
12840 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
12850 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
12860 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
12870 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
12880 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
12890 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
128a0 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
128b0 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
128c0 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
128d0 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
128e0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
128f0 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
12900 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
12910 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
12920 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
12930 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
12940 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
12950 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
12960 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
12970 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
12980 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
12990 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
129a0 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
129b0 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
129d0 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
129e0 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
129f0 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
12a00 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
12a10 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
12a20 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
12a30 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
12a40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12a50 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
12a60 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
12a70 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
12a80 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
12a90 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
12aa0 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
12ab0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
12ac0 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
12ad0 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
12ae0 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
12af0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
12b00 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
12b10 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
12b20 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
12b30 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
12b40 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
12b50 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
12b60 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12b70 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12b80 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12b90 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
12ba0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
12bb0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
12bc0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12bd0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12be0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12bf0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12c00 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
12c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
12c20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
12c30 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
12c40 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
12c50 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
12c60 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
12c70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
12c80 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
12c90 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
12ca0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
12cb0 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
12cc0 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
12cd0 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20  t dest;      /* 
12ce0 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61  Alternative data
12cf0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
12d00 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74    Select *pDelet
12d10 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e  e = 0;  /* Chain
12d20 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63   of simple selec
12d30 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ts to delete */.
12d40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
12d50 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12d60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12d70 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12d80 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
12d90 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20  int iSub1 = 0;  
12da0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
12db0 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
12dc0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
12dd0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  2 = 0;        /*
12de0 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
12df0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
12e00 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
12e10 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
12e20 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
12e30 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
12e40 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
12e50 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
12e60 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
12e70 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
12e80 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
12e90 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
12ea0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12eb0 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20   p && p->pPrior 
12ec0 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66  );  /* Calling f
12ed0 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65  unction guarante
12ee0 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a  es this much */.
12ef0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
12f00 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
12f10 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e  rsive)==0 || p->
12f20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d  op==TK_ALL || p-
12f30 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
12f40 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
12f50 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
12f60 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74  ->pPrior;.  dest
12f70 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
12f80 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
12f90 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
12fa0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12fb0 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
12fc0 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
12fd0 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
12fe0 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
12ff0 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
13000 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
13010 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
13020 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
13030 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
13040 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13050 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
13060 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
13070 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
13080 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
13090 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
130a0 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
130b0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
130c0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
130d0 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
130e0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
130f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
13100 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
13110 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
13120 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
13130 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
13140 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
13150 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
13160 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
13170 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
13180 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
13190 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
131a0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
131b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
131c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
131d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
131e0 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70  st.iSDParm, p->p
131f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
13200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
13210 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
13220 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
13230 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
13240 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
13250 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  * Special handli
13260 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ng for a compoun
13270 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
13280 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41  iginates as a VA
13290 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a  LUES clause..  *
132a0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
132b0 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
132c0 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lue ){.    rc = 
132d0 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
132e0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  s(pParse, p, &de
132f0 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  st);.    goto mu
13300 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
13310 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
13320 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
13330 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
13340 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
13350 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
13360 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
13370 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
13380 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
13390 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
133a0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73  >pEList );.  ass
133b0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
133c0 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70  nExpr==pPrior->p
133d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
133e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
133f0 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70  OMIT_CTE.  if( p
13400 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
13410 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
13420 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
13430 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72  ursiveQuery(pPar
13440 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
13450 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
13460 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
13470 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
13480 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
13490 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
134a0 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
134b0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
134c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
134d0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
134e0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
134f0 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  st);.  }else..  
13500 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13510 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
13520 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
13530 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
13540 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
13550 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
13560 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
13570 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
13580 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
13590 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
135a0 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
135b0 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69     pPrior->iLimi
135c0 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
135d0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66       pPrior->iOf
135e0 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
135f0 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
13600 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
13610 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  mit;.      pPrio
13620 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->pOffset = p->
13630 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65  pOffset;.      e
13640 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
13650 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
13660 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
13670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13680 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13690 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b   pPrior, &dest);
136a0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
136b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
136c0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
136d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
136e0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
136f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
13700 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
13710 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
13720 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
13730 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
13740 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
13750 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
13760 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
13770 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  t ){.        add
13780 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
13790 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
137a0 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56  t, p->iLimit); V
137b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
137c0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
137d0 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
137e0 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
137f0 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  ched"));.      }
13800 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
13810 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
13820 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
13830 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
13840 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13850 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
13860 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
13870 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
13880 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
13890 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
138a0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
138b0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
138c0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
138d0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
138e0 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Row;.      if( p
138f0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20  Prior->pLimit.  
13900 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
13910 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72  xprIsInteger(pPr
13920 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c  ior->pLimit, &nL
13930 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20  imit).       && 
13940 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e  nLimit>0 && p->n
13950 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34  SelectRow > (u64
13960 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29  )nLimit .      )
13970 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
13980 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74  lectRow = nLimit
13990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
139a0 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
139b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
139c0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
139d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
139e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
139f0 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
13a00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
13a10 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
13a20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
13a30 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
13a40 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
13a50 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
13a60 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
13a70 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
13a80 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
13a90 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
13aa0 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
13ab0 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
13ac0 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
13ad0 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
13ae0 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
13af0 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
13b00 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
13b10 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
13b20 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
13b30 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
13b40 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
13b50 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
13b60 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
13b70 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
13b80 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
13b90 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
13ba0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
13bb0 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
13bc0 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
13bd0 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
13be0 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
13bf0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rOp ){.        /
13c00 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
13c10 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13c20 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
13c30 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
13c40 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
13c50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13c60 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
13c70 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
13c80 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
13c90 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
13ca0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
13cb0 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
13cc0 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e  t==0 );     /* N
13cd0 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
13ce0 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
13cf0 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
13d00 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
13d10 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
13d20 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
13d30 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
13d40 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
13d50 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
13d60 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
13d70 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
13d80 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
13d90 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
13da0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
13db0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
13dc0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
13dd0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
13de0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
13df0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
13e00 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
13e10 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
13e20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
13e30 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
13e40 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
13e50 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13e60 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
13e70 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
13e80 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
13e90 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
13ea0 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
13eb0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
13ec0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
13ed0 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
13ee0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
13ef0 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
13f00 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
13f10 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
13f20 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
13f30 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
13f40 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
13f50 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
13f60 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
13f70 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
13f80 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
13f90 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
13fa0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13fb0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
13fc0 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
13fd0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
13fe0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
13ff0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
14000 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
14010 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
14020 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14030 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14040 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
14050 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
14060 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
14070 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14090 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
140a0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
140b0 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d  T_Union;.      }
140c0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
140d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
140e0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
140f0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
14100 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
14110 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
14120 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
14130 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69  t = 0;.      uni
14140 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
14150 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  p;.      explain
14160 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
14170 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
14180 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
14190 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
141a0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
141b0 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
141c0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
141d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
141e0 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
141f0 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
14200 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
14210 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
14220 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
14230 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
14240 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
14250 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
14260 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
14270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14280 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
14290 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
142a0 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
142b0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
142c0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
142d0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
142e0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
142f0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
14300 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63  NION ) p->nSelec
14310 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
14320 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
14330 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
14340 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
14350 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
14360 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
14370 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14380 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
14390 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
143a0 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
143b0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  = 0;..      /* C
143c0 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
143d0 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
143e0 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
143f0 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
14400 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
14410 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
14420 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14430 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
14440 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
14450 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
14460 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69  iorOp );.      i
14470 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
14480 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
14490 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
144a0 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
144b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
144c0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
144d0 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
144e0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
144f0 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
14500 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
14510 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
14520 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
14530 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
14540 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
14550 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
14560 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
14570 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
14580 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14590 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
145a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
145b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
145c0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
145d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
145e0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
145f0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
14600 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
14610 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14620 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14630 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
14640 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  ab, iBreak); Vdb
14650 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14660 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
14670 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
14680 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
14690 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
146a0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
146b0 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
146c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
146d0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
146e0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
146f0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
14700 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
14710 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
14720 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14730 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14740 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
14750 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
14760 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14780 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
14790 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
147a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
147b0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
147c0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
147d0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
147e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
147f0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  ult: assert( p->
14800 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
14810 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
14820 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
14830 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
14840 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
14850 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
14860 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
14870 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
14880 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
14890 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
148a0 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
148b0 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
148c0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
148d0 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
148e0 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
148f0 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
14900 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
14910 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
14920 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
14930 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
14940 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
14950 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
14960 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
14970 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
14980 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
14990 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
149a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
149b0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
149c0 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
149d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
149e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
149f0 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
14a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14a10 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
14a20 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
14a30 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14a40 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
14a50 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
14a60 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
14a70 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
14a80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14a90 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
14aa0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
14ab0 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
14ac0 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
14ad0 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
14ae0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
14af0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14b00 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
14b10 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
14b20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
14b30 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14b40 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
14b50 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
14b60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14b70 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14b80 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
14b90 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
14ba0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
14bb0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14bc0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
14bd0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
14be0 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
14bf0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
14c00 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
14c10 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
14c20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14c30 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14c40 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
14c50 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
14c60 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
14c70 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
14c80 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
14c90 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
14ca0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
14cb0 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
14cc0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
14cd0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
14ce0 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
14cf0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
14d00 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
14d10 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
14d20 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d  sectdest.iSDParm
14d30 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
14d40 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14d50 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
14d60 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14d70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14d80 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14d90 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
14da0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
14db0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14dc0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
14dd0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
14de0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14df0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
14e00 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
14e10 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
14e20 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
14e30 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
14e40 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
14e50 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
14e60 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
14e70 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
14e80 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
14e90 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14ea0 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
14eb0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
14ec0 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
14ed0 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
14ee0 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
14ef0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
14f00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14f10 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
14f20 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
14f30 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
14f40 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
14f50 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
14f60 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
14f70 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
14f80 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
14f90 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
14fa0 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
14fb0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
14fc0 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
14fd0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
14fe0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
14ff0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15000 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
15010 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
15020 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
15030 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
15040 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
15050 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
15060 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15070 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
15080 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
15090 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
150a0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
150b0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
150c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
150d0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
150e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
150f0 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31  RowKey, tab1, r1
15100 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15110 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
15120 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
15130 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
15140 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15150 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
15160 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
15170 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
15180 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
15190 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
151a0 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20  >pEList, tab1,. 
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151c0 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
151d0 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
151e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
151f0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15200 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
15210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15220 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  p2(v, OP_Next, t
15230 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64  ab1, iStart); Vd
15240 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15250 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15260 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15270 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
15280 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15290 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
152a0 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
152b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
152c0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
152d0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
152e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
152f0 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
15300 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
15310 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70   iSub1, iSub2, p
15320 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a  ->op!=TK_ALL);..
15330 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
15340 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
15350 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
15360 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
15370 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
15380 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
15390 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
153a0 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
153b0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
153c0 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
153d0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
153e0 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
153f0 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
15400 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
15410 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
15420 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15430 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
15440 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
15450 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
15460 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
15470 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
15480 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
15490 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
154a0 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
154b0 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
154c0 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
154d0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
154e0 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
154f0 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
15500 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15520 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15530 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
15540 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
15550 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
15560 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
15570 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
15580 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
155b0 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
155c0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
155d0 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
155e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
155f0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
15600 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
15610 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
15620 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
15630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15640 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
15650 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
15660 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
15670 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  ->pNext==0 );.  
15680 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
15690 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
156a0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
156b0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
156c0 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20  , nCol, 1);.    
156d0 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
156e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
156f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
15700 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
15710 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
15720 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
15730 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
15740 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
15750 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
15760 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
15770 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
15780 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
15790 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
157a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
157b0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
157c0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
157d0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
157e0 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
157f0 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
15800 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
15810 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
15820 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
15830 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
15840 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
15850 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
15860 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
15870 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
15880 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
15890 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
158a0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
158b0 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
158c0 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
158d0 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
158e0 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
158f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15900 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
15910 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
15920 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15930 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
15940 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15950 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
15960 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15970 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
15980 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71   addr, (char*)sq
15990 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
159a0 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20  pKeyInfo),.     
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159c0 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
159d0 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
159e0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
159f0 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
15a00 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15a10 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
15a20 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
15a30 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
15a40 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
15a50 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
15a60 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64  pDest->nSdst = d
15a70 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c  est.nSdst;.  sql
15a80 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
15a90 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
15aa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
15ab0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
15ac0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
15ad0 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72  ECT */../*.** Er
15ae0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20  ror message for 
15af0 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65  when two or more
15b00 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70   terms of a comp
15b10 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65  ound select have
15b20 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69   different.** si
15b30 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ze result sets..
15b40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
15b50 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72  electWrongNumTer
15b60 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  msError(Parse *p
15b70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
15b80 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  ){.  if( p->selF
15b90 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73  lags & SF_Values
15ba0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
15bb0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15bc0 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74  "all VALUES must
15bd0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
15be0 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29  umber of terms")
15bf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
15c00 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15c10 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
15c20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
15c30 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
15c40 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
15c50 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
15c60 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
15c70 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
15c80 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d  e(p->op));.  }.}
15c90 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
15ca0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
15cb0 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e  e for a coroutin
15cc0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
15cd0 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   of a.** SELECT 
15ce0 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  statment..**.** 
15cf0 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f  The data to be o
15d00 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e  utput is contain
15d10 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74  ed in pIn->iSdst
15d20 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20  .  There are.** 
15d30 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d  pIn->nSdst colum
15d40 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  ns to be output.
15d50 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65    pDest is where
15d60 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75   the output shou
15d70 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a  ld.** be sent..*
15d80 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69  *.** regReturn i
15d90 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
15da0 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  the register hol
15db0 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
15dc0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64  ine.** return ad
15dd0 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dress..**.** If 
15de0 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69  regPrev>0 then i
15df0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  t is the first r
15e00 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63  egister in a vec
15e10 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f  tor that.** reco
15e20 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  rds the previous
15e30 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65   output.  mem[re
15e40 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67  gPrev] is a flag
15e50 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a   that is false.*
15e60 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  * if there has b
15e70 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  een no previous 
15e80 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50  output.  If regP
15e90 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  rev>0 then code 
15ea0 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
15eb0 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c  to suppress dupl
15ec0 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66  icates.  pKeyInf
15ed0 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  o is used for co
15ee0 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e  mparing.** keys.
15ef0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49  .**.** If the LI
15f00 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e  MIT found in p->
15f10 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65  iLimit is reache
15f20 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  d, jump immediat
15f30 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b  ely to.** iBreak
15f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15f50 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
15f60 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73  broutine(.  Pars
15f70 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15f80 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15f90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15fa0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15fb0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
15fc0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
15fd0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e   SelectDest *pIn
15fe0 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f  ,        /* Coro
15ff0 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20  utine supplying 
16000 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
16010 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
16020 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65    /* Where to se
16030 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  nd the data */. 
16040 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20   int regReturn, 
16050 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16060 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  return address r
16070 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
16080 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20   regPrev,       
16090 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
160a0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
160b0 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73  .  No uniqueness
160c0 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e   if 0 */.  KeyIn
160d0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
160e0 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72     /* For compar
160f0 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75  ing with previou
16100 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  s entry */.  int
16110 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
16120 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
16130 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20  e if we hit the 
16140 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64  LIMIT */.){.  Vd
16150 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
16160 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f  pVdbe;.  int iCo
16170 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64  ntinue;.  int ad
16180 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71  dr;..  addr = sq
16190 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
161a0 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74  Addr(v);.  iCont
161b0 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
161c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
161d0 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64  .  /* Suppress d
161e0 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e  uplicates for UN
161f0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
16200 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f   INTERSECT .  */
16210 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
16220 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32  {.    int j1, j2
16230 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74  ;.    j1 = sqlit
16240 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16250 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65  OP_IfNot, regPre
16260 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  v); VdbeCoverage
16270 28 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71  (v);.    j2 = sq
16280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16290 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70  v, OP_Compare, p
162a0 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
162b0 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
162c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162e0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
162f0 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
16300 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  o), P4_KEYINFO);
16310 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16320 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
16330 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  p, j2+2, iContin
16340 75 65 2c 20 6a 32 2b 32 29 3b 20 56 64 62 65 43  ue, j2+2); VdbeC
16350 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
16360 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
16370 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
16380 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16390 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49  3(v, OP_Copy, pI
163a0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
163b0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d  v+1, pIn->nSdst-
163c0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
163d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
163e0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
163f0 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
16400 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
16410 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
16420 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
16430 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46  ess the first OF
16440 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
16450 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
16460 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
16470 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
16480 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
16490 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  inue);..  assert
164a0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  ( pDest->eDest!=
164b0 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20  SRT_Exists );.  
164c0 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
164d0 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
164e0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  );.  switch( pDe
164f0 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
16500 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
16510 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
16520 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
16530 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16540 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
16550 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
16560 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16570 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16580 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
16590 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
165a0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
165b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
165c0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
165d0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
165e0 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
165f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16600 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
16610 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
16620 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
16630 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16640 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
16650 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
16660 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
16670 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16680 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
16690 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
166a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
166b0 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
166c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
166d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
166e0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
166f0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
16700 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16710 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
16720 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
16730 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
16740 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
16750 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
16760 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
16770 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
16780 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
16790 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
167a0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
167b0 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
167c0 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
167d0 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
167e0 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
167f0 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
16800 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16810 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
16820 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
16830 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
16840 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20  dst = .         
16850 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
16860 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
16870 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
16880 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
16890 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
168a0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
168b0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
168c0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
168d0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
168e0 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31  In->iSdst, 1, r1
168f0 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73  , &pDest->affSds
16900 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t,1);.      sqli
16910 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
16920 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
16930 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  e, pIn->iSdst, 1
16940 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16950 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16960 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73  _IdxInsert, pDes
16970 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b  t->iSDParm, r1);
16980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16990 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
169a0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
169b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
169c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
169d0 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
169e0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
169f0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
16a00 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
16a10 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
16a20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
16a30 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
16a40 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
16a50 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
16a60 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
16a70 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
16a80 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16a90 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
16aa0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20  rse->nErr>0 );  
16ab0 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
16ac0 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst!=1 );.     
16ad0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16ae0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
16af0 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
16b00 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
16b10 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
16b20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
16b30 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
16b40 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
16b50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
16b60 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
16b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16b80 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
16b90 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
16ba0 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
16bb0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16bc0 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
16bd0 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
16be0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
16bf0 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
16c00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16c10 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
16c20 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
16c30 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
16c40 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
16c50 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
16c60 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
16c70 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16c80 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
16c90 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
16ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16cb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
16cc0 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
16cd0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
16ce0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16cf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16d00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16d10 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
16d20 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
16d30 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
16d40 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
16d50 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
16d60 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
16d70 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
16d80 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
16d90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16da0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
16db0 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
16dc0 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
16dd0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
16de0 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
16df0 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
16e00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
16e10 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
16e20 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
16e30 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
16e40 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
16e50 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
16e60 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
16e70 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
16e80 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
16e90 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
16ea0 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
16eb0 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
16ec0 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
16ed0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16ee0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
16ef0 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
16f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16f10 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
16f20 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
16f30 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
16f40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16f50 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
16f60 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
16f70 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16f80 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
16f90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16fa0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
16fb0 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
16fc0 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
16fd0 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
16fe0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
16ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17000 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
17010 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  umpZero, p->iLim
17020 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
17030 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17040 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
17050 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
17060 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
17070 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17080 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
17090 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
170a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
170b0 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
170c0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
170d0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
170e0 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
170f0 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
17100 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
17110 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
17120 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
17130 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
17140 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
17150 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
17160 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
17170 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
17180 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
17190 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
171a0 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
171b0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
171c0 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
171d0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
171e0 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
171f0 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
17200 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
17210 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
17220 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
17230 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
17240 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
17250 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
17260 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
17270 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
17280 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
17290 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
172a0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
172b0 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
172c0 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
172d0 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
172e0 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
172f0 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
17300 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
17310 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
17320 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
17330 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
17340 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
17350 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
17360 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
17370 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
17380 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
17390 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
173a0 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
173b0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
173c0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
173d0 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
173e0 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
173f0 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
17400 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
17410 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
17420 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
17430 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
17440 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
17450 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
17460 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
17470 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
17480 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
17490 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
174a0 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
174b0 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
174c0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
174d0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
174e0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
174f0 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
17500 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
17510 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
17520 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
17530 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
17540 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
17550 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
17560 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
17570 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
17580 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
17590 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
175a0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
175b0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
175c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
175d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
175e0 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
175f0 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
17600 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
17610 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
17620 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
17630 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
17640 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
17650 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
17660 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
17670 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
17680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
17690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
176a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
176b0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
176c0 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
176d0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
176e0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
176f0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17700 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
17710 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
17720 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
17730 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
17740 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
17750 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
17760 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
17770 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17780 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
17790 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
177a0 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
177b0 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
177c0 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
177d0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
177e0 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
177f0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
17800 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
17810 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
17820 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
17830 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
17840 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
17850 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
17860 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
17870 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
17880 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
17890 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
178a0 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
178b0 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
178c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
178d0 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
178e0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
178f0 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
17900 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
17910 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
17920 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
17930 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
17940 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
17950 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
17960 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
17970 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
17980 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
17990 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
179a0 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
179b0 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
179c0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
179d0 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
179e0 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
179f0 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
17a00 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
17a10 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
17a20 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
17a30 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
17a40 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
17a50 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
17a60 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
17a70 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
17a80 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
17a90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
17aa0 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
17ab0 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
17ac0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
17ad0 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
17ae0 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
17af0 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
17b00 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
17b10 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
17b20 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
17b30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
17b40 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
17b50 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
17b60 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
17b70 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
17b80 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
17b90 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
17ba0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17bb0 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
17bc0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17bd0 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
17be0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
17bf0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
17c00 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
17c10 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
17c20 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
17c30 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
17c40 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
17c50 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
17c60 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
17c70 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
17c80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
17c90 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
17ca0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
17cb0 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
17cc0 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
17cd0 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
17ce0 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
17cf0 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
17d00 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
17d10 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
17d20 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
17d30 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
17d40 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
17d50 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
17d60 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
17d70 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
17d80 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
17d90 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
17da0 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
17db0 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
17dc0 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
17dd0 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
17de0 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
17df0 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
17e00 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
17e10 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
17e20 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
17e30 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
17e40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17e50 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
17e60 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
17e70 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
17e80 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
17e90 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
17ea0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
17eb0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
17ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17ed0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
17ee0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
17ef0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
17f00 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
17f10 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
17f20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
17f30 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
17f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
17f50 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
17f60 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
17f70 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
17f80 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
17f90 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
17fa0 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17fc0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
17fd0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
17fe0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
17ff0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
18000 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
18010 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
18020 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
18030 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
18040 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
18050 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
18060 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18070 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18080 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
18090 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
180a0 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
180b0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
180c0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
180d0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
180e0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
180f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18100 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
18110 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18120 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
18130 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18140 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
18150 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18160 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
18170 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18180 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
18190 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
181a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
181b0 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
181c0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
181d0 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
181e0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
181f0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
18200 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
18210 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
18220 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
18230 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
18240 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
18250 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
18260 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
18270 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18280 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
18290 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
182a0 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
182b0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
182c0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f  .  int addrEofA_
182d0 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65  noB;     /* Alte
182e0 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69  rnate addrEofA i
182f0 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  f B is uninitial
18300 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ized */.  int ad
18310 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
18320 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18330 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
18340 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
18350 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
18360 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18370 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
18380 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18390 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
183a0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
183b0 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
183c0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
183d0 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
183e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
183f0 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
18400 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
18410 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
18420 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
18430 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
18440 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
18450 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
18460 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
18470 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
18480 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
18490 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
184a0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
184b0 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
184c0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
184d0 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
184e0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
184f0 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
18500 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
18510 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
18520 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
18530 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
18540 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
18550 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
18560 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
18570 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
18580 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
18590 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
185a0 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
185b0 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
185c0 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
185d0 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
185e0 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
185f0 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
18600 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
18610 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
18620 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
18630 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
18640 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
18650 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
18660 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
18670 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
18680 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
18690 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
186a0 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
186b0 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
186c0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
186d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
186e0 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
186f0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
18700 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18710 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18720 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
18730 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
18740 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18750 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
18760 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
18770 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18780 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18790 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
187a0 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
187b0 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
187c0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
187d0 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
187e0 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
187f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
18800 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
18810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
18820 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
18830 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
18840 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
18850 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
18860 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
18870 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
18880 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
18890 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
188a0 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
188b0 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
188c0 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
188d0 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
188e0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
188f0 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
18900 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
18910 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
18920 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
18930 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
18940 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
18950 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
18960 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18970 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
18980 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
18990 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
189a0 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
189b0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
189c0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
189d0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
189e0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
189f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
18a00 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
18a10 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
18a20 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
18a30 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
18a40 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
18a50 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
18a60 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
18a70 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
18a80 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
18a90 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
18aa0 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
18ab0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
18ac0 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
18ad0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
18ae0 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
18af0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
18b00 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
18b10 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
18b20 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
18b30 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
18b40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
18b50 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
18b60 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
18b70 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18b80 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18b90 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
18ba0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
18bb0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
18bc0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
18bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18be0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
18bf0 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
18c00 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
18c10 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
18c20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
18c30 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
18c40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
18c50 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
18c60 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
18c70 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
18c80 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
18c90 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18ca0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18cb0 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
18cc0 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
18cd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
18ce0 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
18cf0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
18d00 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
18d10 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
18d20 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
18d30 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
18d40 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
18d50 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
18d60 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
18d70 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
18d80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
18d90 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
18da0 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
18db0 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
18dc0 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
18dd0 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
18de0 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
18df0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
18e00 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
18e10 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
18e20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
18e30 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
18e40 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
18e50 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
18e60 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
18e70 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
18e80 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
18e90 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
18ea0 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
18eb0 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
18ec0 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
18ed0 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
18ee0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
18ef0 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
18f00 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
18f10 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79  of(int)*nOrderBy
18f20 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
18f30 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
18f40 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18f50 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Item;.    for(i=
18f60 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
18f70 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79  y->a; i<nOrderBy
18f80 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
18f90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18fa0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18fb0 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
18fc0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
18fd0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c  u.x.iOrderByCol<
18fe0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
18ff0 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d  r );.      aPerm
19000 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  ute[i] = pItem->
19010 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
19020 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  - 1;.    }.    p
19030 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69  KeyMerge = multi
19040 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
19050 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
19060 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
19070 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a   pKeyMerge = 0;.
19080 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61    }..  /* Reatta
19090 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
190a0 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75  clause to the qu
190b0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ery..  */.  p->p
190c0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
190d0 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f  By;.  pPrior->pO
190e0 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
190f0 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72  ExprListDup(pPar
19100 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79  se->db, pOrderBy
19110 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  , 0);..  /* Allo
19120 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20  cate a range of 
19130 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
19140 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49  ers and the KeyI
19150 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20  nfo needed.  ** 
19160 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68  for the logic th
19170 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69  at removes dupli
19180 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73  cate result rows
19190 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   when the.  ** o
191a0 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
191b0 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
191c0 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20  ERSECT (but not 
191d0 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f  UNION ALL)..  */
191e0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
191f0 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76  L ){.    regPrev
19200 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
19210 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
19220 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
19230 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72  .    assert( nOr
19240 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20  derBy>=nExpr || 
19250 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19260 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20   );.    regPrev 
19270 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
19280 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
19290 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20  em += nExpr+1;. 
192a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
192b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
192c0 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b  er, 0, regPrev);
192d0 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73  .    pKeyDup = s
192e0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
192f0 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29  oc(db, nExpr, 1)
19300 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75  ;.    if( pKeyDu
19310 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
19320 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
19330 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
19340 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66  yDup) );.      f
19350 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
19360 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
19370 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d  KeyDup->aColl[i]
19380 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
19390 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
193a0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
193b0 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
193c0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
193d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f  .    }.  }. .  /
193e0 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c  * Separate the l
193f0 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68  eft and the righ
19400 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65  t query from one
19410 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20   another.  */.  
19420 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
19430 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
19440 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73   0;.  sqlite3Res
19450 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
19460 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
19470 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
19480 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  );.  if( pPrior-
19490 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
194a0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
194b0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
194c0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72  rse, pPrior, pPr
194d0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  ior->pOrderBy, "
194e0 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20  ORDER");.  }..  
194f0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
19500 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a  imit registers *
19510 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
19520 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
19530 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  , p, labelEnd);.
19540 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
19550 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  && op==TK_ALL ){
19560 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
19570 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19580 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d  .    regLimitB =
19590 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
195a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
195b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
195c0 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20  y, p->iOffset ? 
195d0 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70  p->iOffset+1 : p
195e0 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20  ->iLimit,.      
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19600 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c              regL
19610 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  imitA);.    sqli
19620 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19630 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d   OP_Copy, regLim
19640 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b  itA, regLimitB);
19650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
19660 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d  gLimitA = regLim
19670 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  itB = 0;.  }.  s
19680 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
19690 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
196a0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  .  p->pLimit = 0
196b0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
196c0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
196d0 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66  fset);.  p->pOff
196e0 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41  set = 0;..  regA
196f0 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrA = ++pParse-
19700 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
19710 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
19720 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20  em;.  regOutA = 
19730 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19740 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50    regOutB = ++pP
19750 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
19760 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
19770 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f  nit(&destA, SRT_
19780 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19790 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  drA);.  sqlite3S
197a0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
197b0 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estB, SRT_Corout
197c0 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
197d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
197e0 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
197f0 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
19800 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
19810 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
19820 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
19830 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
19840 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61  select..  */.  a
19850 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
19860 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19870 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31  ddr(v) + 1;.  j1
19880 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19890 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
198a0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
198b0 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rA, 0, addrSelec
198c0 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tA);.  VdbeComme
198d0 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c  nt((v, "left SEL
198e0 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72  ECT"));.  pPrior
198f0 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
19900 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53  mitA;.  explainS
19910 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
19920 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
19930 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
19940 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
19950 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29   pPrior, &destA)
19960 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19970 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
19980 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
19990 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rA);.  sqlite3Vd
199a0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
199b0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
199c0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
199d0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
199e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
199f0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
19a00 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
19a10 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
19a20 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
19a30 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19a40 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71  ) + 1;.  j1 = sq
19a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19a60 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
19a70 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30  ine, regAddrB, 0
19a80 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a  , addrSelectB);.
19a90 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
19aa0 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22  , "right SELECT"
19ab0 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
19ac0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
19ad0 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
19ae0 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
19af0 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
19b00 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
19b10 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e  = 0;  .  explain
19b20 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
19b30 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
19b40 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
19b50 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
19b60 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20  , p, &destB);.  
19b70 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65  p->iLimit = save
19b80 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66  dLimit;.  p->iOf
19b90 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73  fset = savedOffs
19ba0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  et;.  sqlite3Vdb
19bb0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e  eAddOp1(v, OP_En
19bc0 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  dCoroutine, regA
19bd0 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
19be0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
19bf0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
19c00 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
19c10 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65  of the A.  ** se
19c20 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
19c30 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
19c40 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
19c50 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
19c60 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
19c70 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
19c80 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f  or A"));.  addrO
19c90 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utA = generateOu
19ca0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
19cb0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
19cc0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
19cd0 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  A, pDest, regOut
19ce0 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  A,.             
19cf0 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
19d00 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
19d10 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  .  .  /* Generat
19d20 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
19d30 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
19d40 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
19d50 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he B.  ** select
19d60 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
19d70 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
19d80 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
19d90 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
19da0 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
19db0 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62  UNION ){.    Vdb
19dc0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
19dd0 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
19de0 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61   for B"));.    a
19df0 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61  ddrOutB = genera
19e00 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
19e10 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
19e20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
19e30 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65  destB, pDest, re
19e40 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20  gOutB,.         
19e50 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
19e60 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
19e70 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nd);.  }.  sqlit
19e80 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
19e90 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47  KeyDup);..  /* G
19ea0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
19eb0 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
19ec0 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
19ed0 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
19ee0 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
19ef0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
19f00 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
19f10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
19f20 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
19f30 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
19f40 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
19f50 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c  B = addrEofA = l
19f60 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65  abelEnd;.  }else
19f70 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
19f80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
19f90 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
19fa0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d  ;.    addrEofA =
19fb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19fc0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
19fd0 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
19fe0 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41  B);.    addrEofA
19ff0 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64  _noB = sqlite3Vd
1a000 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1a010 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1a020 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20  labelEnd);.     
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a050 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a060 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a070 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41  Goto(v, addrEofA
1a080 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  );.    p->nSelec
1a090 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
1a0a0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a  nSelectRow;.  }.
1a0b0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1a0c0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
1a0d0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
1a0e0 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
1a0f0 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  B.  ** are exhau
1a100 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
1a110 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72  ta in select A r
1a120 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
1a130 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
1a140 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
1a150 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a  ofB = addrEofA;.
1a160 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
1a170 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e  ctRow > pPrior->
1a180 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
1a190 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
1a1a0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
1a1b0 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
1a1c0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1a1d0 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f  (v, "eof-B subro
1a1e0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1a1f0 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33  drEofB = sqlite3
1a200 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a210 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
1a220 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20   addrOutA);.    
1a230 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a240 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1a250 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e  egAddrA, labelEn
1a260 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
1a270 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1a280 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
1a290 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EofB);.  }..  /*
1a2a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1a2b0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1a2c0 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20  e of A<B.  */.  
1a2d0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1a2e0 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72  (v, "A-lt-B subr
1a2f0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
1a300 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAltB = sqlite3V
1a310 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a320 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
1a330 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c  addrOutA);.  sql
1a340 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a350 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1a360 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  ddrA, addrEofA);
1a370 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a380 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  ;.  sqlite3VdbeG
1a390 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  oto(v, labelCmpr
1a3a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1a3b0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1a3c0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
1a3d0 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
1a3e0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
1a3f0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
1a400 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
1a410 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1a420 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1a430 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
1a440 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
1a450 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
1a460 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1a470 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
1a480 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
1a490 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
1a4a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a4b0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1a4c0 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1a4d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a4e0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1a4f0 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1a500 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1a510 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1a520 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e  e the case of A>
1a530 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
1a540 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1a550 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  gt-B subroutine"
1a560 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d  ));.  addrAgtB =
1a570 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1a580 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
1a590 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
1a5a0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
1a5b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a5c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1a5d0 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
1a5e0 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  OutB);.  }.  sql
1a5f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a600 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1a610 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  ddrB, addrEofB);
1a620 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a630 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  ;.  sqlite3VdbeG
1a640 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  oto(v, labelCmpr
1a650 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
1a660 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  de runs once to 
1a670 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79  initialize every
1a680 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71  thing..  */.  sq
1a690 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1a6a0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69  e(v, j1);.  sqli
1a6b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a6c0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a6d0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f  drA, addrEofA_no
1a6e0 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1a6f0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1a700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1a710 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1a720 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1a730 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1a740 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
1a750 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
1a760 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1a770 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a780 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1a790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a7a0 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
1a7b0 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
1a7c0 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
1a7d0 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
1a7e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a7f0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
1a800 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
1a810 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
1a820 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1a840 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
1a850 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
1a860 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1a870 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d  5(v, OPFLAG_PERM
1a880 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTE);.  sqlite3V
1a890 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a8a0 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
1a8b0 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
1a8c0 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  tB); VdbeCoverag
1a8d0 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  e(v);..  /* Jump
1a8e0 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
1a8f0 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
1a900 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
1a910 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
1a920 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a930 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
1a940 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
1a950 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
1a960 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
1a970 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1a980 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
1a990 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
1a9a0 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
1a9b0 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
1a9c0 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
1a9d0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
1a9e0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
1a9f0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
1aa00 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
1aa10 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  st);.  }..  /* R
1aa20 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
1aa30 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
1aa40 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
1aa50 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
1aa60 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
1aa70 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
1aa80 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
1aa90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
1aaa0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1aab0 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
1aac0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
1aad0 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  ior;.  pPrior->p
1aae0 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a  Next = p;..  /**
1aaf0 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73  * TBD:  Insert s
1ab00 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  ubroutine calls 
1ab10 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73  to close cursors
1ab20 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20   on incomplete. 
1ab30 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73   **** subqueries
1ab40 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e   ****/.  explain
1ab50 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
1ab60 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
1ab70 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74  iSub2, 0);.  ret
1ab80 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
1ab90 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  !=0;.}.#endif..#
1aba0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1abb0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1abc0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1abd0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1abe0 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61  /* Forward Decla
1abf0 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
1ac00 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1ac10 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45  List(sqlite3*, E
1ac20 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45  xprList*, int, E
1ac30 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
1ac40 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
1ac50 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c  ct(sqlite3*, Sel
1ac60 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72  ect *, int, Expr
1ac70 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  List *);../*.** 
1ac80 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
1ac90 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1aca0 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
1acb0 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
1acc0 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
1acd0 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
1ace0 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
1acf0 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
1ad00 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
1ad10 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
1ad20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1ad30 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
1ad40 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
1ad50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ad60 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1ad70 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
1ad80 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
1ad90 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
1ada0 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
1adb0 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
1adc0 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
1add0 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
1ade0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
1adf0 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
1ae00 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
1ae10 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
1ae20 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
1ae30 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
1ae40 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
1ae50 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
1ae60 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
1ae70 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
1ae80 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
1ae90 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
1aea0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1aeb0 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
1aec0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
1aed0 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
1aee0 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
1aef0 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
1af00 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
1af10 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1af20 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
1af30 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1af40 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
1af50 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
1af60 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
1af70 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
1af80 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
1af90 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
1afa0 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
1afb0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
1afc0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
1afd0 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
1afe0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1aff0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1b000 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1b010 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
1b020 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
1b030 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1b040 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1b050 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1b060 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1b070 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1b080 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
1b090 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
1b0a0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1b0b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1b0c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b0d0 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
1b0e0 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
1b0f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
1b100 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1b110 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
1b120 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1b130 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1b140 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1b150 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
1b160 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
1b170 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  w;.    }.  }else
1b180 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  {.    pExpr->pLe
1b190 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ft = substExpr(d
1b1a0 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
1b1b0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b1c0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
1b1d0 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  ght = substExpr(
1b1e0 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
1b1f0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b200 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1b210 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1b220 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1b230 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1b240 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
1b250 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  >x.pSelect, iTab
1b260 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
1b280 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b290 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
1b2a0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b2b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b2c0 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61  urn pExpr;.}.sta
1b2d0 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1b2e0 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
1b2f0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
1b300 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
1b310 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
1b320 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1b330 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
1b340 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1b350 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1b360 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
1b370 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1b380 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1b390 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
1b3a0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1b3b0 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
1b3c0 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
1b3d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b3e0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1b3f0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1b400 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1b410 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
1b420 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
1b430 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d  tExpr(db, pList-
1b440 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
1b450 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b460 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1b470 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73  substSelect(.  s
1b480 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1b490 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1b4a0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
1b4b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1b4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
1b4d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1b4e0 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1b4f0 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
1b500 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1b510 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1b520 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
1b530 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1b540 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
1b550 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
1b560 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
1b570 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
1b580 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1b590 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
1b5a0 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
1b5b0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1b5c0 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
1b5d0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b5e0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1b5f0 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
1b600 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b610 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
1b620 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
1b630 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
1b640 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67  t);.  p->pHaving
1b650 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b660 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
1b670 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b680 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
1b690 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
1b6a0 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
1b6b0 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c  ist);.  substSel
1b6c0 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ect(db, p->pPrio
1b6d0 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
1b6e0 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  t);.  pSrc = p->
1b6f0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1b700 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e  pSrc );  /* Even
1b710 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20   for (SELECT 1) 
1b720 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30  we have: pSrc!=0
1b730 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d   but pSrc->nSrc=
1b740 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  =0 */.  if( ALWA
1b750 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20  YS(pSrc) ){.    
1b760 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1b770 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1b780 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1b790 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1b7a0 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d  Select(db, pItem
1b7b0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
1b7c0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1b7d0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
1b7e0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
1b7f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1b800 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1b810 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
1b820 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
1b830 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1b840 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1b850 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1b860 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EW)./*.** This r
1b870 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
1b880 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
1b890 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66 6f  eries as a perfo
1b8a0 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74  rmance optimizat
1b8b0 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
1b8c0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69  tine returns 1 i
1b8d0 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
1b8e0 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
1b8f0 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73  lattening occurs
1b900 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
1b910 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
1b920 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
1b930 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
1b940 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
1b950 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1b960 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
1b970 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
1b980 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
1b990 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
1b9a0 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
1b9b0 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
1b9c0 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
1b9d0 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
1b9e0 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
1b9f0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1ba00 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
1ba10 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
1ba20 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
1ba30 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
1ba40 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
1ba50 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
1ba60 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
1ba70 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
1ba80 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
1ba90 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
1baa0 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
1bab0 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
1bac0 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
1bad0 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1bae0 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
1baf0 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
1bb00 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1bb10 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
1bb20 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
1bb30 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
1bb40 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
1bb50 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
1bb60 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1bb70 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1bb80 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
1bb90 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
1bba0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
1bbb0 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63  r this simplific
1bbc0 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
1bbd0 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
1bbe0 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
1bbf0 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
1bc00 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
1bc10 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
1bc20 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
1bc30 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
1bc40 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
1bc50 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
1bc60 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
1bc70 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
1bc80 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
1bc90 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
1bca0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
1bcb0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
1bcc0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
1bcd0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
1bce0 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
1bcf0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
1bd00 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
1bd10 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
1bd20 72 65 67 61 74 65 20 6f 72 20 28 32 61 29 20 74  regate or (2a) t
1bd30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1bd40 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20  s not a join.** 
1bd50 20 20 20 20 20 20 20 61 6e 64 20 28 32 62 29 20         and (2b) 
1bd60 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1bd70 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 75 62  does not use sub
1bd80 71 75 65 72 69 65 73 20 6f 74 68 65 72 20 74 68  queries other th
1bd90 61 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20  an the one.**   
1bda0 20 20 20 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65       FROM-clause
1bdb0 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69   subquery that i
1bdc0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
1bdd0 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28  r flattening.  (
1bde0 32 62 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  2b is.**        
1bdf0 64 75 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32  due to ticket [2
1be00 66 37 31 37 30 64 37 33 62 66 39 61 62 66 38 30  f7170d73bf9abf80
1be10 5d 20 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30  ] from 2015-02-0
1be20 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  9.).**.**   (3) 
1be30 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1be40 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   not the right o
1be50 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
1be60 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20   outer join.**  
1be70 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c        (Originall
1be80 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20  y ticket #306.  
1be90 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79 20  Strengthened by 
1bea0 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a  ticket #3300).**
1beb0 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
1bec0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
1bed0 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
1bee0 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69  (**)  At one poi
1bef0 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  nt restrictions 
1bf00 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69  (4) and (5) defi
1bf10 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20  ned a subset of 
1bf20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20  DISTINCT.**     
1bf30 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74     sub-queries t
1bf40 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65  hat were exclude
1bf50 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69  d from this opti
1bf60 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69  mization. Restri
1bf70 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20  ction .**       
1bf80 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62   (4) has since b
1bf90 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20  een expanded to 
1bfa0 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54  exclude all DIST
1bfb0 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e  INCT subqueries.
1bfc0 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
1bfd0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1bfe0 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
1bff0 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
1c000 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
1c010 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
1c020 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
1c030 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
1c040 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1c050 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
1c060 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
1c070 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
1c080 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
1c090 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f  dding a FROM clo
1c0a0 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63  se with the spec
1c0b0 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61  ial.**        ta
1c0c0 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20  ble sqlite_once 
1c0d0 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
1c0e0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f   a single row co
1c0f0 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20  ntaining a.**   
1c100 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c       single NULL
1c110 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
1c120 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c130 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1c140 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1c150 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
1c160 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
1c170 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1c180 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
1c190 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c1a0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
1c1b0 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
1c1c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1c1d0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30   Restriction (10
1c1e0 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72  ) was removed fr
1c1f0 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32  om the code on 2
1c200 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65  005-02-05 but we
1c210 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64  .**        accid
1c220 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68  ently carried th
1c230 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72  e comment forwar
1c240 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d  d until 2014-09-
1c250 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a  15.  Original.**
1c260 20 20 20 20 20 20 20 20 74 65 78 74 3a 20 22 54          text: "T
1c270 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c280 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1c290 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1c2a0 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20   query .**      
1c2b0 20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c    does not use L
1c2c0 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31  IMIT.".**.**  (1
1c2d0 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1c2e0 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
1c2f0 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1c300 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
1c310 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
1c320 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65  **)  Not impleme
1c330 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20  nted.  Subsumed 
1c340 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  into restriction
1c350 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69   (3).  Was previ
1c360 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ously.**        
1c370 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72  a separate restr
1c380 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20  iction deriving 
1c390 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30  from ticket #350
1c3a0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ..**.**  (13)  T
1c3b0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1c3c0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1c3d0 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1c3e0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1c3f0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c400 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
1c410 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54  ..**.**  (15)  T
1c420 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1c430 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
1c440 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
1c450 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
1c460 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1c470 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20  ot have a LIMIT 
1c480 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
1c490 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
1c4a0 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b  339 and ticket [
1c4b0 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a  02a8e81d44])..**
1c4c0 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f  .**  (16)  The o
1c4d0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1c4e0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
1c4f0 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64  r the subquery d
1c500 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f  oes.**        no
1c510 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
1c520 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
1c530 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
1c540 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
1c550 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
1c560 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
1c570 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
1c580 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
1c590 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71   (17)  The sub-q
1c5a0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f  uery is not a co
1c5b0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f  mpound select, o
1c5c0 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20  r it is a UNION 
1c5d0 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63  ALL .**        c
1c5e0 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d  ompound clause m
1c5f0 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20  ade up entirely 
1c600 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  of non-aggregate
1c610 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a   queries, and .*
1c620 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72  *        the par
1c630 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  ent query:.**.**
1c640 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1c650 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f  ot itself part o
1c660 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
1c670 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ect,.**         
1c680 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67   * is not an agg
1c690 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e  regate or DISTIN
1c6a0 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a  CT query, and.**
1c6b0 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1c6c0 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20  ot a join.**.** 
1c6d0 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
1c6e0 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
1c6f0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
1c700 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
1c710 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
1c720 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
1c730 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
1c740 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1c750 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
1c760 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
1c770 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
1c780 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
1c790 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
1c7a0 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1c7b0 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
1c7c0 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
1c7d0 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
1c7e0 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
1c7f0 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
1c800 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
1c810 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
1c820 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
1c830 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
1c840 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
1c850 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
1c860 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
1c870 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
1c880 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
1c890 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
1c8a0 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
1c8b0 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
1c8c0 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
1c8d0 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
1c8e0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1c8f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c900 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
1c910 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
1c920 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1c930 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
1c940 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
1c950 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
1c960 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
1c970 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
1c980 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
1c990 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
1c9a0 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
1c9b0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
1c9c0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1c9d0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1c9e0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
1c9f0 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
1ca00 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62  *        ORDER b
1ca10 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  y clause of the 
1ca20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
1ca30 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
1ca40 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
1ca50 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
1ca60 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
1ca70 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65  (19)  The subque
1ca80 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1ca90 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1caa0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
1cab0 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
1cac0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
1cad0 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
1cae0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1caf0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1cb00 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
1cb10 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
1cb20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
1cb30 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
1cb40 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
1cb50 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
1cb60 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
1cb70 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
1cb80 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
1cb90 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
1cba0 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
1cbb0 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
1cbc0 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
1cbd0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
1cbe0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1cbf0 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20    But we.**     
1cc00 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70     have other op
1cc10 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d  timizations in m
1cc20 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ind to deal with
1cc30 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a   that case..**.*
1cc40 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62  *  (21)  The sub
1cc50 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1cc60 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1cc70 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1cc80 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1cc90 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
1cca0 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
1ccb0 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
1ccc0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1ccd0 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1cce0 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29  CTE..**.**  (23)
1ccf0 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73 20    The parent is 
1cd00 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1cd10 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62 2d  CTE, or the sub-
1cd20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a  query is not a.*
1cd30 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
1cd40 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72 65  d query. This re
1cd50 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
1cd60 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
1cd70 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
1cd80 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
1cd90 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
1cda0 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
1cdb0 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
1cdc0 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
1cdd0 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
1cde0 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
1cdf0 32 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  24)  The subquer
1ce00 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1ce10 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20  egate that uses 
1ce20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
1ce30 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20  () or .**       
1ce40 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
1ce50 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74  ons.  (Without t
1ce60 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c  his restriction,
1ce70 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a   a query like:.*
1ce80 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  *        "SELECT
1ce90 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
1cea0 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74  max(y), x FROM t
1ceb0 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65  1)" would not ne
1cec0 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20  cessarily.**    
1ced0 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76      return the v
1cee0 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68  alue X for which
1cef0 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29   Y was maximal.)
1cf00 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  .**.**.** In thi
1cf10 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
1cf20 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
1cf30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1cf40 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
1cf50 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1cf60 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
1cf70 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
1cf80 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
1cf90 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
1cfa0 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
1cfb0 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
1cfc0 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1cfd0 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1cfe0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
1cff0 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
1d000 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
1d010 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1d020 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
1d030 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1d040 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
1d050 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1d060 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
1d070 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1d080 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
1d090 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
1d0a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
1d0b0 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
1d0c0 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
1d0d0 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
1d0e0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
1d0f0 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
1d100 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1d110 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1d120 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1d130 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1d140 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
1d150 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
1d160 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
1d170 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
1d180 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
1d190 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
1d1a0 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
1d1b0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
1d1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d1d0 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
1d1e0 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
1d1f0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
1d200 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
1d210 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
1d220 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1d230 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1d240 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
1d250 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
1d260 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
1d270 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1d280 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
1d290 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74  Parent;.  Select
1d2a0 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
1d2b0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
1d2c0 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
1d2d0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1d2e0 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
1d2f0 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
1d300 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
1d310 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
1d320 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
1d330 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1d340 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1d350 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
1d360 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
1d370 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1d380 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1d390 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
1d3a0 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
1d3b0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1d3c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d3d0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
1d3e0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
1d3f0 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
1d400 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
1d410 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
1d420 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
1d430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1d440 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1d450 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d470 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1d480 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1d490 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d4a0 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
1d4b0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1d4c0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1d4d0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
1d4e0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1d4f0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1d500 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
1d510 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
1d520 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
1d530 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1d540 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20  Prior==0 );  /* 
1d550 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65  Unable to flatte
1d560 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69  n compound queri
1d570 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  es */.  if( Opti
1d580 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1d590 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
1d5a0 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
1d5b0 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
1d5c0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
1d5d0 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
1d5e0 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
1d5f0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
1d600 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
1d610 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
1d620 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
1d630 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
1d640 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1d650 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
1d660 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
1d670 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1d680 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
1d690 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d6c0 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 20 2a  triction (1)   *
1d6d0 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
1d6e0 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
1d6f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d710 73 74 72 69 63 74 69 6f 6e 20 28 32 61 29 20 20  striction (2a)  
1d720 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  */.    if( (p->p
1d730 57 68 65 72 65 20 26 26 20 45 78 70 72 48 61 73  Where && ExprHas
1d740 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 57 68 65  Property(p->pWhe
1d750 72 65 2c 45 50 5f 53 75 62 71 75 65 72 79 29 29  re,EP_Subquery))
1d760 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  .     || (sqlite
1d770 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
1d780 2d 3e 70 45 4c 69 73 74 29 20 26 20 45 50 5f 53  ->pEList) & EP_S
1d790 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20  ubquery)!=0.    
1d7a0 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72   || (sqlite3Expr
1d7b0 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72  ListFlags(p->pOr
1d7c0 64 65 72 42 79 29 20 26 20 45 50 5f 53 75 62 71  derBy) & EP_Subq
1d7d0 75 65 72 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a  uery)!=0.    ){.
1d7e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d810 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d820 72 69 63 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f  riction (2b)  */
1d830 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a  .    }.  }.    .
1d840 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
1d850 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1d860 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
1d870 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
1d880 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
1d890 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1d8a0 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
1d8b0 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
1d8c0 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
1d8d0 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61  xpressions, we a
1d8e0 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
1d8f0 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
1d900 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1d910 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
1d920 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
1d930 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
1d940 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
1d950 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1d960 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
1d970 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
1d980 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
1d990 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
1d9a0 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
1d9b0 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
1d9c0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1d9d0 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
1d9e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d9f0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1da00 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
1da10 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74  b->pOffset ) ret
1da20 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da40 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1da50 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  14) */.  if( (p-
1da60 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
1da70 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70  ompound)!=0 && p
1da80 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
1da90 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dad0 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
1dae0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
1daf0 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
1db00 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1db10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1db20 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
1db30 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
1db40 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1db50 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
1db60 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1db70 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20  estriction (5)  
1db80 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1db90 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
1dba0 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
1dbb0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1dbc0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1dbd0 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
1dbe0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
1dbf0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1dc00 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26  _Distinct)!=0 &&
1dc10 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1dc20 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1dc30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dc40 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
1dc50 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
1dc60 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
1dc70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1dc80 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1dcc0 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (11) */.  }. 
1dcd0 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53   if( isAgg && pS
1dce0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
1dcf0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1dd00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dd10 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20  iction (16) */. 
1dd20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1dd30 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29  t && p->pWhere )
1dd40 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1dd50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dd60 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20  iction (19) */. 
1dd70 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1dd80 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
1dd90 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1dda0 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
1ddb0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1ddc0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31   Restriction (21
1ddd0 29 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63  ) */.  }.  testc
1dde0 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c  ase( pSub->selFl
1ddf0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
1de00 76 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ve );.  testcase
1de10 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1de20 20 26 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20   & SF_MinMaxAgg 
1de30 29 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  );.  if( pSub->s
1de40 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65  elFlags & (SF_Re
1de50 63 75 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61  cursive|SF_MinMa
1de60 78 41 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74  xAgg) ){.    ret
1de70 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
1de80 63 74 69 6f 6e 73 20 28 32 32 29 20 61 6e 64 20  ctions (22) and 
1de90 28 32 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (24) */.  }.  if
1dea0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1deb0 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26   SF_Recursive) &
1dec0 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  & pSub->pPrior )
1ded0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1dee0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1def0 32 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  23) */.  }..  /*
1df00 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1df10 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 1:.  ** Restri
1df20 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
1df30 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
1df40 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
1df50 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
1df60 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
1df70 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1df80 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
1df90 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
1dfa0 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
1dfb0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
1dfc0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1dfd0 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
1dfe0 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
1dff0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
1e000 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
1e010 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
1e020 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
1e030 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
1e040 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
1e050 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
1e060 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
1e070 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
1e080 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f  ..  **.  ** OBSO
1e090 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a  LETE COMMENT 2:.
1e0a0 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
1e0b0 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
1e0c0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1e0d0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1e0e0 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
1e0f0 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
1e100 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
1e110 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1e120 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
1e130 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
1e140 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1e150 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1e160 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1e170 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
1e180 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
1e190 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
1e1a0 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
1e1b0 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
1e1c0 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
1e1d0 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
1e1e0 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
1e1f0 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
1e200 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
1e210 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
1e220 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
1e230 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
1e240 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
1e250 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
1e260 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
1e270 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
1e280 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53  ..  **.  ** THIS
1e290 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c   OVERRIDES OBSOL
1e2a0 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41  ETE COMMENTS 1 A
1e2b0 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a  ND 2 ABOVE:.  **
1e2c0 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68   Ticket #3300 sh
1e2d0 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ows that flatten
1e2e0 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65  ing the right te
1e2f0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1e300 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68  N.  ** is fraugh
1e310 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20  t with danger.  
1e320 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  Best to avoid th
1e330 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20  e whole thing.  
1e340 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  If the.  ** subq
1e350 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1e360 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
1e370 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e   JOIN, then do n
1e380 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f  ot flatten..  */
1e390 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
1e3a0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
1e3b0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
1e3c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e3d0 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
1e3e0 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73  ion 17: If the s
1e3f0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1e400 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1e410 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1e420 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1e430 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1e440 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1e450 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1e460 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1e470 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1e480 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1e490 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1e4a0 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1e4b0 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1e4c0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1e4d0 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1e4e0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1e4f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1e500 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1e510 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20  triction 20 */. 
1e520 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
1e530 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
1e540 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1e550 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
1e560 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
1e570 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1e580 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
1e590 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
1e5a0 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
1e5b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e5c0 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1e5d0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1e5e0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1e5f0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
1e600 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1e610 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1e620 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1e630 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1e640 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
1e650 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1e660 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
1e670 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1e680 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
1e690 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
1e6a0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69  nExpr );.      i
1e6b0 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
1e6c0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1e6d0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1e6e0 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  )!=0.       || (
1e6f0 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26  pSub1->pPrior &&
1e700 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41   pSub1->op!=TK_A
1e710 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  LL) .       || p
1e720 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1e730 3c 31 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  <1.      ){.    
1e740 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e750 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
1e760 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72  case( pSub1->pSr
1e770 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20  c->nSrc>1 );.   
1e780 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
1e790 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20  iction 18. */.  
1e7a0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1e7b0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
1e7c0 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
1e7d0 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
1e7e0 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
1e7f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1e800 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
1e810 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
1e820 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e830 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e840 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
1e850 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1e860 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
1e870 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
1e880 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  */.  SELECTTRACE
1e890 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c  (1,pParse,p,("fl
1e8a0 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d  atten %s.%p from
1e8b0 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20   term %d\n",.   
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20  pSub->zSelName, 
1e8e0 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a  pSub, iFrom));..
1e8f0 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74    /* Authorize t
1e900 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1e910 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1e920 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d  ntext = pSubitem
1e930 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f  ->zName;.  TESTO
1e940 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33  NLY(i =) sqlite3
1e950 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1e960 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
1e970 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73   0, 0, 0);.  tes
1e980 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45  tcase( i==SQLITE
1e990 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73  _DENY );.  pPars
1e9a0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1e9b0 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
1e9c0 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ext;..  /* If th
1e9d0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1e9e0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1e9f0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
1ea00 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e   (by restriction
1ea10 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38  s.  ** 17 and 18
1ea20 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20   above) it must 
1ea30 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  be a UNION ALL a
1ea40 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  nd the parent qu
1ea50 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62  ery must .  ** b
1ea60 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  e of the form:. 
1ea70 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1ea80 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20  ECT <expr-list> 
1ea90 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79  FROM (<sub-query
1eaa0 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65  >) <where-clause
1eab0 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c  > .  **.  ** fol
1eac0 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44  lowed by any ORD
1ead0 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64  ER BY, LIMIT and
1eae0 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73  /or OFFSET claus
1eaf0 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20  es. This block. 
1eb00 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20   ** creates N-1 
1eb10 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
1eb20 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
1eb30 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
1eb40 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
1eb50 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
1eb60 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
1eb70 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
1eb80 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
1eb90 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
1eba0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1ebb0 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
1ebc0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1ebd0 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
1ebe0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1ebf0 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
1ec00 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
1ec10 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  *.  ** Example:.
1ec20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1ec30 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a  LECT a+1 FROM (.
1ec40 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1ec50 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT x FROM tab.  
1ec60 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1ec70 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1ec80 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61  SELECT y FROM ta
1ec90 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
1eca0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1ecb0 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
1ecc0 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20  *2) FROM tab2.  
1ecd0 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61  **     ) WHERE a
1ece0 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20  !=5 ORDER BY 1. 
1ecf0 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f   **.  ** Transfo
1ed00 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rmed into:.  **.
1ed10 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1ed20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  x+1 FROM tab WHE
1ed30 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE x+1!=5.  **  
1ed40 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1ed50 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31  *     SELECT y+1
1ed60 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1ed70 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  y+1!=5.  **     
1ed80 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1ed90 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
1eda0 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57  2)+1 FROM tab2 W
1edb0 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21  HERE abs(z*2)+1!
1edc0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45  =5.  **     ORDE
1edd0 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
1ede0 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68   We call this th
1edf0 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71  e "compound-subq
1ee00 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22  uery flattening"
1ee10 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75  ..  */.  for(pSu
1ee20 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  b=pSub->pPrior; 
1ee30 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d  pSub; pSub=pSub-
1ee40 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65  >pPrior){.    Se
1ee50 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  lect *pNew;.    
1ee60 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1ee70 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1ee80 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d  ;.    Expr *pLim
1ee90 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
1eea0 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65      Expr *pOffse
1eeb0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
1eec0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69      Select *pPri
1eed0 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
1eee0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1eef0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  = 0;.    p->pSrc
1ef00 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72   = 0;.    p->pPr
1ef10 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ior = 0;.    p->
1ef20 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
1ef30 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
1ef40 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1ef50 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
1ef60 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
1ef70 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
1ef80 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c  pNew, pSub->zSel
1ef90 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  Name);.    p->pO
1efa0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
1efb0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
1efc0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
1efd0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1efe0 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
1eff0 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
1f000 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
1f010 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1f020 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
1f030 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
1f040 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
1f050 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1f060 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
1f070 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
1f080 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
1f090 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
1f0a0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
1f0b0 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
1f0c0 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
1f0d0 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20  arse,p,.        
1f0e0 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   ("compound-subq
1f0f0 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63  uery flattener c
1f100 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20  reates %s.%p as 
1f110 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  peer\n",.       
1f120 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1f130 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a  , pNew));.    }.
1f140 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1f150 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1f160 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
1f170 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
1f180 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
1f190 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1f1a0 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
1f1b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1f1c0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
1f1d0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
1f1e0 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
1f1f0 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
1f200 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1f210 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
1f220 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1f230 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1f240 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f250 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1f260 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
1f270 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1f280 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
1f290 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f2a0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
1f2b0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
1f2c0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
1f2d0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
1f2e0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1f2f0 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
1f300 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
1f310 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
1f320 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
1f330 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
1f340 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1f350 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
1f360 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
1f370 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
1f380 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
1f390 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
1f3a0 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
1f3b0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
1f3c0 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
1f3d0 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
1f3e0 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
1f3f0 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
1f400 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
1f410 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
1f420 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
1f430 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
1f440 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
1f450 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
1f460 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
1f470 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1f480 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
1f490 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
1f4a0 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65  ( pTabToDel->nRe
1f4b0 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
1f4c0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1f4d0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1f4e0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1f4f0 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1f500 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
1f510 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1f520 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
1f530 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1f540 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
1f550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f560 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
1f570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
1f580 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
1f590 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1f5a0 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
1f5b0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1f5c0 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
1f5d0 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
1f5e0 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
1f5f0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
1f600 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
1f610 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
1f620 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
1f630 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
1f640 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
1f650 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1f660 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
1f670 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
1f680 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
1f690 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
1f6a0 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
1f6b0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
1f6c0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
1f6d0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1f6e0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
1f6f0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1f700 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
1f710 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
1f720 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
1f730 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
1f740 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
1f750 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
1f760 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
1f770 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
1f780 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
1f790 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
1f7a0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
1f7b0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
1f7c0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
1f7d0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
1f7e0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
1f7f0 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
1f800 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
1f810 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
1f820 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
1f830 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
1f840 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
1f850 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
1f860 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
1f870 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
1f880 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
1f890 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
1f8a0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1f8b0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
1f8c0 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
1f8d0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
1f8e0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1f8f0 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
1f900 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
1f910 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
1f920 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
1f930 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1f940 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
1f950 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
1f960 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
1f970 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
1f980 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1f990 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f9a0 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
1f9b0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1f9c0 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
1f9d0 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
1f9e0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1f9f0 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
1fa00 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66  pe = pSubitem->f
1fa10 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
1fa20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1fa30 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
1fa40 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
1fa50 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
1fa60 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1fa70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
1fa80 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1fa90 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1faa0 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
1fab0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
1fac0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
1fad0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1fae0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1faf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fb00 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1fb10 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
1fb20 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
1fb30 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
1fb40 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1fb50 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
1fb60 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1fb70 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
1fb80 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
1fb90 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
1fba0 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
1fbb0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1fbc0 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
1fbd0 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
1fbe0 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
1fbf0 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1fc00 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
1fc10 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1fc20 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
1fc30 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
1fc40 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
1fc50 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
1fc60 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1fc70 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1fc80 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
1fc90 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
1fca0 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
1fcb0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1fcc0 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
1fcd0 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
1fce0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
1fcf0 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
1fd00 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
1fd10 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
1fd20 74 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f  t query to 4 slo
1fd30 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a  ts.  The middle.
1fd40 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65      ** slot is e
1fd50 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
1fd60 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
1fd70 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1fd80 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65  the.    ** two e
1fd90 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
1fda0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1fdb0 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
1fdc0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
1fdd0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
1fde0 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
1fdf0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
1fe00 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1fe10 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
1fe20 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
1fe30 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1fe40 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
1fe50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1fe60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
1fe70 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
1fe80 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
1fe90 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
1fea0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
1feb0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
1fec0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1fed0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
1fee0 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
1fef0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
1ff00 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
1ff10 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72  sing);.      pSr
1ff20 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
1ff30 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
1ff40 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
1ff50 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
1ff60 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
1ff70 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
1ff80 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
1ff90 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  fg.jointype = jo
1ffa0 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f  intype;.  .    /
1ffb0 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
1ffc0 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
1ffd0 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
1ffe0 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
1fff0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
20000 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
20010 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
20020 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  y..    ** .    *
20030 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
20040 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
20050 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
20060 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
20070 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
20080 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
20090 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  .    **   \     
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200b0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
200c0 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
200d0 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
200e0 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f     **    \______
200f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
20100 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
20110 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20120 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20  __________/.    
20130 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f  **.    ** We loo
20140 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
20150 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
20160 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
20170 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
20180 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75      ** "a" we su
20190 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
201a0 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
201b0 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
201c0 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
201d0 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74      */.    pList
201e0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69   = pParent->pELi
201f0 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
20200 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
20210 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
20220 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
20230 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
20240 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
20250 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
20260 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  b, pList->a[i].z
20270 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  Span);.        s
20280 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
20290 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ame);.        pL
202a0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
202b0 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  = zName;.      }
202c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74  .    }.    subst
202d0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
202e0 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50  rent->pEList, iP
202f0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
20300 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ist);.    if( is
20310 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62  Agg ){.      sub
20320 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
20330 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
20340 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
20350 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
20360 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20370 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
20380 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
20390 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
203a0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
203b0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
203c0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
203d0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
203e0 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20  t, any non-zero 
203f0 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75  iOrderByCol valu
20400 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  es indicate that
20410 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52   the.      ** OR
20420 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78  DER BY column ex
20430 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e  pression is iden
20440 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72  tical to the iOr
20450 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20  derByCol'th.    
20460 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
20470 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
20480 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75  CT statement pSu
20490 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76  b. Since these v
204a0 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64  alues.      ** d
204b0 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  o not necessaril
204c0 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  y correspond to 
204d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43  columns in SELEC
204e0 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72  T statement pPar
204f0 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65  ent,.      ** ze
20500 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74  ro them before t
20510 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f  ransfering the O
20520 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
20530 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
20540 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73  * Not doing this
20550 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72   may cause an er
20560 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75  ror if a subsequ
20570 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ent call to this
20580 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
20590 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  on attempts to f
205a0 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e  latten a compoun
205b0 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f  d sub-query into
205c0 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a   pParent.      *
205d0 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  * (the only way 
205e0 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
205f0 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75  is if the compou
20600 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a  nd sub-query is.
20610 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
20620 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d  ly part of pSub-
20630 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b  >pSrc). See tick
20640 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e  et [d11a6e908f].
20650 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
20660 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
20670 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
20680 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
20690 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
206a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
206b0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
206c0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
206d0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
206e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
206f0 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
20700 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20710 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  pSub->pPrior==0 
20720 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
20730 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
20740 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
20750 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
20760 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
20770 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
20780 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
20790 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
207a0 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
207b0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
207c0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
207d0 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
207e0 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
207f0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
20800 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
20810 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
20820 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
20830 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
20840 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
20850 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
20860 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
20870 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
20880 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20890 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
208a0 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
208b0 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
208c0 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
208d0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
208e0 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
208f0 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
20900 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
20910 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
20920 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
20930 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
20940 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
20950 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20980 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
20990 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
209a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
209b0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
209c0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
209d0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
209e0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
209f0 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
20a00 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
20a10 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
20a20 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
20a30 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
20a40 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
20a50 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
20a60 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
20a70 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
20a80 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
20a90 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
20aa0 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
20ab0 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
20ac0 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
20ad0 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
20ae0 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
20af0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
20b00 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
20b10 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
20b20 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
20b30 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
20b40 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
20b50 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
20b60 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
20b70 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
20b80 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
20b90 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
20ba0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
20bb0 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
20bc0 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
20bd0 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
20be0 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
20bf0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
20c00 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
20c10 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
20c20 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
20c30 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
20c40 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
20c50 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
20c60 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
20c70 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
20c80 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
20c90 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
20ca0 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
20cb0 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
20cc0 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
20cd0 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
20ce0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
20cf0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
20d00 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
20d10 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
20d20 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
20d30 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
20d40 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
20d50 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
20d60 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e  "After flattenin
20d70 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  g:\n"));.    sql
20d80 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
20d90 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
20da0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
20db0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
20dc0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
20dd0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
20de0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
20df0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
20e00 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ....#if !defined
20e10 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
20e20 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
20e30 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
20e40 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  IEW)./*.** Make 
20e50 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61  copies of releva
20e60 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
20e70 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74  terms of the out
20e80 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a  er query into.**
20e90 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
20ea0 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20  e of subquery.  
20eb0 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
20ec0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
20ed0 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20  (SELECT a AS x, 
20ee0 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c-d AS y FROM t1
20ef0 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20  ) WHERE x=5 AND 
20f00 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e  y=10;.**.** Tran
20f10 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a  sformed into:.**
20f20 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
20f30 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
20f40 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
20f50 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20  OM t1 WHERE a=5 
20f60 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20  AND c-d=10).**  
20f70 20 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44     WHERE x=5 AND
20f80 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65   y=10;.**.** The
20f90 20 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68   hope is that th
20fa0 65 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f  e terms added to
20fb0 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   the inner query
20fc0 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f   will make it mo
20fd0 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e  re.** efficient.
20fe0 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74  .**.** Do not at
20ff0 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d  tempt this optim
21000 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a  ization if:.**.*
21010 2a 20 20 20 28 31 29 20 54 68 65 20 69 6e 6e 65  *   (1) The inne
21020 72 20 71 75 65 72 79 20 69 73 20 61 6e 20 61 67  r query is an ag
21030 67 72 65 67 61 74 65 2e 20 20 28 49 6e 20 74 68  gregate.  (In th
21040 61 74 20 63 61 73 65 2c 20 77 65 27 64 20 72 65  at case, we'd re
21050 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20  ally want.**    
21060 20 20 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f     to copy the o
21070 75 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73  uter WHERE-claus
21080 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65  e terms onto the
21090 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f   HAVING clause o
210a0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69  f the.**       i
210b0 6e 6e 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  nner query.  But
210c0 20 74 68 65 79 20 70 72 6f 62 61 62 6c 79 20 77   they probably w
210d0 6f 6e 27 74 20 68 65 6c 70 20 74 68 65 72 65 20  on't help there 
210e0 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72  so do not bother
210f0 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54  .).**.**   (2) T
21100 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
21110 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
21120 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e  part of a common
21130 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f   table expressio
21140 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54  n..**.**   (3) T
21150 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68  he inner query h
21160 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
21170 65 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61  e (since the cha
21180 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52  nges to the WHER
21190 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65  E.**       close
211a0 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68   would change th
211b0 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
211c0 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20   LIMIT)..**.**  
211d0 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (4) The inner q
211e0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
211f0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c  t operand of a L
21200 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20  EFT JOIN.  (The 
21210 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20  caller.**       
21220 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72 65  enforces this re
21230 73 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65 20  striction since 
21240 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  this routine doe
21250 73 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75 67  s not have enoug
21260 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f 72  h.**       infor
21270 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29  mation to know.)
21280 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65  .**.**   (5) The
21290 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
212a0 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61  pression origina
212b0 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  tes in the ON or
212c0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a   USING clause.**
212d0 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54         of a LEFT
212e0 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   JOIN..**.** Ret
212f0 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e  urn 0 if no chan
21300 67 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64  ges are made and
21310 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65   non-zero if one
21320 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63   or more WHERE c
21330 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61  lause.** terms a
21340 72 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e  re duplicated in
21350 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  to the subquery.
21360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
21370 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
21380 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
21390 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
213a0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
213b0 63 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c 6f  ction (for mallo
213c0 63 28 29 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74  c()) */.  Select
213d0 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20   *pSubq,        
213e0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
213f0 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75  whose WHERE clau
21400 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d  se is to be augm
21410 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ented */.  Expr 
21420 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
21430 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
21440 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
21450 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
21460 20 69 43 75 72 73 6f 72 20 20 20 20 20 20 20 20   iCursor        
21470 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
21480 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75  ber of the subqu
21490 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ery */.){.  Expr
214a0 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43   *pNew;.  int nC
214b0 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  hng = 0;.  if( p
214c0 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72  Where==0 ) retur
214d0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62  n 0;.  if( (pSub
214e0 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  q->selFlags & (S
214f0 46 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52  F_Aggregate|SF_R
21500 65 63 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b  ecursive))!=0 ){
21510 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
21520 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  /* restrictions 
21530 28 31 29 20 61 6e 64 20 28 32 29 20 2a 2f 0a 20  (1) and (2) */. 
21540 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e   }.  if( pSubq->
21550 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20  pLimit!=0 ){.   
21560 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
21570 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a  estriction (3) *
21580 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  /.  }.  while( p
21590 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  Where->op==TK_AN
215a0 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b  D ){.    nChng +
215b0 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  = pushDownWhereT
215c0 65 72 6d 73 28 64 62 2c 20 70 53 75 62 71 2c 20  erms(db, pSubq, 
215d0 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20  pWhere->pRight, 
215e0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57  iCursor);.    pW
215f0 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70  here = pWhere->p
21600 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Left;.  }.  if( 
21610 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
21620 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f  pWhere,EP_FromJo
21630 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  in) ) return 0; 
21640 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 35  /* restriction 5
21650 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
21660 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
21670 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75  tant(pWhere, iCu
21680 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68  rsor) ){.    nCh
21690 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28  ng++;.    while(
216a0 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20   pSubq ){.      
216b0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
216c0 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65  prDup(db, pWhere
216d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
216e0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
216f0 20 70 4e 65 77 2c 20 69 43 75 72 73 6f 72 2c 20   pNew, iCursor, 
21700 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 29 3b 0a  pSubq->pEList);.
21710 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68        pSubq->pWh
21720 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
21730 72 41 6e 64 28 64 62 2c 20 70 53 75 62 71 2d 3e  rAnd(db, pSubq->
21740 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
21750 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75       pSubq = pSu
21760 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  bq->pPrior;.    
21770 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
21780 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Chng;.}.#endif /
21790 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
217a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
217b0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
217c0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
217d0 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f  /../*.** Based o
217e0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
217f0 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  f the AggInfo st
21800 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
21810 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a  d by the first.*
21820 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73  * argument, this
21830 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
21840 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
21850 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
21860 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79  *    * the query
21870 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61   contains just a
21880 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74   single aggregat
21890 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20  e function,.**  
218a0 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74    * the aggregat
218b0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69  e function is ei
218c0 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61  ther min() or ma
218d0 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a  x(), and.**    *
218e0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
218f0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
21900 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c  unction is a col
21910 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  umn value..**.**
21920 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
21930 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74  bove are true, t
21940 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  hen WHERE_ORDERB
21950 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
21960 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73  RDERBY_MAX.** is
21970 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70   returned as app
21980 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20  ropriate. Also, 
21990 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
219a0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
219b0 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67   .** list of arg
219c0 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
219d0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62   the aggregate b
219e0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
219f0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
21a00 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  e conditions abo
21a10 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20  ve are not met, 
21a20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
21a30 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45   to 0 and.** WHE
21a40 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
21a50 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
21a60 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d  /.static u8 minM
21a70 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20  axQuery(AggInfo 
21a80 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c  *pAggInfo, ExprL
21a90 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b  ist **ppMinMax){
21aa0 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48  .  int eRet = WH
21ab0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
21ac0 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  AL;          /* 
21ad0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
21ae0 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30  .  *ppMinMax = 0
21af0 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
21b00 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20  ->nFunc==1 ){.  
21b10 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
21b20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
21b30 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67  0].pExpr; /* Agg
21b40 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
21b50 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
21b60 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d  *pEList = pExpr-
21b70 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f  >x.pList;      /
21b80 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  * Arguments to a
21b90 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  gg function */..
21ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
21bb0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
21bc0 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  NCTION );.    if
21bd0 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
21be0 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20  st->nExpr==1 && 
21bf0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
21c00 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
21c10 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63  OLUMN ){.      c
21c20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
21c30 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
21c40 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  en;.      if( sq
21c50 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
21c60 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
21c70 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
21c80 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
21c90 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  N;.        *ppMi
21ca0 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
21cb0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
21cc0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
21cd0 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29  unc, "max")==0 )
21ce0 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
21cf0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
21d00 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  AX;.        *ppM
21d10 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
21d20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21d30 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  }..  assert( *pp
21d40 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70  MinMax==0 || (*p
21d50 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d  pMinMax)->nExpr=
21d60 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
21d70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
21d80 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
21d90 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
21da0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
21db0 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
21dc0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
21dd0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
21de0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
21df0 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
21e00 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
21e10 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
21e20 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
21e30 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
21e40 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
21e50 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
21e60 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
21e70 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
21e80 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
21e90 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
21ea0 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
21eb0 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
21ec0 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
21ed0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
21ee0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
21ef0 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
21f00 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
21f10 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
21f20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
21f30 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
21f40 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
21f50 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
21f60 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
21f70 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
21f80 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
21f90 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
21fa0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
21fb0 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
21fc0 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
21fd0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
21fe0 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
21ff0 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
22000 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
22010 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
22020 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
22030 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
22040 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
22050 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
22060 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
22070 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
22080 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
22090 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
220a0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
220b0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
220c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
220d0 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f  ( NEVER(pAggInfo
220e0 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65  ->nFunc==0) ) re
220f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
22100 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
22110 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ].pFunc->funcFla
22120 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
22130 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
22140 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
22150 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
22160 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
22170 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
22180 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
22190 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
221a0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
221b0 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
221c0 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
221d0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
221e0 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
221f0 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
22200 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
22210 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
22220 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
22230 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
22240 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
22250 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
22260 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
22270 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
22280 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
22290 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
222a0 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
222b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
222c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
222d0 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
222e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
222f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22300 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
22310 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
22320 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  From->fg.isIndex
22330 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c  edBy ){.    Tabl
22340 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
22350 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
22360 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46  *zIndexedBy = pF
22370 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  rom->u1.zIndexed
22380 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  By;.    Index *p
22390 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
223a0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
223b0 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
223c0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
223d0 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
223e0 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20  dexedBy); .     
223f0 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
22400 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
22410 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
22420 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
22430 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
22440 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
22450 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20  IndexedBy, 0);. 
22460 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
22470 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
22480 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22490 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
224a0 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64     pFrom->pIBInd
224b0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
224c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
224d0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
224e0 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
224f0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
22500 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
22510 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
22520 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
22530 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
22540 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
22550 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
22560 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
22570 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
22580 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
22590 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
225a0 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
225b0 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
225c0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
225d0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
225e0 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
225f0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
22600 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
22610 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
22620 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
22630 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
22640 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
22650 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
22660 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
22670 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
22680 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
22690 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
226a0 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
226b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
226c0 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
226d0 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
226e0 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
226f0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
22700 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
22710 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
22720 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
22730 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
22740 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
22750 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
22760 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
22770 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
22780 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
22790 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
227a0 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
227b0 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
227c0 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
227d0 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
227e0 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
227f0 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
22800 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
22810 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
22820 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
22830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22840 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
22850 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
22860 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
22870 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
22880 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
22890 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
228a0 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
228b0 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
228c0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
228d0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
228e0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
228f0 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
22900 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  ;..  if( p->pPri
22910 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  or==0 ) return W
22920 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  RC_Continue;.  i
22930 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
22940 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
22950 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70  ontinue;.  for(p
22960 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e  X=p; pX && (pX->
22970 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58  op==TK_ALL || pX
22980 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  ->op==TK_SELECT)
22990 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
229a0 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29  {}.  if( pX==0 )
229b0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
229c0 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70  inue;.  a = p->p
229d0 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f  OrderBy->a;.  fo
229e0 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d  r(i=p->pOrderBy-
229f0 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nExpr-1; i>=0; 
22a00 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  i--){.    if( a[
22a10 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  i].pExpr->flags 
22a20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62  & EP_Collate ) b
22a30 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
22a40 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  i<0 ) return WRC
22a50 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a  _Continue;..  /*
22a60 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
22a70 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
22a80 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72  ans the transfor
22a90 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  mation is requir
22aa0 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ed. */..  pParse
22ab0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
22ac0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
22ad0 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
22ae0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
22af0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
22b00 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
22b10 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
22b20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d  WRC_Abort;.  mem
22b30 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73  set(&dummy, 0, s
22b40 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20  izeof(dummy));. 
22b50 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74   pNewSrc = sqlit
22b60 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
22b70 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
22b80 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77  ,0,0,&dummy,pNew
22b90 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65  ,0,0);.  if( pNe
22ba0 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  wSrc==0 ) return
22bb0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70   WRC_Abort;.  *p
22bc0 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70  New = *p;.  p->p
22bd0 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20  Src = pNewSrc;. 
22be0 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c   p->pEList = sql
22bf0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
22c00 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
22c10 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
22c20 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e  _ALL, 0));.  p->
22c30 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
22c40 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b    p->pWhere = 0;
22c50 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
22c60 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  y = 0;.  pNew->p
22c70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e  Having = 0;.  pN
22c80 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ew->pOrderBy = 0
22c90 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  ;.  p->pPrior = 
22ca0 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  0;.  p->pNext = 
22cb0 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20  0;.  p->pWith = 
22cc0 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  0;.  p->selFlags
22cd0 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64   &= ~SF_Compound
22ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
22cf0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
22d00 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20  nverted)==0 );. 
22d10 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
22d20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  SF_Converted;.  
22d30 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50  assert( pNew->pP
22d40 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65  rior!=0 );.  pNe
22d50 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  w->pPrior->pNext
22d60 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d   = pNew;.  pNew-
22d70 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
22d80 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30  New->pOffset = 0
22d90 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
22da0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e  ontinue;.}..#ifn
22db0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22dc0 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
22dd0 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
22de0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
22df0 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
22e00 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
22e10 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
22e20 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
22e30 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
22e40 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
22e50 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
22e60 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
22e70 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
22e80 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
22e90 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
22ea0 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
22eb0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
22ec0 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
22ed0 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
22ee0 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
22ef0 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
22f00 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
22f10 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73  e is returned, s
22f20 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f  et *ppContext to
22f30 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69   point to the Wi
22f40 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  th.** object tha
22f50 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43  t the returned C
22f60 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a  TE belongs to..*
22f70 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
22f80 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
22f90 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 75     /* Current ou
22fc0 74 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  termost WITH cla
22fd0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
22fe0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
22ff0 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d  tem,     /* FROM
23000 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
23010 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
23020 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74  With **ppContext
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23040 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61  /* OUT: WITH cla
23050 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  use return value
23060 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29   belongs to */.)
23070 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
23080 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74  zName;.  if( pIt
23090 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
230a0 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74   && (zName = pIt
230b0 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  em->zName)!=0 ){
230c0 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20  .    With *p;.  
230d0 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70    for(p=pWith; p
230e0 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a  ; p=p->pOuter){.
230f0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
23100 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
23110 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
23120 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
23130 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
23140 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
23150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
23160 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20  pContext = p;.  
23170 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26          return &
23180 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  p->a[i];.       
23190 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
231a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
231b0 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20  .}../* The code 
231c0 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61  generator mainta
231d0 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61  ins a stack of a
231e0 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73  ctive WITH claus
231f0 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  es.** with the i
23200 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63  nner-most WITH c
23210 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74  lause being at t
23220 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
23230 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
23240 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74  routine pushes t
23250 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70  he WITH clause p
23260 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
23270 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
23280 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  onto the top of 
23290 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72  the stack. If ar
232a0 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20  gument bFree is 
232b0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  true, then this.
232c0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77  ** WITH clause w
232d0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70  ill never be pop
232e0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
232f0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
23300 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65   it.** should be
23310 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
23320 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  h the Parse obje
23330 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73  ct. In other cas
23340 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65  es, when.** bFre
23350 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f  e==0, the With o
23360 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72  bject will be fr
23370 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
23380 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
23390 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69  atement with whi
233a0 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61  ch it is associa
233b0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
233c0 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72  ite3WithPush(Par
233d0 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68  se *pParse, With
233e0 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65   *pWith, u8 bFre
233f0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46  e){.  assert( bF
23400 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ree==0 || pParse
23410 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20  ->pWith==0 );.  
23420 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
23430 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d   pWith->pOuter =
23440 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
23450 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
23460 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 70  h = pWith;.    p
23470 50 61 72 73 65 2d 3e 62 46 72 65 65 57 69 74 68  Parse->bFreeWith
23480 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a   = bFree;.  }.}.
23490 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
234a0 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61  tion checks if a
234b0 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65  rgument pFrom re
234c0 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64 65  fers to a CTE de
234d0 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20  clared by .** a 
234e0 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74  WITH clause on t
234f0 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74  he stack current
23500 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79  ly maintained by
23510 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64   the parser. And
23520 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c  ,.** if currentl
23530 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43  y processing a C
23540 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69  TE expression, i
23550 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72 73  f it is a recurs
23560 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ive.** reference
23570 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
23580 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  CTE..**.** If pF
23590 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65  rom falls into e
235a0 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  ither of the two
235b0 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76   categories abov
235c0 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a  e, pFrom->pTab.*
235d0 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
235e0 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64  ds are populated
235f0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68   accordingly. Th
23600 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
23610 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d  check.** (pFrom-
23620 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74  >pTab!=0) to det
23630 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
23640 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66  r not a successf
23650 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20  ul match.** was 
23660 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  found..**.** Whe
23670 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61  ther or not a ma
23680 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51  tch is found, SQ
23690 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
236a0 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a  ned if no error.
236b0 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  ** occurs. If an
236c0 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
236d0 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  r, an error mess
236e0 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
236f0 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61   the.** parser a
23700 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f  nd some error co
23710 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  de other than SQ
23720 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
23730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23740 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61  withExpand(.  Wa
23750 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a  lker *pWalker, .
23760 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
23770 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a  _item *pFrom.){.
23780 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
23790 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
237a0 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
237b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
237c0 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74   struct Cte *pCt
237d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
237e0 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20   /* Matched CTE 
237f0 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d  (or NULL if no m
23800 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20  atch) */.  With 
23810 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20 20  *pWith;         
23820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49             /* WI
23830 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20 70  TH clause that p
23840 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  Cte belongs to *
23850 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72  /..  assert( pFr
23860 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a  om->pTab==0 );..
23870 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68 57    pCte = searchW
23880 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74  ith(pParse->pWit
23890 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68  h, pFrom, &pWith
238a0 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b  );.  if( pCte ){
238b0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
238c0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
238d0 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65  pEList;.    Sele
238e0 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65  ct *pSel;.    Se
238f0 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20  lect *pLeft;    
23900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23910 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  eft-most SELECT 
23920 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
23930 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69   int bMayRecursi
23940 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ve;            /
23950 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75  * True if compou
23960 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49  nd joined by UNI
23970 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20  ON [ALL] */.    
23980 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74 68  With *pSavedWith
23990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
239a0 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
239b0 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20  f pParse->pWith 
239c0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43  */..    /* If pC
239d0 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e  te->zCteErr is n
239e0 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20  on-NULL at this 
239f0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
23a00 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20   is an illegal. 
23a10 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20     ** recursive 
23a20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45  reference to CTE
23a30 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20   pCte. Leave an 
23a40 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20  error in pParse 
23a50 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  and return.    *
23a60 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65  * early. If pCte
23a70 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c  ->zCteErr is NUL
23a80 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  L, then this is 
23a90 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
23aa0 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a  reference..    *
23ab0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
23ac0 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20  proceed.  */.   
23ad0 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45   if( pCte->zCteE
23ae0 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
23af0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
23b00 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72  se, pCte->zCteEr
23b10 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  r, pCte->zName);
23b20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23b30 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
23b40 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
23b50 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
23b60 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  .    pFrom->pTab
23b70 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
23b80 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
23b90 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
23ba0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
23bb0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
23bc0 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e  bort;.    pTab->
23bd0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  nRef = 1;.    pT
23be0 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
23bf0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
23c00 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
23c10 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
23c20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
23c30 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
23c40 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
23c50 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
23c60 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  76) );.    pTab-
23c70 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
23c80 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e  Ephemeral | TF_N
23c90 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
23ca0 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
23cb0 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
23cc0 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
23cd0 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
23ce0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
23cf0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
23d00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23d10 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23d20 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f  Select );..    /
23d30 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
23d40 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43  is a recursive C
23d50 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20  TE. */.    pSel 
23d60 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
23d70 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73  ;.    bMayRecurs
23d80 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70  ive = ( pSel->op
23d90 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c  ==TK_ALL || pSel
23da0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
23db0 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
23dc0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
23dd0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72   int i;.      Sr
23de0 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46  cList *pSrc = pF
23df0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  rom->pSelect->pS
23e00 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
23e10 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
23e20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
23e30 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23e40 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
23e50 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
23e60 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
23e70 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20  abase==0 .      
23e80 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61     && pItem->zNa
23e90 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  me!=0 .         
23ea0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
23eb0 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ICmp(pItem->zNam
23ec0 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a  e, pCte->zName).
23ed0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
23ee0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54         pItem->pT
23ef0 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
23f00 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69       pItem->fg.i
23f10 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a  sRecursive = 1;.
23f20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
23f30 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
23f40 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
23f50 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65   |= SF_Recursive
23f60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23f70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23f80 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72  * Only one recur
23f90 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
23fa0 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20  s permitted. */ 
23fb0 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  .    if( pTab->n
23fc0 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73  Ref>2 ){.      s
23fd0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a  qlite3ErrorMsg(.
23fe0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
23ff0 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65  , "multiple refe
24000 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73  rences to recurs
24010 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  ive table: %s", 
24020 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pCte->zName.    
24030 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
24040 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
24050 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
24060 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20  ( pTab->nRef==1 
24070 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c  || ((pSel->selFl
24080 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65  ags&SF_Recursive
24090 29 20 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d  ) && pTab->nRef=
240a0 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65  =2 ));..    pCte
240b0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72  ->zCteErr = "cir
240c0 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a  cular reference:
240d0 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64   %s";.    pSaved
240e0 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70  With = pParse->p
240f0 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
24100 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
24110 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
24120 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
24130 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f 20  bMayRecursive ? 
24140 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70  pSel->pPrior : p
24150 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70  Sel);..    for(p
24160 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74  Left=pSel; pLeft
24170 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d  ->pPrior; pLeft=
24180 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a  pLeft->pPrior);.
24190 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65      pEList = pLe
241a0 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ft->pEList;.    
241b0 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20  if( pCte->pCols 
241c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
241d0 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
241e0 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c  Expr!=pCte->pCol
241f0 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  s->nExpr ){.    
24200 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
24210 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
24220 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c  le %s has %d val
24230 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d  ues for %d colum
24240 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ns",.           
24250 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45   pCte->zName, pE
24260 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74  List->nExpr, pCt
24270 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a  e->pCols->nExpr.
24280 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
24290 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
242a0 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
242b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
242c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
242d0 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74    }.      pEList
242e0 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a   = pCte->pCols;.
242f0 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
24300 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
24310 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
24320 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
24330 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
24340 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
24350 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
24360 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  if( pSel->selFla
24370 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
24380 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  e ){.        pCt
24390 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75  e->zCteErr = "mu
243a0 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69 76 65  ltiple recursive
243b0 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22   references: %s"
243c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
243d0 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74         pCte->zCt
243e0 65 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76  eErr = "recursiv
243f0 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61  e reference in a
24400 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a   subquery: %s";.
24410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
24420 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
24430 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
24440 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e      }.    pCte->
24450 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20  zCteErr = 0;.   
24460 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
24470 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d   pSavedWith;.  }
24480 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
24490 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
244a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
244b0 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66  MIT_CTE./*.** If
244c0 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73 73   the SELECT pass
244d0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
244e0 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e   argument has an
244f0 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54 48   associated WITH
24500 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70   .** clause, pop
24510 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61   it from the sta
24520 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  ck stored as par
24530 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f  t of the Parse o
24540 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bject..**.** Thi
24550 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
24560 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65 63  ed as the xSelec
24570 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c  tCallback2() cal
24580 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69  lback by.** sqli
24590 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
245a0 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61  ) when walking a
245b0 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20   SELECT tree to 
245c0 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a  resolve table.**
245d0 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72   names and other
245e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
245f0 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  ments. .*/.stati
24600 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70  c void selectPop
24610 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61  With(Walker *pWa
24620 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
24630 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
24640 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
24650 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70 57 69  rse;.  With *pWi
24660 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f  th = findRightmo
24670 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20  st(p)->pWith;.  
24680 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
24690 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
246a0 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68  se->pWith==pWith
246b0 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
246c0 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70  pWith = pWith->p
246d0 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  Outer;.  }.}.#el
246e0 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
246f0 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
24700 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
24710 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
24720 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
24730 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
24740 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
24750 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
24760 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
24770 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
24780 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
24790 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
247a0 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
247b0 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
247c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
247d0 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
247e0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
247f0 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
24800 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
24810 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
24820 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
24830 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
24840 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
24850 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
24860 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
24870 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
24880 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
24890 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
248a0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
248b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
248c0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
248d0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
248e0 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
248f0 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
24900 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
24910 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
24920 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
24930 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
24940 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
24950 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
24960 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
24970 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
24980 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74 65   up the persiste
24990 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
249a0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
249b0 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
249c0 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
249d0 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
249e0 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f  lause to accommo
249f0 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
24a00 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
24a10 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
24a20 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
24a30 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
24a40 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
24a50 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
24a60 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
24a70 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
24a80 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
24a90 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
24aa0 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
24ab0 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
24ac0 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
24ad0 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
24ae0 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
24af0 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
24b00 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
24b10 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
24b20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
24b30 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
24b40 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
24b50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
24b60 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61  electExpander(Wa
24b70 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
24b80 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
24b90 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
24ba0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
24bb0 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53  int i, j, k;.  S
24bc0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
24bd0 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
24be0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
24bf0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
24c00 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
24c10 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24c20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69    Expr *pE, *pRi
24c30 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75  ght, *pExpr;.  u
24c40 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  16 selFlags = p-
24c50 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d  >selFlags;..  p-
24c60 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
24c70 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20  Expanded;.  if( 
24c80 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24c90 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
24ca0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
24cb0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53   if( NEVER(p->pS
24cc0 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c  rc==0) || (selFl
24cd0 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
24ce0 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
24cf0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
24d00 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
24d10 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
24d20 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
24d30 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 78 53   if( pWalker->xS
24d40 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 3d 3d  electCallback2==
24d50 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 29 7b  selectPopWith ){
24d60 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74 68  .    sqlite3With
24d70 50 75 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e  Push(pParse, fin
24d80 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
24d90 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  With, 0);.  }.. 
24da0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
24db0 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
24dc0 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
24dd0 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
24de0 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
24df0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
24e00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
24e10 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
24e20 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
24e30 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
24e40 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
24e50 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
24e60 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
24e70 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
24e80 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
24e90 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
24ea0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
24eb0 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
24ec0 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
24ed0 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
24ee0 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
24ef0 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
24f00 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
24f10 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
24f20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
24f30 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
24f40 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
24f50 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
24f60 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
24f70 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
24f80 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
24f90 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d  sive==0 || pFrom
24fa0 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 69 66  ->pTab );.    if
24fb0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65  ( pFrom->fg.isRe
24fc0 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e  cursive ) contin
24fd0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ue;.    if( pFro
24fe0 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
24ff0 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
25000 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
25010 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
25020 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
25030 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
25040 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
25050 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
25060 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
25070 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
25080 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28    selectPopWith(
25090 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23 65 6e  pWalker, p);.#en
250a0 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
250b0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
250c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
250d0 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66  _OMIT_CTE.    if
250e0 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61  ( withExpand(pWa
250f0 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72  lker, pFrom) ) r
25100 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25110 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
25120 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23  pTab ) {} else.#
25130 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46  endif.    if( pF
25140 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  rom->zName==0 ){
25150 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25160 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
25170 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
25180 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
25190 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  t;.      /* A su
251a0 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
251b0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
251c0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
251d0 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20  assert( pSel!=0 
251e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
251f0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
25200 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
25210 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
25220 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20  Walker, pSel) ) 
25230 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
25240 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
25250 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
25260 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
25270 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
25280 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e));.      if( p
25290 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
252a0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
252b0 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
252c0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  .      pTab->zNa
252d0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
252e0 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
252f0 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70  sq_%p", (void*)p
25300 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  Tab);.      whil
25310 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
25320 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e  ){ pSel = pSel->
25330 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20  pPrior; }.      
25340 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
25350 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
25360 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
25370 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61  &pTab->nCol,&pTa
25380 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->aCol);.      
25390 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
253a0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
253b0 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
253c0 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
253d0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
253e0 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61  76) );.      pTa
253f0 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
25400 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e  F_Ephemeral;.#en
25410 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
25420 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
25430 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
25440 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
25450 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
25460 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
25470 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
25480 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
25490 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
254a0 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
254b0 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
254c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
254d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
254e0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
254f0 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78  ( pTab->nRef==0x
25500 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
25510 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25520 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
25530 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
25540 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
25550 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
25560 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
25570 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
25580 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
25590 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
255a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
255b0 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
255c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
255d0 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
255e0 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
255f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
25600 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
25610 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
25620 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
25630 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
25640 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
25650 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
25660 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ab) ) return WRC
25670 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
25680 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
25690 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
256a0 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
256b0 66 67 2e 69 73 54 61 62 46 75 6e 63 20 26 26 20  fg.isTabFunc && 
256c0 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
256d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
256e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
256f0 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20 6e  arse, "'%s' is n
25700 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20  ot a function", 
25710 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
25720 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
25730 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
25740 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72 6f    }.        pFro
25750 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
25760 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
25770 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
25780 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
25790 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
257a0 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  e(pFrom->pSelect
257b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
257c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
257d0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
257e0 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
257f0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
25800 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
25810 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
25820 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
25830 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
25840 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
25850 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
25860 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
25870 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
25880 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
25890 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
258a0 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
258b0 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
258c0 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
258d0 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
258e0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
258f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
25900 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
25910 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
25920 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
25930 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
25940 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
25950 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
25960 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
25970 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
25980 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
25990 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
259a0 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
259b0 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
259c0 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
259d0 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
259e0 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
259f0 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
25a00 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
25a10 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
25a20 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
25a30 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
25a40 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
25a50 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
25a60 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
25a70 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
25a80 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
25a90 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
25aa0 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
25ab0 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
25ac0 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
25ad0 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
25ae0 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
25af0 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
25b00 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
25b10 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
25b20 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
25b30 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
25b40 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
25b50 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
25b60 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
25b70 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73  {.    pE = pELis
25b80 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
25b90 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
25ba0 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
25bb0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
25bc0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
25bd0 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
25be0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
25bf0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
25c00 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
25c10 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
25c20 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
25c30 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
25c40 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
25c50 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
25c60 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69    }.  if( k<pELi
25c70 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
25c80 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
25c90 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
25ca0 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
25cb0 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
25cc0 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
25cd0 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
25ce0 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
25cf0 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
25d00 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
25d10 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
25d20 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
25d30 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
25d40 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
25d50 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
25d60 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
25d70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
25d80 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
25d90 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
25da0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
25db0 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
25dc0 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
25dd0 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
25de0 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20  ames)!=0.       
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
25e00 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
25e10 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
25e20 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ==0;..    for(k=
25e30 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
25e40 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
25e50 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
25e60 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
25e70 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pE->pRight;.    
25e80 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
25e90 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
25ea0 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht!=0 );.      i
25eb0 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
25ec0 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b  L && (pE->op!=TK
25ed0 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e  _DOT || pRight->
25ee0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
25ef0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
25f00 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
25f10 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
25f20 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
25f30 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
25f40 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
25f50 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
25f60 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
25f70 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20   a[k].pExpr);.  
25f80 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
25f90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
25fa0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
25fb0 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
25fc0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
25fd0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
25fe0 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20  Expr-1].zSpan = 
25ff0 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[k].zSpan;.    
26000 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
26010 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
26020 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a  a[k].zSpan = 0;.
26030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26040 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
26050 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26060 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
26070 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
26080 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
26090 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
260a0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
260b0 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
260c0 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
260d0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
260e0 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
260f0 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
26100 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
26110 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74   = 0;       /* t
26120 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
26130 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
26140 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
26150 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OT ){.          
26160 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66  assert( pE->pLef
26170 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
26180 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
26190 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70  asProperty(pE->p
261a0 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Left, EP_IntValu
261b0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
261c0 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65  zTName = pE->pLe
261d0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
261e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
261f0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
26200 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
26210 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
26220 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
26230 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
26240 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
26250 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  ;.          Sele
26260 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d  ct *pSub = pFrom
26270 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
26280 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
26290 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
262a0 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ias;.          c
262b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
262c0 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  maName = 0;.    
262d0 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
262e0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
262f0 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
26300 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
26310 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
26320 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26330 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
26340 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
26350 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
26360 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53  ( pSub==0 || (pS
26370 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
26380 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
26390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
263a0 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSub = 0;.      
263b0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
263c0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
263d0 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
263e0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
263f0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
26400 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
26410 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62  .            iDb
26420 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
26430 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
26440 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
26450 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
26460 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64  ame = iDb>=0 ? d
26470 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
26480 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
26490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
264a0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
264b0 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
264c0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
264d0 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
264e0 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
264f0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
26500 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
26510 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
26520 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
26530 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
26540 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
26550 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
26560 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
26570 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
26580 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
26590 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
265a0 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
265b0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
265c0 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
265d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
265e0 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
265f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
26600 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
26610 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
26620 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
26630 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
26640 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
26660 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
26670 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
26680 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
26690 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
266a0 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74  hidden' (current
266b0 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  ly only possible
266c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
266d0 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  for virtual tabl
266e0 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c  es), do not incl
266f0 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78  ude it in the ex
26700 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
26710 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
26720 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20   list..         
26730 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
26740 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f    if( IsHiddenCo
26750 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
26760 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
26770 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56        assert(IsV
26780 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20  irtual(pTab));. 
26790 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
267a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
267b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
267c0 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
267d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
267e0 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
267f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26800 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66     if( (pFrom->f
26810 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
26820 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
26830 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
26840 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
26850 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
26860 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
26870 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
26880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26890 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
268a0 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
268b0 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
268c0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
268d0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
268e0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
268f0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
26900 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
26910 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
26920 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
26930 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
26940 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
26950 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
26960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26970 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
26980 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
26990 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
269a0 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
269b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
269c0 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
269d0 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
269e0 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
269f0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
26a00 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
26a10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26a20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
26a30 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
26a40 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
26a50 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
26a60 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
26a70 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
26a80 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
26a90 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
26aa0 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
26ab0 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
26ad0 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
26ae0 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
26af0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
26b00 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
26b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
26b20 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
26b30 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
26b40 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
26b50 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
26b60 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61       if( zSchema
26b70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
26b80 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
26b90 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
26ba0 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61  TK_ID, zSchemaNa
26bb0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
26bc0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
26bd0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
26be0 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
26bf0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
26c00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26c10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
26c20 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
26c30 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
26c40 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
26c50 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
26c60 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
26c70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26c80 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43      zToFree = zC
26c90 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
26ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26cc0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
26cd0 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
26ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26cf0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
26d00 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
26d10 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
26d20 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
26d30 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a    sColname.z = z
26d40 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
26d50 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20       sColname.n 
26d60 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
26d70 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  0(zColname);.   
26d80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26d90 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
26da0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
26db0 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
26dc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
26dd0 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
26de0 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
26df0 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
26e00 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
26e10 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
26e20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
26e30 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
26e40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
26e50 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
26e60 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
26e70 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
26e80 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
26e90 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26eb0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
26ec0 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
26ed0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
26ef0 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
26f00 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
26f10 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f40 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
26f50 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
26f60 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
26f70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
26f80 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
26f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
26fb0 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
26fc0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
26fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26fe0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
26ff0 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
27000 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27010 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
27020 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
27030 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
27040 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
27050 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
27060 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
27070 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
27080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
27090 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
270a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
270b0 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
270c0 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
270d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
270e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
270f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
27100 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
27110 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
27120 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
27130 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
27140 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
27150 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
27160 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
27170 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
27180 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
27190 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
271a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
271b0 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
271c0 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
271d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
271e0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
271f0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f  e;.}../*.** No-o
27200 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  p routine for th
27210 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c  e parse-tree wal
27220 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ker..**.** When 
27230 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
27240 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  the Walker.xExpr
27250 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78  Callback then ex
27260 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a  pression trees.*
27270 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74  * are walked wit
27280 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73  hout any actions
27290 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20   being taken at 
272a0 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73  each node.  Pres
272b0 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20  umably,.** when 
272c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
272d0 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e  used for Walker.
272e0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
272f0 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53  en .** Walker.xS
27300 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73  electCallback is
27310 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74   set to do somet
27320 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20  hing useful for 
27330 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65  every .** subque
27340 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
27350 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
27360 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f   int exprWalkNoo
27370 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  p(Walker *NotUse
27380 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64  d, Expr *NotUsed
27390 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
273a0 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
273b0 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
273c0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
273d0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
273e0 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64   routine "expand
273f0 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  s" a SELECT stat
27400 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66  ement and all of
27410 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e   its subqueries.
27420 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e  .** For addition
27430 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
27440 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20  n what it means 
27450 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45  to "expand" a SE
27460 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
27470 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  t, see the comme
27480 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74  nt on the select
27490 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61  Expand worker ca
274a0 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a  llback above..**
274b0 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20  .** Expanding a 
274c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
274d0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74   is the first st
274e0 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  ep in processing
274f0 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
27500 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c  tement.  The SEL
27510 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75  ECT statement mu
27520 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
27530 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65  efore.** name re
27540 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66  solution is perf
27550 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormed..**.** If 
27560 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
27570 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ong, an error me
27580 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
27590 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a   into pParse..**
275a0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
275b0 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74  ction can detect
275c0 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20   the problem by 
275d0 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73  looking at pPars
275e0 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f  e->nErr.** and/o
275f0 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  r pParse->db->ma
27600 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73  llocFailed..*/.s
27610 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
27620 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50  e3SelectExpand(P
27630 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
27640 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
27650 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
27660 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
27670 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
27680 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
27690 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
276a0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
276b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73   if( pParse->has
276c0 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20  Compound ){.    
276d0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
276e0 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  k = convertCompo
276f0 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
27700 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ery;.    sqlite3
27710 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
27720 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77  Select);.  }.  w
27730 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
27740 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
27750 72 3b 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63  r;.  if( (pSelec
27760 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
27770 5f 4d 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20  _MultiValue)==0 
27780 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  ){.    w.xSelect
27790 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
277a0 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20  ctPopWith;.  }. 
277b0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
277c0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
277d0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
277e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
277f0 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
27800 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
27810 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
27820 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
27830 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
27840 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
27850 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
27860 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
27870 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
27880 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
27890 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
278a0 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
278b0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
278c0 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
278d0 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
278e0 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
278f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
27900 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
27910 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
27920 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
27930 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
27940 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
27950 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
27960 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
27970 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
27980 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
27990 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
279a0 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
279b0 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
279c0 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
279d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
279e0 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
279f0 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
27a00 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
27a10 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
27a20 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61  Info(Walker *pWa
27a30 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
27a40 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
27a50 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  e;.  int i;.  Sr
27a60 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
27a70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
27a80 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
27a90 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
27aa0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
27ab0 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d  ved );.  if( (p-
27ac0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
27ad0 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29  asTypeInfo)==0 )
27ae0 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
27af0 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
27b00 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20  nfo;.    pParse 
27b10 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
27b20 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  e;.    pTabList 
27b30 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66  = p->pSrc;.    f
27b40 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
27b50 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
27b60 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
27b70 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
27b80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
27b90 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
27ba0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54     if( ALWAYS(pT
27bb0 61 62 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d  ab!=0) && (pTab-
27bc0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
27bd0 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a  phemeral)!=0 ){.
27be0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62          /* A sub
27bf0 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
27c00 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
27c10 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20  ELECT */.       
27c20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
27c30 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
27c40 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
27c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
27c60 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
27c70 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
27c80 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
27c90 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75     selectAddColu
27ca0 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
27cb0 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
27cc0 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pSel);.        
27cd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
27ce0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
27cf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
27d00 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20  e adds datatype 
27d10 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
27d20 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  quence informati
27d30 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62  on to.** the Tab
27d40 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  le structures of
27d50 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
27d60 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61   subqueries in a
27d70 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
27d80 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  ment..**.** Use 
27d90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74  this routine aft
27da0 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
27db0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
27dc0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
27dd0 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73  AddTypeInfo(Pars
27de0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
27df0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66  t *pSelect){.#if
27e00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27e10 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b  _SUBQUERY.  Walk
27e20 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
27e30 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
27e40 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
27e50 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41  lback2 = selectA
27e60 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
27e70 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  fo;.  w.xExprCal
27e80 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b  lback = exprWalk
27e90 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
27ea0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
27eb0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
27ec0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e  w, pSelect);.#en
27ed0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.}.../*.** Th
27ee0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
27ef0 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  up a SELECT stat
27f00 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
27f10 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f  sing.  The.** fo
27f20 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d  llowing is accom
27f30 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  plished:.**.**  
27f40 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f     *  VDBE Curso
27f50 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73  r numbers are as
27f60 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52  signed to all FR
27f70 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  OM-clause terms.
27f80 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d  .**     *  Ephem
27f90 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
27fa0 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ts are created f
27fb0 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  or all FROM-clau
27fc0 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  se subqueries..*
27fd0 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20  *     *  ON and 
27fe0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72  USING clauses ar
27ff0 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57  e shifted into W
28000 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a  HERE statements.
28010 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61  **     *  Wildca
28020 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42  rds "*" and "TAB
28030 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20  LE.*" in result 
28040 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65  sets are expande
28050 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65  d..**     *  Ide
28060 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72  ntifiers in expr
28070 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68  ession are match
28080 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a  ed to tables..**
28090 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
280a0 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c   acts recursivel
280b0 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  y on all subquer
280c0 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53  ies within the S
280d0 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
280e0 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
280f0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
28100 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
28110 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
28120 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
28130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28140 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
28150 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
28160 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
28170 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
28180 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
28190 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29  r container */.)
281a0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
281b0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
281c0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
281d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
281e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
281f0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
28200 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
28210 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
28220 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
28230 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
28240 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  and(pParse, p);.
28250 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
28260 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
28270 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
28280 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
28290 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61  eSelectNames(pPa
282a0 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43  rse, p, pOuterNC
282b0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
282c0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
282d0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
282e0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
282f0 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70  ectAddTypeInfo(p
28300 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  Parse, p);.}../*
28310 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
28320 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
28330 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
28340 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
28350 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
28360 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
28370 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
28380 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
28390 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
283a0 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
283b0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
283c0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
283d0 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c  that stores NULL
283e0 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73  s in all of thos
283f0 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c  e memory.** cell
28400 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
28410 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
28420 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
28430 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
28440 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
28450 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
28460 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
28470 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
28480 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52  *pFunc;.  int nR
28490 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  eg = pAggInfo->n
284a0 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d  Func + pAggInfo-
284b0 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20  >nColumn;.  if( 
284c0 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nReg==0 ) return
284d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
284e0 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66  DEBUG.  /* Verif
284f0 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e  y that all AggIn
28500 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65  fo registers are
28510 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67   within the rang
28520 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20  e specified by. 
28530 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65   ** AggInfo.mnRe
28540 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67  g..AggInfo.mxReg
28550 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52   */.  assert( nR
28560 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg==pAggInfo->mx
28570 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  Reg-pAggInfo->mn
28580 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69  Reg+1 );.  for(i
28590 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
285a0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
285b0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
285c0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
285d0 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
285e0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
285f0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
28600 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
28610 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20  >mxReg );.  }.  
28620 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
28630 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29  nfo->nFunc; i++)
28640 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
28650 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
28660 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
28670 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
28680 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  && pAggInfo->aFu
28690 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  nc[i].iMem<=pAgg
286a0 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
286b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
286c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
286d0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
286e0 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41  gInfo->mnReg, pA
286f0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a  ggInfo->mxReg);.
28700 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67    for(pFunc=pAgg
28710 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30  Info->aFunc, i=0
28720 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
28730 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b  unc; i++, pFunc+
28740 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  +){.    if( pFun
28750 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
28760 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
28770 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
28780 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28790 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
287a0 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pE, EP_xIsSelec
287b0 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
287c0 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c  pE->x.pList==0 |
287d0 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pE->x.pList->n
287e0 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
287f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28800 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
28810 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20  INCT aggregates 
28820 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
28830 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20  y one ".        
28840 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a     "argument");.
28850 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
28860 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
28870 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28880 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
28890 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
288a0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
288b0 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c  se, pE->x.pList,
288c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
288d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
288e0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
288f0 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  meral, pFunc->iD
28900 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
28930 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
28940 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  INFO);.      }. 
28950 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
28960 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
28970 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
28980 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
28990 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
289a0 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
289b0 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
289c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
289d0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
289e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
289f0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
28a00 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
28a10 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
28a20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
28a30 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
28a40 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
28a50 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
28a60 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
28a70 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
28a80 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
28a90 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
28aa0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
28ab0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
28ac0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
28ad0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
28ae0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
28af0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
28b00 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
28b10 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
28b20 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c  t->nExpr : 0, 0,
28b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28b40 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
28b50 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
28b60 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
28b70 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
28b80 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
28b90 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
28ba0 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
28bb0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
28bc0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
28bd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28be0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
28bf0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
28c00 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
28c10 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
28c20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
28c30 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
28c40 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  egHit = 0;.  int
28c50 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30   addrHitTest = 0
28c60 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
28c70 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
28c80 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
28c90 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
28ca0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
28cb0 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
28cc0 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
28cd0 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
28ce0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
28cf0 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
28d00 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
28d10 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
28d20 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
28d30 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
28d40 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
28d50 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
28d60 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
28d70 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
28d80 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
28d90 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
28da0 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
28db0 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
28dc0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
28dd0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
28de0 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
28df0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
28e00 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
28e10 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53  st, regAgg, 0, S
28e20 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b  QLITE_ECEL_DUP);
28e30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28e40 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
28e50 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
28e60 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
28e70 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
28e80 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
28e90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
28ea0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
28eb0 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d  testcase( nArg==
28ec0 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63  0 );  /* Error c
28ed0 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ondition */.    
28ee0 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67    testcase( nArg
28ef0 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20  >1 );   /* Also 
28f00 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
28f10 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
28f20 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
28f30 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
28f40 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
28f50 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
28f60 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
28f70 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
28f80 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
28f90 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
28fa0 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
28fb0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
28fc0 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
28fd0 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
28fe0 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
28ff0 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
29000 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
29010 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
29020 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
29030 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
29040 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
29050 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
29060 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
29070 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
29080 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
29090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
290a0 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
290b0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
290c0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
290d0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
290e0 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
290f0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
29100 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48  cumulator ) regH
29110 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
29120 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
29130 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
29140 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48  OP_CollSeq, regH
29150 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  it, 0, 0, (char 
29160 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
29170 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
29180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29190 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30  4(v, OP_AggStep0
291a0 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d  , 0, regAgg, pF-
291b0 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20  >iMem,.         
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
291d0 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
291e0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
291f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
29200 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
29210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
29220 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
29230 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
29240 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
29250 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
29260 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
29270 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
29280 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
29290 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
292a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
292b0 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
292c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
292d0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
292e0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
292f0 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c   /* Before popul
29300 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  ating the accumu
29310 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c  lator registers,
29320 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   clear the colum
29330 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74  n cache..  ** Ot
29340 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20  herwise, if any 
29350 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20  of the required 
29360 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72  column values ar
29370 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  e already presen
29380 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73  t .  ** in regis
29390 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70  ters, sqlite3Exp
293a0 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20  rCode() may use 
293b0 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79  OP_SCopy to copy
293c0 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20   the value.  ** 
293d0 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74  to pC->iMem. But
293e0 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
293f0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20   value is used, 
29400 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67  the original reg
29410 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68  ister.  ** may h
29420 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69  ave been used, i
29430 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20  nvalidating the 
29440 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65  underlying buffe
29450 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  r holding the.  
29460 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20  ** text or blob 
29470 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65  value. See ticke
29480 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a  t [883034dcb5]..
29490 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65    **.  ** Anothe
294a0 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64  r solution would
294b0 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68   be to change th
294c0 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20  e OP_SCopy used 
294d0 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20  to copy cached. 
294e0 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e   ** values to an
294f0 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20   OP_Copy..  */. 
29500 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20   if( regHit ){. 
29510 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d     addrHitTest =
29520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29530 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
29540 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Hit); VdbeCovera
29550 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
29560 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
29570 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
29580 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
29590 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
295a0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
295b0 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
295c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
295d0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
295e0 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
295f0 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
29600 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
29610 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
29620 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
29630 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
29640 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
29650 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
29660 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
29670 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
29680 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
29690 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
296a0 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
296b0 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
296c0 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
296d0 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
296e0 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
296f0 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
29700 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
29710 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
29720 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
29730 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
29740 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
29750 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
29760 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
29770 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
29780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
29790 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
297a0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
297b0 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
297c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
297d0 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
297e0 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
297f0 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
29800 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
29810 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d      int bCover =
29820 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61   (pIdx!=0 && (Ha
29830 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
29840 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
29850 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20  ex(pIdx)));.    
29860 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c  char *zEqp = sql
29870 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
29880 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41  se->db, "SCAN TA
29890 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20  BLE %s%s%s",.   
298a0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
298b0 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
298c0 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52   ? " USING COVER
298d0 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22  ING INDEX " : ""
298e0 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
298f0 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a   ? pIdx->zName :
29900 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73   "".    );.    s
29910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
29920 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
29930 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c  ->pVdbe, OP_Expl
29940 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
29950 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45  lectId, 0, 0, zE
29960 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20  qp, P4_DYNAMIC. 
29970 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73     );.  }.}.#els
29980 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
29990 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c  inSimpleCount(a,
299a0 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
299b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
299c0 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20   for the SELECT 
299d0 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
299e0 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e  in the p argumen
299f0 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  t.  .**.** The r
29a00 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72  esults are retur
29a10 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ned according to
29a20 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20   the SelectDest 
29a30 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65  structure..** Se
29a40 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71  e comments in sq
29a50 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75  liteInt.h for fu
29a60 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f  rther informatio
29a70 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
29a80 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
29a90 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
29aa0 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
29ab0 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
29ac0 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
29ad0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
29ae0 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
29af0 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
29b00 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
29b10 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
29b20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
29b30 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
29b40 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
29b50 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
29b60 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
29b70 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
29b80 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
29b90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
29ba0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
29bb0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
29bc0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
29bd0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
29be0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
29bf0 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
29c00 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
29c10 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
29c20 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
29c30 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
29c40 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
29c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
29c60 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
29c70 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
29c80 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
29c90 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
29ca0 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
29cb0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
29cc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
29cd0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
29ce0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
29cf0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
29d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29d10 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
29d20 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
29d30 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
29d40 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20  st *pEList = 0; 
29d50 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
29d60 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
29d70 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
29d80 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
29d90 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
29da0 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
29db0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
29dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29dd0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
29de0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
29df0 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
29e00 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
29e10 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
29e20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
29e30 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
29e40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
29e50 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
29e60 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
29e70 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
29e80 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
29e90 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
29ea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
29eb0 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44    DistinctCtx sD
29ec0 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f  istinct; /* Info
29ed0 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
29ee0 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
29ef0 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74  word */.  SortCt
29f00 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20  x sSort;        
29f10 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
29f20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45  to code the ORDE
29f30 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
29f40 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
29f50 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
29f60 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
29f70 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
29f80 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29fa0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
29fb0 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
29fc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
29fd0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
29fe0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
29ff0 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64  ection */..#ifnd
2a000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2a010 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65  XPLAIN.  int iRe
2a020 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20  storeSelectId = 
2a030 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2a040 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65  d;.  pParse->iSe
2a050 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
2a060 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b  >iNextSelectId++
2a070 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d  ;.#endif..  db =
2a080 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
2a090 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
2a0a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
2a0b0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
2a0c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2a0d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
2a0e0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
2a0f0 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
2a100 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
2a110 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
2a120 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
2a130 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69  f(sAggInfo));.#i
2a140 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2a150 41 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e  ABLED.  pParse->
2a160 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b  nSelectIndent++;
2a170 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
2a180 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67  ,pParse,p, ("beg
2a190 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e  in processing:\n
2a1a0 22 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  "));.  if( sqlit
2a1b0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
2a1c0 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c  0x100 ){.    sql
2a1d0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2a1e0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2a1f0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
2a200 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
2a210 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
2a220 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t!=SRT_DistFifo 
2a230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2a240 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2a250 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2a260 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72  _Fifo );.  asser
2a270 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
2a280 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
2a290 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t!=SRT_DistQueue
2a2a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2a2b0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2a2c0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2a2d0 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28  T_Queue );.  if(
2a2e0 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
2a2f0 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
2a300 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44  assert(pDest->eD
2a310 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20  est==SRT_Exists 
2a320 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2a330 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20  =SRT_Union || . 
2a340 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2a350 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65  >eDest==SRT_Exce
2a360 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  pt || pDest->eDe
2a370 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
2a380 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
2a390 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a3a0 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d  Queue  || pDest-
2a3b0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
2a3c0 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20  Fifo ||.        
2a3d0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
2a3e0 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c  =SRT_DistQueue |
2a3f0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2a400 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f  SRT_Fifo);.    /
2a410 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61  * If ORDER BY ma
2a420 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63  kes no differenc
2a430 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  e in the output 
2a440 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65  then neither doe
2a450 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43  s.    ** DISTINC
2a460 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72  T so it can be r
2a470 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20  emoved too. */. 
2a480 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2a490 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
2a4a0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
2a4b0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
2a4c0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2a4d0 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
2a4e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
2a4f0 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
2a500 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74   p, 0);.  memset
2a510 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65  (&sSort, 0, size
2a520 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53  of(sSort));.  sS
2a530 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
2a540 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54  ->pOrderBy;.  pT
2a550 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2a560 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2a570 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
2a580 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
2a590 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2a5a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2a5b0 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ->pEList!=0 );. 
2a5c0 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
2a5d0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
2a5e0 67 61 74 65 29 21 3d 30 3b 0a 23 69 66 20 53 45  gate)!=0;.#if SE
2a5f0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2a600 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
2a610 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
2a620 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
2a630 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
2a640 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61  se,p, ("after na
2a650 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e  me resolution:\n
2a660 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
2a670 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2a680 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2a690 64 69 66 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 72  dif...  /* If wr
2a6a0 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
2a6b0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
2a6c0 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
2a6d0 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
2a6e0 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
2a6f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2a700 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
2a710 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
2a720 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
2a730 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
2a740 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  t, p->pEList->nE
2a750 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  xpr) ){.    goto
2a760 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
2a770 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 72  .#endif..  /* Tr
2a780 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  y to flatten sub
2a790 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
2a7a0 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e  ROM clause up in
2a7b0 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72  to the main quer
2a7c0 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  y.  */.#if !defi
2a7d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2a7e0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
2a7f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2a800 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d  T_VIEW).  for(i=
2a810 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26  0; !p->pPrior &&
2a820 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2a830 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
2a840 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2a850 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
2a860 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
2a870 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
2a880 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
2a890 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
2a8a0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
2a8b0 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
2a8c0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
2a8d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
2a8e0 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63  /* Catch mismatc
2a8f0 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65  h in the declare
2a900 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76  d columns of a v
2a910 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  iew and the numb
2a920 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c  er of.    ** col
2a930 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45  umns in the SELE
2a940 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f  CT on the RHS */
2a950 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  .    if( pTab->n
2a960 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73  Col!=pSub->pELis
2a970 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
2a980 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2a990 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65 63  g(pParse, "expec
2a9a0 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66  ted %d columns f
2a9b0 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74 20  or '%s' but got 
2a9c0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
2a9d0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
2a9e0 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61  >nCol, pTab->zNa
2a9f0 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  me, pSub->pEList
2aa00 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
2aa10 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2aa20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 41 67  .    }..    isAg
2aa30 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65  gSub = (pSub->se
2aa40 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2aa50 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69  egate)!=0;.    i
2aa60 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  f( flattenSubque
2aa70 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c  ry(pParse, p, i,
2aa80 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62   isAgg, isAggSub
2aa90 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
2aaa0 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
2aab0 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
2aac0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
2aad0 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53        if( isAggS
2aae0 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ub ){.        is
2aaf0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
2ab00 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
2ab10 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
2ab20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
2ab30 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  -1;.    }.    pT
2ab40 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2ab50 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
2ab60 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2ab70 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2ab80 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
2ab90 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
2aba0 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  {.      sSort.pO
2abb0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2abc0 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  erBy;.    }.  }.
2abd0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 74  #endif..  /* Get
2abe0 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20 56   a pointer the V
2abf0 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
2ac00 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69  uction, allocati
2ac10 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69 66  ng a new VDBE if
2ac20 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20 6e   one.  ** does n
2ac30 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
2ac40 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
2ac50 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
2ac60 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
2ac70 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2ac80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ac90 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
2aca0 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65  LECT.  /* Handle
2acb0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
2acc0 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e   statements usin
2acd0 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  g the separate m
2ace0 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a  ultiSelect().  *
2acf0 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a  * procedure..  *
2ad00 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
2ad10 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
2ad20 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
2ad30 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , p, pDest);.   
2ad40 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2ad50 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
2ad60 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
2ad70 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c  lectId);.#if SEL
2ad80 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2ad90 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2ada0 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
2adb0 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  d compound-selec
2adc0 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  t processing\n")
2add0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
2ade0 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a  SelectIndent--;.
2adf0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2ae00 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2ae10 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
2ae20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
2ae30 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
2ae40 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
2ae50 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2ae60 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2ae70 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
2ae80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
2ae90 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ).  for(i=0; i<p
2aea0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2aeb0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2aec0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2aed0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2aee0 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
2aef0 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
2af00 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2af10 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2af20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
2af30 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
2af40 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65  /* Sometimes the
2af50 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71   code for a subq
2af60 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e  uery will be gen
2af70 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  erated more than
2af80 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66  .    ** once, if
2af90 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
2afa0 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45   part of the WHE
2afb0 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c  RE clause in a L
2afc0 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a  EFT JOIN,.    **
2afd0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49   for example.  I
2afe0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20  n that case, do 
2aff0 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74  not regenerate t
2b000 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66  he code to manif
2b010 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65  est.    ** a vie
2b020 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74  w or the co-rout
2b030 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ine to implement
2b040 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69   a view.  The fi
2b050 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20  rst instance.   
2b060 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e   ** is sufficien
2b070 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75  t, though the su
2b080 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69  broutine to mani
2b090 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f  fest the view do
2b0a0 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  es need.    ** t
2b0b0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61  o be invoked aga
2b0c0 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  in. */.    if( p
2b0d0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2b0e0 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  b ){.      if( p
2b0f0 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2b100 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  utine==0 ){.    
2b110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b120 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2b130 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  b, pItem->regRet
2b140 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72  urn, pItem->addr
2b150 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20  FillSub);.      
2b160 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  }.      continue
2b170 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2b180 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e  Increment Parse.
2b190 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68  nHeight by the h
2b1a0 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72  eight of the lar
2b1b0 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  gest expression.
2b1c0 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65      ** tree refe
2b1d0 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c  rred to by this,
2b1e0 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65   the parent sele
2b1f0 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65  ct. The child se
2b200 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20  lect.    ** may 
2b210 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69  contain expressi
2b220 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d  on trees of at m
2b230 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49  ost.    ** (SQLI
2b240 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2b250 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29  H-Parse.nHeight)
2b260 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73   height. This is
2b270 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f   a bit.    ** mo
2b280 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20  re conservative 
2b290 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20  than necessary, 
2b2a0 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20  but much easier 
2b2b0 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20  than enforcing. 
2b2c0 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c     ** an exact l
2b2d0 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  imit..    */.   
2b2e0 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
2b2f0 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   += sqlite3Selec
2b300 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
2b310 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70  .    /* Make cop
2b320 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20  ies of constant 
2b330 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72  WHERE-clause ter
2b340 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ms in the outer 
2b350 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a  query down.    *
2b360 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75 62  * inside the sub
2b370 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e  query.  This can
2b380 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75 65   help the subque
2b390 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65  ry to run more e
2b3a0 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20  fficiently..    
2b3b0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74 65  */.    if( (pIte
2b3c0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
2b3d0 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20   JT_OUTER)==0.  
2b3e0 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68     && pushDownWh
2b3f0 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70 53 75  ereTerms(db, pSu
2b400 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  b, p->pWhere, pI
2b410 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20  tem->iCursor).  
2b420 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54    ){.#if SELECTT
2b430 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2b440 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
2b450 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2b460 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c  0 ){.        SEL
2b470 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
2b480 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
2b490 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73  WHERE-clause pus
2b4a0 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20  h-down:\n"));.  
2b4b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2b4c0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2b4d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
2b4e0 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
2b4f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2b500 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2b510 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a  e subquery.    *
2b520 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  /.    if( pTabLi
2b530 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
2b540 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
2b550 20 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 0a 20 20   & SF_All)==0.  
2b560 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2b570 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2b580 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
2b590 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ne).    ){.     
2b5a0 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
2b5b0 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
2b5c0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
2b5d0 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2b5e0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
2b5f0 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
2b600 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
2b610 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2b620 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2b630 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
2b640 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2b650 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2b660 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2b670 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b680 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
2b690 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2b6a0 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
2b6b0 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
2b6c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2b6d0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2b6e0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
2b6f0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2b700 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
2b710 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2b720 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2b730 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
2b740 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2b750 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2b760 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2b770 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2b780 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2b790 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
2b7a0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2b7b0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2b7c0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
2b7d0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2b7e0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
2b7f0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2b800 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2b810 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
2b820 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  = 1;.      pItem
2b830 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65  ->regResult = de
2b840 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20  st.iSdst;.      
2b850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b860 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
2b870 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2b880 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73  Return);.      s
2b890 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2b8a0 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29  re(v, addrTop-1)
2b8b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
2b8c0 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2b8d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65  (pParse);.    }e
2b8e0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  lse{.      /* Ge
2b8f0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2b900 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ine that will fi
2b910 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ll an ephemeral 
2b920 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20  table with.     
2b930 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   ** the content 
2b940 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72 79  of this subquery
2b950 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  .  pItem->addrFi
2b960 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74  llSub will point
2b970 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
2b980 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2b990 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75  generated subrou
2b9a0 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65  tine.  pItem->re
2b9b0 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a  gReturn.      **
2b9c0 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 61   is a register a
2b9d0 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
2b9e0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
2b9f0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20  return address. 
2ba00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
2ba10 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20  t topAddr;.     
2ba20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20   int onceAddr = 
2ba30 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74  0;.      int ret
2ba40 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Addr;.      asse
2ba50 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
2ba60 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20  illSub==0 );.   
2ba70 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
2ba80 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
2ba90 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41  nMem;.      topA
2baa0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2bab0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2bac0 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d  teger, 0, pItem-
2bad0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2bae0 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
2baf0 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b  llSub = topAddr+
2bb00 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  1;.      if( pIt
2bb10 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61  em->fg.isCorrela
2bb20 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ted==0 ){.      
2bb30 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
2bb40 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72  uery is not corr
2bb50 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65  elated and if we
2bb60 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20   are not inside 
2bb70 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  of.        ** a 
2bb80 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65  trigger, then we
2bb90 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f   only need to co
2bba0 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
2bbb0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  of the subquery.
2bbc0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e          ** once.
2bbd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   */.        once
2bbe0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
2bbf0 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
2bc00 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2bc10 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2bc20 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
2bc30 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
2bc40 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2bc50 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
2bc60 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
2bc70 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
2bc80 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
2bc90 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
2bca0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2bcb0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  }.      sqlite3S
2bcc0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
2bcd0 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61  est, SRT_EphemTa
2bce0 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  b, pItem->iCurso
2bcf0 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  r);.      explai
2bd00 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
2bd10 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75  m->iSelectId, (u
2bd20 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  8)pParse->iNextS
2bd30 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
2bd40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
2bd50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
2bd60 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  t);.      pItem-
2bd70 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  >pTab->nRowLogEs
2bd80 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
2bd90 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  t(pSub->nSelectR
2bda0 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  ow);.      if( o
2bdb0 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  nceAddr ) sqlite
2bdc0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2bdd0 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20   onceAddr);.    
2bde0 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69    retAddr = sqli
2bdf0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2be00 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65   OP_Return, pIte
2be10 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2be20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2be30 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70  ((v, "end %s", p
2be40 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2be50 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
2be60 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
2be70 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64  , topAddr, retAd
2be80 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
2be90 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
2bea0 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
2beb0 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
2bec0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2bed0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2bee0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
2bef0 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
2bf00 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
2bf10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2bf20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65  /* Various eleme
2bf30 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  nts of the SELEC
2bf40 54 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f  T copied into lo
2bf50 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f  cal variables fo
2bf60 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  r.  ** convenien
2bf70 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  ce */.  pEList =
2bf80 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57   p->pEList;.  pW
2bf90 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
2bfa0 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
2bfb0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
2bfc0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
2bfd0 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e  ng;.  sDistinct.
2bfe0 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c  isTnct = (p->sel
2bff0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2c000 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45  nct)!=0;..#if SE
2c010 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2c020 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
2c030 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34  electTrace & 0x4
2c040 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
2c050 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
2c060 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c  se,p,("After all
2c070 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61   FROM-clause ana
2c080 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20  lysis:\n"));.   
2c090 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2c0a0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2c0b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2c0c0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
2c0d0 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20  s DISTINCT with 
2c0e0 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20  an ORDER BY but 
2c0f0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
2c100 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69  ate, and .  ** i
2c110 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73  f the select-lis
2c120 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
2c130 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69   the ORDER BY li
2c140 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75  st, then this qu
2c150 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ery.  ** can be 
2c160 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47  rewritten as a G
2c170 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65  ROUP BY. In othe
2c180 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20  r words, this:. 
2c190 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
2c1a0 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a  ECT DISTINCT xyz
2c1b0 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20   FROM ... ORDER 
2c1c0 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
2c1d0 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
2c1e0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
2c1f0 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f    SELECT xyz FRO
2c200 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78  M ... GROUP BY x
2c210 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  yz ORDER BY xyz.
2c220 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
2c230 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65  cond form is pre
2c240 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67  ferred as a sing
2c250 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d  le index (or tem
2c260 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20  p-table) may be 
2c270 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62  .  ** used for b
2c280 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  oth the ORDER BY
2c290 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72   and DISTINCT pr
2c2a0 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69  ocessing. As ori
2c2b0 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72  ginally .  ** wr
2c2c0 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20  itten the query 
2c2d0 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d  must use a temp-
2c2e0 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61  table for at lea
2c2f0 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52  st one of the OR
2c300 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64  DER .  ** BY and
2c310 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61   DISTINCT, and a
2c320 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72  n index or separ
2c330 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  ate temp-table f
2c340 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20  or the other..  
2c350 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
2c360 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
2c370 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
2c380 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
2c390 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45   .   && sqlite3E
2c3a0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73  xprListCompare(s
2c3b0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70  Sort.pOrderBy, p
2c3c0 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20  EList, -1)==0.  
2c3d0 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
2c3e0 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
2c3f0 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  ct;.    pGroupBy
2c400 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d   = p->pGroupBy =
2c410 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2c420 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20  Dup(db, pEList, 
2c430 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63  0);.    /* Notic
2c440 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
2c450 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20  ght SF_Distinct 
2c460 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
2c470 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67   from p->selFlag
2c480 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44  s,.    ** the sD
2c490 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69  istinct.isTnct i
2c4a0 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65  s still set.  He
2c4b0 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72  nce, isTnct repr
2c4c0 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a  esents the.    *
2c4d0 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69  * original setti
2c4e0 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73  ng of the SF_Dis
2c4f0 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20  tinct flag, not 
2c500 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
2c510 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ing */.    asser
2c520 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  t( sDistinct.isT
2c530 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nct );.  }..  /*
2c540 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
2c550 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
2c560 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20   then create an 
2c570 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
2c580 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73  to.  ** do the s
2c590 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69  orting.  But thi
2c5a0 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65  s sorting epheme
2c5b0 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20  ral index might 
2c5c0 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e  end up.  ** bein
2c5d0 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
2c5e0 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72  data can be extr
2c5f0 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
2c600 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20  ted order..  ** 
2c610 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
2c620 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50  ase, then the OP
2c630 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
2c640 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
2c650 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20  be.  ** changed 
2c660 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
2c670 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ce we figure out
2c680 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
2c690 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20  g index is.  ** 
2c6a0 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
2c6b0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2c6c0 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73  ndex variable is
2c6d0 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
2c6e0 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68  ate.  ** that ch
2c6f0 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
2c700 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2c710 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
2c720 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
2c730 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
2c740 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2c750 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  rse, sSort.pOrde
2c760 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e  rBy, 0, pEList->
2c770 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72  nExpr);.    sSor
2c780 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  t.iECursor = pPa
2c790 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2c7a0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2c7b0 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
2c7c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2c7d0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2c7e0 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53  al,.          sS
2c7f0 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53  ort.iECursor, sS
2c800 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
2c810 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45  xpr+1+pEList->nE
2c820 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  xpr, 0,.        
2c830 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
2c840 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20  o, P4_KEYINFO.  
2c850 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
2c860 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
2c870 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
2c880 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
2c890 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
2c8a0 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
2c8b0 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
2c8c0 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
2c8d0 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
2c8e0 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
2c8f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2c900 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
2c910 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
2c920 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
2c930 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
2c940 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
2c950 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
2c960 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
2c970 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2c980 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2c990 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  = LARGEST_INT64;
2c9a0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
2c9b0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
2c9c0 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28   p, iEnd);.  if(
2c9d0 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26   p->iLimit==0 &&
2c9e0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2c9f0 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73  ndex>=0 ){.    s
2ca00 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2ca10 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e  Opcode(v, sSort.
2ca20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f  addrSortIndex, O
2ca30 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20  P_SorterOpen);. 
2ca40 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61     sSort.sortFla
2ca50 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55  gs |= SORTFLAG_U
2ca60 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20  seSorter;.  }.. 
2ca70 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65   /* Open an ephe
2ca80 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  meral index to u
2ca90 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
2caa0 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
2cab0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2cac0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
2cad0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
2cae0 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
2caf0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
2cb00 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
2cb10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2cb20 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
2cb30 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb50 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
2cb60 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  tabTnct, 0, 0,. 
2cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb80 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2cb90 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  r*)keyInfoFromEx
2cba0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2cbb0 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20  ->pEList,0,0),. 
2cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
2cbe0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
2cbf0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2cc00 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
2cc10 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69  RED);.    sDisti
2cc20 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
2cc30 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2cc40 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73  NORDERED;.  }els
2cc50 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  e{.    sDistinct
2cc60 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
2cc70 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
2cc80 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
2cc90 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
2cca0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
2ccb0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2ccc0 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  ons and no GROUP
2ccd0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2cce0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
2ccf0 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73   = (sDistinct.is
2cd00 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e  Tnct ? WHERE_WAN
2cd10 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b  T_DISTINCT : 0);
2cd20 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
2cd30 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
2cd40 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20  . */.    pWInfo 
2cd50 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2cd60 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2cd70 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
2cd80 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
2cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
2cdb0 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
2cdc0 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  gs, 0);.    if( 
2cdd0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2cde0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2cdf0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2ce00 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
2ce10 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65  pWInfo) < p->nSe
2ce20 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
2ce30 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2ce40 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
2ce50 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
2ce60 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
2ce70 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  f( sDistinct.isT
2ce80 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68  nct && sqlite3Wh
2ce90 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
2cea0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73  Info) ){.      s
2ceb0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2cec0 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  pe = sqlite3Wher
2ced0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
2cee0 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
2cef0 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
2cf00 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  y ){.      sSort
2cf10 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65  .nOBSat = sqlite
2cf20 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
2cf30 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69  pWInfo);.      i
2cf40 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d  f( sSort.nOBSat=
2cf50 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d  =sSort.pOrderBy-
2cf60 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
2cf70 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2cf80 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2cf90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73    }..    /* If s
2cfa0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
2cfb0 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
2cfc0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
2cfd0 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
2cfe0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
2cff0 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
2d000 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
2d010 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
2d020 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
2d030 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
2d040 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d050 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2d060 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74  ndex>=0 && sSort
2d070 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a  .pOrderBy==0 ){.
2d080 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d090 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
2d0a0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2d0b0 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ndex);.    }..  
2d0c0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
2d0d0 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
2d0e0 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49  . */.    selectI
2d0f0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
2d100 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p, pEList, -1, 
2d110 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e  &sSort, &sDistin
2d120 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
2d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2d140 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69  qlite3WhereConti
2d150 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  nueLabel(pWInfo)
2d160 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d170 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2d180 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
2d190 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  nfo));..    /* E
2d1a0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
2d1b0 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
2d1c0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  /.    sqlite3Whe
2d1d0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
2d1e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2d1f0 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68  his case when th
2d200 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67  ere exist aggreg
2d210 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ate functions or
2d220 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
2d230 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  se.    ** or bot
2d240 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  h */.    NameCon
2d250 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
2d260 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
2d270 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
2d280 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
2d290 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
2d2a0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
2d2b0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
2d2c0 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
2d2d0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
2d2e0 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
2d2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2d300 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
2d310 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
2d320 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
2d330 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
2d340 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
2d350 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
2d360 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
2d370 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
2d380 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2d390 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
2d3a0 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
2d3b0 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
2d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3d0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
2d3e0 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
2d3f0 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
2d400 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
2d410 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
2d420 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
2d430 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
2d440 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
2d450 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
2d460 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
2d470 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20   BY order */.   
2d480 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
2d490 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
2d4a0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
2d4b0 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20  is SELECT */.   
2d4c0 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20   int sortPTab = 
2d4d0 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61  0;   /* Pseudota
2d4e0 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f  ble used to deco
2d4f0 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c  de sorting resul
2d500 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  ts */.    int so
2d510 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a  rtOut = 0;    /*
2d520 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   Output register
2d530 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72   from the sorter
2d540 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65   */.    int orde
2d550 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54  rByGrp = 0; /* T
2d560 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50  rue if the GROUP
2d570 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59   BY and ORDER BY
2d580 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f   are the same */
2d590 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
2d5a0 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
2d5b0 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
2d5c0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
2d5d0 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
2d5e0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
2d5f0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
2d600 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
2d610 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2d620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2d630 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
2d640 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2d650 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
2d660 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
2d670 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
2d680 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
2d690 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
2d6a0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
2d6b0 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
2d6c0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
2d6d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
2d6e0 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
2d6f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
2d700 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
2d710 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
2d720 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
2d730 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
2d740 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
2d750 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
2d760 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2d770 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30  p->nSelectRow>10
2d780 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  0 ) p->nSelectRo
2d790 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c  w = 100;.    }el
2d7a0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  se{.      p->nSe
2d7b0 6c 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  lectRow = 1;.   
2d7c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2d7d0 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
2d7e0 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
2d7f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2d800 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a  d they are.    *
2d810 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
2d820 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  n it may be poss
2d830 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20  ible to disable 
2d840 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2d850 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  use .    ** on t
2d860 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20  he grounds that 
2d870 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c  the GROUP BY wil
2d880 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73  l cause elements
2d890 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20   to come out .  
2d8a0 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72    ** in the corr
2d8b0 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c  ect order. It al
2d8c0 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65  so may not - the
2d8d0 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20   GROUP BY might 
2d8e0 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74  use a.    ** dat
2d8f0 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74  abase index that
2d900 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20   causes rows to 
2d910 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  be grouped toget
2d920 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a  her as required.
2d930 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61      ** but not a
2d940 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20  ctually sorted. 
2d950 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f  Either way, reco
2d960 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
2d970 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45   the.    ** ORDE
2d980 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42  R BY and GROUP B
2d990 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68  Y clauses are th
2d9a0 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e  e same by settin
2d9b0 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70  g the orderByGrp
2d9c0 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
2d9d0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  .  */.    if( sq
2d9e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2d9f0 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73  pare(pGroupBy, s
2da00 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d  Sort.pOrderBy, -
2da10 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  1)==0 ){.      o
2da20 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20  rderByGrp = 1;. 
2da30 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72     }. .    /* Cr
2da40 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20  eate a label to 
2da50 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20  jump to when we 
2da60 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68  want to abort th
2da70 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61  e query */.    a
2da80 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
2da90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2daa0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
2dab0 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
2dac0 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
2dad0 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
2dae0 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
2daf0 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
2db00 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
2db10 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
2db20 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
2db30 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
2db40 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
2db50 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
2db60 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
2db70 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
2db80 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
2db90 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
2dba0 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
2dbb0 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
2dbc0 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
2dbd0 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mnReg = pParse->
2dbe0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67  nMem+1;.    sAgg
2dbf0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
2dc00 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
2dc10 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2dc20 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
2dc30 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
2dc40 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
2dc50 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2dc60 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
2dc70 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
2dc80 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2dc90 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70  st(&sNC, sSort.p
2dca0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
2dcb0 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
2dcc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2dcd0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2dce0 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
2dcf0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2dd00 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
2dd10 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
2dd20 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
2dd30 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
2dd40 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
2dd50 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2dd60 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f  roperty(sAggInfo
2dd70 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c  .aFunc[i].pExpr,
2dd80 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2dd90 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
2dda0 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46  ags |= NC_InAggF
2ddb0 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
2ddc0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2ddd0 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
2dde0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
2ddf0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
2de00 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
2de10 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63  &= ~NC_InAggFunc
2de20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
2de30 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61  Info.mxReg = pPa
2de40 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
2de50 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2de60 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
2de70 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50  t_end;..    /* P
2de80 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
2de90 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
2dea0 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
2deb0 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
2dec0 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
2ded0 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
2dee0 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
2def0 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
2df00 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2df10 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
2df20 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
2df30 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
2df40 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
2df50 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
2df60 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20        int j1;   
2df70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
2df80 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
2df90 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
2dfa0 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
2dfb0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
2dfc0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
2dfd0 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
2dfe0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
2dff0 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
2e000 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
2e010 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
2e020 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
2e030 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2e040 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
2e050 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
2e060 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
2e070 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2e080 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
2e090 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
2e0a0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
2e0b0 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
2e0c0 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
2e0d0 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
2e0e0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
2e0f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2e100 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
2e110 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
2e120 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
2e130 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
2e140 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
2e150 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2e160 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
2e170 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
2e180 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
2e190 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
2e1a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2e1b0 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
2e1c0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
2e1d0 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
2e1e0 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
2e1f0 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
2e200 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
2e210 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
2e220 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
2e230 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
2e240 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f  r all, the OP_So
2e250 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63  rterOpen instruc
2e260 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
2e270 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
2e280 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
2e290 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
2e2a0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2e2b0 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
2e2c0 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
2e2d0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2e2e0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2e2f0 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41   pGroupBy, 0, sA
2e300 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b  ggInfo.nColumn);
2e310 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
2e320 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
2e330 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2e340 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
2e350 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2e360 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
2e370 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
2e380 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
2e390 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
2e3a0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
2e3b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
2e3c0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
2e3d0 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
2e3e0 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
2e3f0 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
2e400 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
2e410 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
2e420 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
2e430 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
2e440 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2e450 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
2e460 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2e470 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
2e480 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
2e490 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2e4a0 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
2e4b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2e4c0 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
2e4d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2e4e0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
2e4f0 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
2e500 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
2e510 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2e520 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2e530 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
2e540 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
2e550 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2e560 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
2e570 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
2e580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e590 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2e5a0 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
2e5b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2e5c0 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
2e5d0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2e5e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e5f0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2e600 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
2e610 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2e620 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
2e630 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
2e640 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
2e650 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2e660 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
2e670 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
2e680 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
2e690 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
2e6a0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
2e6b0 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
2e6c0 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
2e6d0 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
2e6e0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
2e6f0 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
2e700 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
2e710 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
2e720 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
2e730 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
2e740 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
2e750 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
2e760 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
2e770 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
2e780 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
2e790 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
2e7a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2e7b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e7c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2e7d0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
2e7e0 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  t);.      pWInfo
2e7f0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2e800 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2e810 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
2e820 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20  GroupBy, 0,.    
2e830 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55        WHERE_GROU
2e840 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72  PBY | (orderByGr
2e850 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59  p ? WHERE_SORTBY
2e860 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20  GROUP : 0), 0.  
2e870 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
2e880 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
2e890 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2e8a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2e8b0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2e8c0 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d  Info)==pGroupBy-
2e8d0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
2e8e0 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
2e8f0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
2e900 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
2e910 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
2e920 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
2e930 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
2e940 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
2e950 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
2e960 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
2e970 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
2e980 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
2e990 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
2e9a0 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
2e9b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
2e9c0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
2e9d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e9e0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
2e9f0 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
2ea00 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
2ea10 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
2ea20 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
2ea30 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
2ea40 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
2ea50 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
2ea60 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
2ea70 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
2ea80 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
2ea90 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
2eaa0 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
2eab0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
2eac0 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
2ead0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
2eae0 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
2eaf0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
2eb00 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
2eb10 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
2eb20 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
2eb30 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
2eb40 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
2eb50 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e          (sDistin
2eb60 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d  ct.isTnct && (p-
2eb70 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
2eb80 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20  tinct)==0) ?.   
2eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eba0 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47   "DISTINCT" : "G
2ebb0 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
2ebc0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
2ebd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
2ebe0 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
2ebf0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
2ec00 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
2ec10 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
2ec20 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
2ec30 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
2ec40 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
2ec50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2ec60 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
2ec70 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ].iSorterColumn>
2ec80 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
2ec90 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
2eca0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2ecb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ecc0 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
2ecd0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2ece0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, 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 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2ed10 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2ed20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2ed30 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
2ed40 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
2ed50 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20  egBase, 0, 0);. 
2ed60 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
2ed70 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
2ed80 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
2ed90 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
2eda0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2edb0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
2edc0 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
2edd0 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
2ede0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
2edf0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
2ee00 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2ee10 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65  r1 = j + regBase
2ee20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
2ee30 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20  t r2;..         
2ee40 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
2ee50 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
2ee60 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
2ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee80 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
2ee90 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75  Tab, pCol->iColu
2eea0 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  mn, pCol->iTable
2eeb0 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , r1, 0);.      
2eec0 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72 32        if( r1!=r2
2eed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2eee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2eef0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
2ef00 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   r2, r1);.      
2ef10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ef20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
2ef30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2ef40 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64         regRecord
2ef50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2ef60 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2ef70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ef80 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
2ef90 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
2efa0 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f  e, nCol, regReco
2efb0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
2efc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2efd0 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
2efe0 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
2eff0 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
2f000 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2f010 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2f020 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
2f030 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2f040 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2f050 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
2f060 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
2f070 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2f080 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
2f090 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2f0a0 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d  sortingIdxPTab =
2f0b0 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72   sortPTab = pPar
2f0c0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2f0d0 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71      sortOut = sq
2f0e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2f0f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
2f100 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f110 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
2f120 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73  udo, sortPTab, s
2f130 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20  ortOut, nCol);. 
2f140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2f150 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2f160 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49  orterSort, sAggI
2f170 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2f180 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
2f190 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2f1a0 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74  , "GROUP BY sort
2f1b0 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ")); VdbeCoverag
2f1c0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41  e(v);.        sA
2f1d0 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
2f1e0 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
2f1f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2f200 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2f210 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ..      }..     
2f220 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
2f230 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61   or temporary ta
2f240 62 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ble used by the 
2f250 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20  GROUP BY sort.  
2f260 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75      ** will natu
2f270 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f  rally deliver ro
2f280 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ws in the order 
2f290 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
2f2a0 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a  ORDER BY.      *
2f2b0 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c  * clause, cancel
2f2c0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
2f2d0 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20  able open coded 
2f2e0 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a  earlier..      *
2f2f0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
2f300 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2f310 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74  on - the correct
2f320 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72   answer should r
2f330 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73  esult regardless
2f340 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74  ..      ** Use t
2f350 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  he SQLITE_GroupB
2f360 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68  yOrder flag with
2f370 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2f380 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20  _OPTIMIZER to . 
2f390 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
2f3a0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
2f3b0 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  n for testing pu
2f3c0 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20  rposes.  */.    
2f3d0 20 20 69 66 28 20 6f 72 64 65 72 42 79 47 72 70    if( orderByGrp
2f3e0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
2f3f0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
2f400 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29  TE_GroupByOrder)
2f410 20 0a 20 20 20 20 20 20 20 26 26 20 28 67 72 6f   .       && (gro
2f420 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69  upBySort || sqli
2f430 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64  te3WhereIsSorted
2f440 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20  (pWInfo)).      
2f450 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
2f460 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
2f470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2f480 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
2f490 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
2f4a0 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a  Index);.      }.
2f4b0 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
2f4c0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
2f4d0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
2f4e0 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
2f4f0 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
2f500 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
2f510 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
2f520 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
2f530 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
2f540 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
2f550 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
2f560 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
2f570 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
2f580 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
2f590 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
2f5a0 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
2f5b0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
2f5c0 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
2f5d0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
2f5e0 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
2f5f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2f600 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
2f610 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2f620 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
2f630 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
2f640 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f650 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2f660 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
2f670 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2f680 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
2f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2f6a0 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62  ortOut, sortPTab
2f6b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f6c0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
2f6d0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
2f6e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
2f6f0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
2f700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f710 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2f720 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62  Column, sortPTab
2f730 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
2f740 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2f750 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2f760 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
2f770 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2f780 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2f790 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
2f7a0 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
2f7b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f7c0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2f7d0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2f7e0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
2f7f0 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
2f800 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
2f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f820 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
2f830 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
2f840 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
2f850 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
2f860 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2f870 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2f880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f890 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
2f8a0 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20  j1+1, 0, j1+1); 
2f8b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2f8c0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
2f8d0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
2f8e0 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
2f8f0 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
2f900 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
2f910 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
2f920 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
2f930 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
2f940 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
2f950 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
2f960 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
2f970 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
2f980 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
2f990 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
2f9a0 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
2f9b0 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
2f9c0 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
2f9d0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
2f9e0 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
2f9f0 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
2fa00 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
2fa10 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
2fa20 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
2fa30 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
2fa40 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
2fa50 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
2fa60 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
2fa70 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
2fa80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2fa90 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
2faa0 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
2fab0 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
2fac0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      s
2fad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2fae0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2faf0 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
2fb00 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2fb10 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2fb20 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
2fb30 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
2fb40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fb50 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
2fb60 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
2fb70 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2fb80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2fb90 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
2fba0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
2fbb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fbc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2fbd0 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
2fbe0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
2fbf0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2fc00 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
2fc10 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
2fc20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
2fc30 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2fc40 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
2fc50 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
2fc60 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
2fc70 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
2fc80 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2fc90 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
2fca0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
2fcb0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2fcc0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2fcd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fce0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2fcf0 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
2fd00 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2fd10 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
2fd20 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
2fd30 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
2fd40 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
2fd50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2fd60 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
2fd70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2fd80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2fd90 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
2fda0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2fdb0 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
2fdc0 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  p);.        Vdbe
2fdd0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2fde0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fdf0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2fe00 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2fe10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2fe20 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
2fe30 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
2fe40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2fe50 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
2fe60 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
2fe70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2fe80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2fe90 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2fea0 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
2feb0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2fec0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2fed0 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
2fee0 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
2fef0 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
2ff00 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
2ff10 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2ff20 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
2ff30 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  drEnd);..      /
2ff40 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
2ff50 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
2ff60 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
2ff70 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
2ff80 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
2ff90 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
2ffa0 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
2ffb0 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
2ffc0 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
2ffd0 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
2ffe0 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
2fff0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
30000 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
30010 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
30020 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
30030 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
30040 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
30050 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
30060 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
30070 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
30080 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
30090 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
300a0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
300b0 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
300c0 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
300d0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
300e0 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
300f0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
30100 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
30110 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
30120 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
30130 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
30140 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
30150 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
30160 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
30170 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
30180 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
30190 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
301a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
301b0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
301c0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
301d0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
301e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
301f0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
30200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30210 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
30220 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
30230 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
30240 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
30250 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
30260 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
30270 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
30280 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
30290 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
302a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
302b0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
302c0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66  putRow);.      f
302d0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
302e0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
302f0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
30300 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
30310 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
30320 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
30330 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
30340 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
30350 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
30360 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
30370 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20  t, -1, &sSort,. 
30380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30390 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c       &sDistinct,
303a0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
303b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
303c0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
303d0 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
303e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
303f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
30400 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
30410 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
30420 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
30430 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
30440 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
30450 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
30460 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
30470 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
30480 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
30490 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
304a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
304b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
304c0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
304d0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
304e0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
304f0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
30500 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
30510 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
30520 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
30530 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
30540 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
30550 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
30560 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
30570 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
30580 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
30590 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
305a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
305b0 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
305c0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
305d0 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
305e0 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
305f0 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
30600 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
30610 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
30620 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
30630 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
30640 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
30650 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
30660 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
30670 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
30680 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
30690 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
306a0 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
306b0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
306c0 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
306d0 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
306e0 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
306f0 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
30700 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30710 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
30720 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
30730 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
30740 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
30750 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
30760 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
30770 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
30780 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
30790 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
307a0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
307b0 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
307c0 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
307d0 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
307e0 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
307f0 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
30800 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
30810 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
30820 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
30830 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
30840 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
30850 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
30860 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
30870 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
30880 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30890 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
308a0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
308b0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
308c0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
308d0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
308e0 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
308f0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
30900 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
30910 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
30920 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
30930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30940 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
30950 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
30960 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
30970 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
30980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
30990 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
309a0 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
309b0 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
309c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
309d0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
309e0 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
309f0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
30a00 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
30a10 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
30a20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
30a30 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
30a40 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
30a50 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
30a60 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
30a70 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
30a80 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
30a90 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
30aa0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
30ab0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
30ac0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
30ad0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
30ae0 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61  s the lowest sca
30af0 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20  n cost..        
30b00 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
30b10 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
30b20 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
30b30 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
30b40 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
30b50 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
30b60 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f  013-10-03) Do no
30b70 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72  t count the entr
30b80 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c  ies in a partial
30b90 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
30ba0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
30bb0 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
30bc0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
30bd0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
30be0 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
30bf0 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
30c00 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
30c10 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
30c20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
30c30 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
30c40 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69  ) ) pBest = sqli
30c50 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
30c60 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
30c70 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
30c80 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
30c90 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
30ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
30cb0 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
30cc0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
30cd0 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  & pIdx->szIdxRow
30ce0 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a  <pTab->szTabRow.
30cf0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
30d00 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
30d10 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
30d20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49  && (!pBest || pI
30d30 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65  dx->szIdxRow<pBe
30d40 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20  st->szIdxRow).  
30d50 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
30d60 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
30d70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Idx;.          }
30d80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30d90 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a     if( pBest ){.
30da0 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20            iRoot 
30db0 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20  = pBest->tnum;. 
30dc0 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
30dd0 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
30de0 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
30df0 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
30e00 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
30e10 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
30e20 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
30e30 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
30e40 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
30e50 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
30e60 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
30e70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
30e80 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44   iCsr, iRoot, iD
30e90 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 1);.        i
30ea0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
30eb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30ec0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
30ed0 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  -1, (char *)pKey
30ee0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
30ef0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30f00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30f10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
30f20 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e  nt, iCsr, sAggIn
30f30 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d  fo.aFunc[0].iMem
30f40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
30f50 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
30f60 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b  OP_Close, iCsr);
30f70 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
30f80 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72  SimpleCount(pPar
30f90 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29  se, pTab, pBest)
30fa0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
30fb0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
30fc0 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
30fd0 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
30fe0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
30ff0 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e  e query is of on
31000 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
31010 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20  ng forms:.      
31020 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
31030 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20    SELECT min(x) 
31040 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
31050 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
31060 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
31070 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31080 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
31090 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
310a0 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
310b0 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
310c0 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ults.        ** 
310d0 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  as if there was 
310e0 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20  an "ORDER ON x" 
310f0 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44  or "ORDER ON x D
31100 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20  ESC" clause. .  
31110 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72        ** If wher
31120 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70  e.c is able to p
31130 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73  roduce results s
31140 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72  orted in this or
31150 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  der, then.      
31160 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f    ** add vdbe co
31170 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  de to break out 
31180 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
31190 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65  g loop after the
311a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72   .        ** fir
311b0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
311c0 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
311d0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
311e0 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20  oop is .        
311f0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
31200 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
31210 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e  row with the min
31220 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20  imum or maximum 
31230 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
31240 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
31250 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
31260 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31270 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
31280 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
31290 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
312a0 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
312b0 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a  ightly.        *
312c0 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f  * modify behavio
312d0 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  r as follows:.  
312e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
312f0 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71   **   + If the q
31300 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43  uery is a "SELEC
31310 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20  T min(x)", then 
31320 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62  the loop coded b
31330 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  y.        **    
31340 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20   where.c should 
31350 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72  not iterate over
31360 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68   any values with
31370 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20   a NULL value.  
31380 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72        **     for
31390 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20   x..        **. 
313a0 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68         **   + Th
313b0 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65  e optimizer code
313c0 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65   in where.c (the
313d0 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69   thing that deci
313e0 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  des which.      
313f0 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f    **     index o
31400 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65  r indices to use
31410 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61  ) should place a
31420 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72   different prior
31430 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20  ity on .        
31440 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e  **     satisfyin
31450 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27  g the 'ORDER BY'
31460 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20   clause than it 
31470 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61  does in other ca
31480 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ses..        ** 
31490 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64      Refer to cod
314a0 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69  e and comments i
314b0 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65  n where.c for de
314c0 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  tails..        *
314d0 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
314e0 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b  st *pMinMax = 0;
314f0 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67  .        u8 flag
31500 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
31510 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20  _NORMAL;.       
31520 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
31530 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
31540 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
31550 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20  rt( flag==0 );. 
31560 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48         if( p->pH
31570 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20  aving==0 ){.    
31580 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e        flag = min
31590 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e  MaxQuery(&sAggIn
315a0 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20  fo, &pMinMax);. 
315b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
315c0 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
315d0 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20   || (pMinMax!=0 
315e0 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  && pMinMax->nExp
315f0 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20  r==1) );..      
31600 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20    if( flag ){.  
31610 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20          pMinMax 
31620 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
31630 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78  tDup(db, pMinMax
31640 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
31650 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a  pDel = pMinMax;.
31660 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
31670 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61  inMax && !db->ma
31680 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
31690 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
316a0 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  x->a[0].sortOrde
316b0 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f  r = flag!=WHERE_
316c0 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30  ORDERBY_MIN ?1:0
316d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
316e0 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70  inMax->a[0].pExp
316f0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
31700 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  N;.          }. 
31710 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
31720 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
31730 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
31740 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
31750 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
31760 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
31770 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
31780 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
31790 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
317a0 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
317b0 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
317c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
317d0 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
317e0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
317f0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
31800 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
31810 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
31820 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
31830 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c  here, pMinMax,0,
31840 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20  flag,0);.       
31850 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
31860 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
31870 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
31880 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
31890 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
318a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
318b0 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  }.        update
318c0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
318d0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
318e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
318f0 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d  pMinMax==0 || pM
31900 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20  inMax->nExpr==1 
31910 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
31920 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
31930 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29  ered(pWInfo)>0 )
31940 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
31950 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73  te3VdbeGoto(v, s
31960 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
31970 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
31980 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
31990 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20  mment((v, "%s() 
319a0 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20  by index",.     
319b0 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
319c0 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
319d0 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
319e0 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
319f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
31a00 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
31a10 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41         finalizeA
31a20 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
31a30 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
31a40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
31a50 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
31a60 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
31a70 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
31a80 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
31a90 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
31aa0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
31ab0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
31ac0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
31ad0 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  List, -1, 0, 0, 
31ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31af0 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64         pDest, ad
31b00 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b  drEnd, addrEnd);
31b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
31b20 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
31b30 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pDel);.    }.  
31b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
31b50 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
31b60 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
31b70 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
31b80 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  te query */..  i
31b90 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e  f( sDistinct.eTn
31ba0 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
31bb0 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
31bc0 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
31bd0 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
31be0 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20   "DISTINCT");.  
31bf0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
31c00 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
31c10 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
31c20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
31c30 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
31c40 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
31c50 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
31c60 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
31c70 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
31c80 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  y ){.    explain
31c90 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
31ca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31cb0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42         sSort.nOB
31cc0 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50  Sat>0 ? "RIGHT P
31cd0 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22  ART OF ORDER BY"
31ce0 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20  :"ORDER BY");.  
31cf0 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
31d00 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73  il(pParse, p, &s
31d10 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Sort, pEList->nE
31d20 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
31d30 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
31d40 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
31d50 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
31d60 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
31d70 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
31d80 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68 61  /* The SELECT ha
31d90 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66  s been coded. If
31da0 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
31db0 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20  or in the Parse 
31dc0 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20  structure,.  ** 
31dd0 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
31de0 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77  ode to 1. Otherw
31df0 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d  ise 0. */.  rc =
31e00 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30   (pParse->nErr>0
31e10 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  );..  /* Control
31e20 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
31e30 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
31e40 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
31e50 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
31e60 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
31e70 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
31e80 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
31e90 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
31ea0 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
31eb0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
31ec0 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20  electId);..  /* 
31ed0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
31ee0 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73  names if results
31ef0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61   of the SELECT a
31f00 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  re to be output.
31f10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
31f20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65  SQLITE_OK && pDe
31f30 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
31f40 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
31f50 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
31f60 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
31f70 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
31f80 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
31f90 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
31fa0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
31fb0 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
31fc0 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45  o.aFunc);.#if SE
31fd0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
31fe0 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  D.  SELECTTRACE(
31ff0 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64  1,pParse,p,("end
32000 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29   processing\n"))
32010 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c  ;.  pParse->nSel
32020 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e  ectIndent--;.#en
32030 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
32040 0a 7d 0a                                         .}.